{"version":3,"file":"static/js/32.342dcf4e5b7a33d9187d.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/absolute-header/components/logo.tsx?271f","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-header/components/nav-icon.tsx?94f8","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-header/components/absolute-header-preferred-store.tsx?7f59","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-header/absolute-header.tsx?d419","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-header/absolute-header.view.tsx?d826","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/utilities.ts?e024","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/choice-summary.tsx?67cf","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/error-message.tsx?bde3","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/feature-search-result-item.tsx?fb7c","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/link.tsx?840a","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/modal.tsx?d39b","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/product-search-result-items.tsx?eeb6","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/range-refine-item.tsx?7904","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/refine-item.tsx?df8d","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/refine-submenu.tsx?0164","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/separator.tsx?30e0","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/components/title.tsx?1b1f","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/absolute-search-result-container.props.autogenerated.ts?fed2","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/absolute-search-result-container.tsx?c18a","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-search-result-container/absolute-search-result-container.view.tsx?b98a","webpack://Msdyn365.Commerce.Online/./src/modules/base-header-2023/components/base-header-2023-preferred-store.tsx?073b","webpack://Msdyn365.Commerce.Online/./src/modules/base-header-2023/components/logo.tsx?617d","webpack://Msdyn365.Commerce.Online/./src/modules/base-header-2023/components/nav-icon.tsx?cdaa","webpack://Msdyn365.Commerce.Online/./src/modules/base-header-2023/base-header-2023.tsx?428b","webpack://Msdyn365.Commerce.Online/./src/modules/base-header-2023/base-header-2023.view.tsx?9fe7","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header-2023/components/connellyb2b-header-2023-preferred-store.tsx?e772","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header-2023/components/logo.tsx?885b","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header-2023/components/nav-icon.tsx?f3ab","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header-2023/connellyb2b-header-2023.tsx?cc9b","webpack://Msdyn365.Commerce.Online/./src/modules/connellyb2b-header-2023/connellyb2b-header-2023.view.tsx?5de6","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2021/components/logo.tsx?b6c2","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2021/components/nav-icon.tsx?a294","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2021/components/obrien-header-2021-preferred-store.tsx?6d3d","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2021/obrien-header-2021.tsx?f1a7","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2021/obrien-header-2021.view.tsx?ece6","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2023/components/logo.tsx?b3a5","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2023/components/nav-icon.tsx?c6f6","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2023/components/obrien-header-2023-preferred-store.tsx?2143","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2023/obrien-header-2023.tsx?7f81","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-header-2023/obrien-header-2023.view.tsx?39e9","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/utilities.ts?dea3","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/choice-summary.tsx?3dee","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/error-message.tsx?fba6","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/feature-search-result-item.tsx?284b","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/link.tsx?2ac1","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/modal.tsx?ca9f","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/product-search-result-items.tsx?804a","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/range-refine-item.tsx?5c42","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/refine-item.tsx?331b","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/refine-submenu.tsx?5811","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/separator.tsx?b025","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/components/title.tsx?e205","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/obrien-search-result-container.props.autogenerated.ts?1471","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/obrien-search-result-container.tsx?da9e","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-search-result-container/obrien-search-result-container.view.tsx?384c","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://Msdyn365.Commerce.Online/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/add-to-list/add-to-cart-selected-items.tsx?de21","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-actions.tsx?ca97","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-drawer.tsx?8701","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-form.tsx?5cbb","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-product.ts?187e","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-header-component.tsx?69b3","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-row-component.tsx?cd92","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/quick-order-grid-table-component.tsx?7cbc","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/quick-order-grid.tsx?fddf","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/quick-order-grid.view.tsx?f941"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\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 { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class Logo extends React.PureComponent {\r\n\r\n private attributes?: Msdyn365.IDictionary;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n public render():JSX.Element {\r\n return(\r\n
\r\n {this._renderLogo(this.props)}\r\n
\r\n );\r\n }\r\n\r\n private _renderLogo(config: ILogoProps):JSX.Element {\r\n if(config.link && config.link.linkUrl.destinationUrl) {\r\n return(\r\n \r\n
\r\n \r\n \r\n );\r\n }\r\n return(\r\n this._renderImage(config)\r\n );\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default Logo;","/*---------------------------------------------------------------------------------------------\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 { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IAbsoluteHeaderResources } from '../absolute-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IAbsoluteHeaderResources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component {\r\n\r\n private attributes?: Msdyn365.IDictionary;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render():JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n}","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IAbsoluteHeaderData } from '../absolute-header.data';\r\nimport { IAbsoluteHeaderProps } from '../absolute-header.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component\r\n */\r\n@observer\r\nexport class HeaderPreferredStore extends React.PureComponent> {\r\n\r\n public handleClick = () => { return this._findPreferreStoreOnClick(this.props); };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n if (slots && slots.storeSelector && slots.storeSelector.length) {\r\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\r\n storeSelectorStateManager!.preferredStore.StoreName :\r\n resources.headerPreferredStoreText;\r\n\r\n return (\r\n
\r\n \r\n {slots.storeSelector}\r\n
\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async _findPreferreStoreOnClick(props: IAbsoluteHeaderProps): Promise {\r\n const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: false,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n }).catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n return;\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\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 {\r\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\r\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IAbsoluteHeaderData } from './absolute-header.data';\r\nimport { IAbsoluteHeaderProps, IAbsoluteHeaderResources, IMyAccountLinksData } from './absolute-header.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IAbsoluteHeaderProps, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n promoBanner: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass Header extends React.PureComponent, IHeaderState> {\r\n private popOverRef: React.RefObject;\r\n private telemetryContent: ITelemetryContent;\r\n @computed public get displayName(): Readonly {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n\r\n constructor(props: IAbsoluteHeaderProps) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation,\r\n cart: { result: cart },\r\n storeSelectorStateManager: {result: storeSelectorStateManager}\r\n },\r\n context: {\r\n request: {\r\n user\r\n }\r\n },\r\n context,\r\n resources: {\r\n cartLabel,\r\n cartQtyLabel\r\n }\r\n } = this.props;\r\n const { logoLink, logoImage } = this.props.config;\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('absoluteMenuBar');\r\n const promoBannerSlot = this._getSlot('absolutePromoBanner');\r\n const searchSlot = this._getSlot('search');\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IAbsoluteHeaderProps),\r\n ...(this.state),\r\n logo: ,\r\n wishListIconDesktop: (\r\n \r\n ),\r\n wishListIconMobile: (\r\n \r\n ),\r\n cartIcon: (cartIconSlot && cartIconSlot.length > 0)\r\n ? cartIconSlot[0]\r\n : cart && ,\r\n navIcon: ,\r\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\r\n promoBanner: promoBannerSlot && promoBannerSlot.length && promoBannerSlot || [],\r\n search: searchSlot && searchSlot.length && searchSlot || [],\r\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('padding-20-lr always-flex justify')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal'\r\n },\r\n MobileMenuHeader: (\r\n \r\n ),\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body',\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links',\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: 'ms-header__account-info'\r\n },\r\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover,\r\n } || undefined,\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: preferredStoreSlot\r\n && preferredStoreSlot.length\r\n && storeSelectorStateManager\r\n && ()\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /* Handle link text change*/\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\r\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\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 _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IAbsoluteHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return !customer && (\r\n \r\n {resources.signInLinkText}\r\n \r\n );\r\n }\r\n\r\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IAbsoluteHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n \r\n {resources.signOutLinkText}\r\n \r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n \r\n {this.displayName}\r\n \r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if(!customer || ! this.displayName || !myAccountLinks || !myAccountLinks.length) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n \r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;","/*---------------------------------------------------------------------------------------------\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\n\r\nimport { Collapse, Drawer, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, {useState} from 'react'\r\nimport classnames from 'classnames';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport { IHeaderViewProps } from './absolute-header';\r\n\r\n\r\nconst headerView: React.FC = props => {\r\n\r\n const [navigate,setNavigate] = useState(false);\r\n const changeBackground = () => { \r\n if(window.scrollY >= 44) {\r\n setNavigate(true)\r\n }else {\r\n setNavigate(false)\r\n }\r\n }\r\n if (typeof window !== `undefined`) {\r\n window.addEventListener('scroll', changeBackground);\r\n }\r\n\r\n\r\n\r\n const {\r\n //HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n //Divider\r\n } = props;\r\n return (\r\n
\r\n
\r\n
\r\n
{_renderReactFragment(props.promoBanner)}
\r\n
{_renderDesktopAccountBlock(props)}
\r\n
\r\n
\r\n \r\n \r\n\r\n {/* This is the area that is majorly revamped. Subtract components as needed. */}\r\n\r\n
\r\n
\r\n {props.logo}\r\n
\r\n\r\n
\r\n {props.navIcon}\r\n {_renderReactFragment(props.menuBar)}\r\n
\r\n
\r\n \r\n
\r\n {_renderReactFragment(props.search)}\r\n { /*props.wishListIconDesktop */}\r\n {props.cartIcon}\r\n {_renderReactFragment(props.siteOptions)}\r\n
\r\n\r\n \r\n
\r\n {_renderCollapseMenu(props)}\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n \r\n \r\n {_renderReactFragment(props.search)}\r\n {_renderReactFragment(props.menuBar)}\r\n {_renderMobileAccountBlock(props, true)}\r\n {props.wishListIconMobile}\r\n \r\n\r\n\r\n \r\n );\r\n}\r\n\r\nconst renderCustomerName = (accountInformation: AsyncResult): React.ReactChild => {\r\n const customer = accountInformation && accountInformation.result;\r\n return (\r\n <>{customer && customer.FirstName}\r\n );\r\n};\r\n\r\nfunction _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n signOutLink,\r\n signInLink,\r\n data,\r\n accountLinks } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames('ms-header__drawer', AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n\r\n if (accountLinks) {\r\n return (\r\n \r\n
\r\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\r\n {signOutLink}\r\n
\r\n
\r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n \r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return {slot};\r\n })\r\n : null}\r\n \r\n );\r\n}\r\n\r\nexport default headerView;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer;\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ProductListInventoryFilteringOptions } from '../actions';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\r\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && label && \r\n {label}\r\n }\r\n
    \r\n {items.map((item: IRefinerMap) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && \r\n {clearAllText}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\r\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
\r\n {' '}\r\n {text}\r\n {' '}\r\n
\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IAbsoluteSearchResultContainerResources } from '../absolute-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IAbsoluteSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading = recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.Name, fallbackImage, context.actionContext.requestContext)}\r\n
\r\n \r\n
\r\n

\r\n {heading}\r\n

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string,\r\n altText?: string, fallbackImage?: string, context?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return (

\r\n {title}\r\n

);\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n {' '}\r\n {text}\r\n {' '}\r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n {text}\r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n {props.resources.modalTitle}\r\n \r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IAbsoluteSearchResultContainerResources } from '../absolute-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IAbsoluteSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nexport function getInventoryLabel(\r\n channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId)}\r\n />\r\n
  • \r\n ))}\r\n
\r\n );\r\n\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n // minValueSliderThumbAriaLabel?: string;\r\n // maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\r\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps,\r\n nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\r\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return ([\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]);\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return ([\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n // ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n // ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n // ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n // ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]);\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { \r\n //isDisabled, \r\n //parentProductRefinerHierarchy, \r\n refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n //const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n // const formAttrs = {\r\n // 'aria-label': rangeAriaLabel,\r\n // 'aria-disabled': isDisabled\r\n // };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin &&\r\n \r\n {validationErrorMin}\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n \r\n {validationErrorMax}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { \r\n //isDisabled, \r\n sliderKey } = this.props;\r\n // const ariaAttributes = {\r\n // 'aria-disabled': isDisabled\r\n // };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps,\r\n nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(productRefinerValue, parentProductRefinerHierarchy, isChecked, context, index, telemetryContent,\r\n productCountAriaLabel, singleProductCountAriaLabel);\r\n\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText) : '';\r\n } else {\r\n refineMenuItemAriaLabel =\r\n refineItemsAriaLabel ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount) : '';\r\n }\r\n return (\r\n
  • \r\n \r\n {this._renderSwatch()}\r\n \r\n \r\n
  • \r\n );\r\n\r\n }\r\n\r\n private _renderSwatch(): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasValidSwatch = hasColor || hasImage;\r\n const shouldDisplayAsSwatch = hasValidSwatch && checkIfShouldDisplayAsSwatch(\r\n dimensionType, this.props.context as ICoreContext);\r\n const swatchItems = shouldDisplayAsSwatch ? [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ] : undefined;\r\n\r\n if (!swatchItems) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n };\r\n\r\n private _renderRating(productRefinerValue: ProductRefinerValue, parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean, context: ICoreContext, index?: number, telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string, ratingSingleUserCountAriaLabel?: string): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue = (productRefinerValue.Count !== undefined &&\r\n productRefinerValue.Count === defaultChkProductCount) ? (ratingSingleUserCountAriaLabel &&\r\n format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)) : (ratingUserCountAriaLabel &&\r\n format(ratingUserCountAriaLabel, productRefinerValue.Count));\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n // minValueSliderThumbAriaLabel?: string;\r\n // maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps,\r\n nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if ((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context,\r\n productCountAriaLabel, singleProductCountAriaLabel, refineItemAriaLabel, refineItemsAriaLabel, isMobile } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n
      \r\n {listItems}\r\n
    \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, \r\n //minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel \r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return (
      \r\n {listItems}\r\n
    );\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => (\r\n {' '}\r\n {separator}\r\n {' '}\r\n);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => (\r\n {' '}\r\n {text}\r\n {' '}\r\n);\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IAbsoluteSearchResultContainer containerModule 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 expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IAbsoluteSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n newTitle?: INewTitleData;\r\n content?: Msdyn365.RichText;\r\n}\r\n\r\nexport interface IAbsoluteSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n}\r\n\r\nexport const enum NewTitleTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface INewTitleData {\r\n text: string;\r\n tag?: NewTitleTag;\r\n}\r\n\r\nexport interface IAbsoluteSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IAbsoluteSearchResultContainerResources;\r\n config: IAbsoluteSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy, IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\n// Nick's content\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice, ProductRefinerValue, SortColumn,\r\n TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, DimensionAvailabilitiesForProductSearchResultInput, DimensionTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction, getPriceForProductSearchResult,\r\n IDimensionsApp, PriceForProductSearchResultInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps,\r\n INodeProps, isMobile, ITelemetryContent, LabeledDropdown, UncontrolledPagination, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { buildListPageUrl, getCollectionProducts, getCollectionRefinersAction, getCurrentUrl,\r\n GetFullProductsByCollectionInput, parseQueryParam, ProductListInventoryFilteringOptions, RefinersByCollectionInput, sortOptions } from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,\r\n Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IAbsoluteSearchResultContainerData } from './absolute-search-result-container.data';\r\nimport { expandRefinersCount, IAbsoluteSearchResultContainerProps } from './absolute-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IAbsoluteSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n content?: string;\r\n newTitle?: React.ReactNode;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container.\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n refiners: IProductRefinerHierarchy[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm');\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize = 'lg';\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n public constructor(props: IAbsoluteSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: []\r\n };\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n\r\n // Initalization of list page\r\n // eslint-disable-next-line max-len -- existing code\r\n /* eslint-disable @typescript-eslint/no-floating-promises, promise/catch-or-return, promise/always-return, promise/prefer-await-to-then -- existing code */\r\n this.props.data.products.then((products) => {\r\n this.props.data.listPageState.then((listPageState) => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing, max-len -- existing code\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n // eslint-disable-next-line max-len -- existing code\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n // eslint-disable-next-line max-len -- existing code\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : JSON.stringify({ ProductId: this.props.context.request.query?.productId, Recommendation: this.props.context.request.query?.recommendation }),\r\n !!(this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes),\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\r\n }\r\n });\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber)),\r\n this.defaultPageNumber)\r\n },\r\n count: true, Sorting: listPageState.sortingCritera ?? {}\r\n },\r\n listPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.itemId ?? 0),\r\n this.props.context.request.query?.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId\r\n );\r\n\r\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext).then((refiners) => {\r\n this.setState({ refiners });\r\n }).catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n }\r\n );\r\n\r\n });\r\n });\r\n // eslint-disable-next-line max-len -- existing code\r\n /* eslint-enable @typescript-eslint/no-floating-promises, promise/catch-or-return, promise/always-return, promise/prefer-await-to-then -- Existing code. */\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then((products) => {\r\n this.props.data.listPageState.then((listPageStateFeature) => {\r\n listPageStateFeature.featureProduct = products;\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation?.Text;\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\r\n }\r\n\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) && !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) && !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { \r\n imageSettings, \r\n className, \r\n content,\r\n newTitle \r\n } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n // Nick's Content\r\n const Content = content && (\r\n \r\n );\r\n\r\n const NewTitle = newTitle && (\r\n
    \r\n \r\n
    \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n // eslint-disable-next-line max-len -- existing code\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown() : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ab-product__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n \r\n ),\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n // eslint-disable-next-line max-len -- existing code\r\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n // Nick's Content\r\n content: Content,\r\n newTitle: NewTitle\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n // Nick's content\r\n public handleParagraphChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.content! = event.target.value;\r\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.newTitle!.text = event.target.value;\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext),\r\n this.props.context.actionContext);\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext);\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal(\r\n {\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdownOptions = this._getAllSortByOptions();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdownOptions = dropdownOptions.filter((dropdownOption) => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\r\n }\r\n\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />);\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n // eslint-disable-next-line max-len -- existing code\r\n const skipCount = listPageState && listPageState.currentPageNumber !== null ? (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) : ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />);\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners) ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n }) : data.refiners.result && data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n // minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n // maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n\r\n };\r\n\r\n /**\r\n * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n return this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId;\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n />\r\n );\r\n\r\n };\r\n\r\n private readonly _getProducts = (): JSX.Element => {\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={allowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewslot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n // eslint-disable-next-line max-len -- existing code\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves dropdown options.\r\n * @returns All dropdown options.\r\n */\r\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!searchConfiguration) {\r\n return [];\r\n }\r\n\r\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(\r\n mappedSearchConfig => searchConfiguration.find(item => mappedSearchConfig.key === item.key)\r\n );\r\n\r\n return ArrayExtensions.validValues(mappedSearchConfiguration);\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(mappedSearchConfig => mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n },\r\n 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>\r\n {paginationPreviousText}\r\n </span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>\r\n {paginationNextText}\r\n </span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './absolute-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct, content, newTitle } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <div className=\"ab-cat-header\">\r\n <div className='content-fixer'>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {newTitle ? (\r\n <>\r\n {newTitle}\r\n </>\r\n ) : (\r\n <>\r\n {renderTitle(TitleViewProps)}\r\n </>\r\n )}\r\n {content}\r\n </div>\r\n </div>\r\n <div className='flex-xs'>\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </div>\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n \r\n <Node {...RefineAndProductSectionContainer}>\r\n \r\n <Node {...ProductSectionContainer}>\r\n <div className=\"ab-cat-header\">\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n <div className='content-fixer'>\r\n {newTitle ? (\r\n <>\r\n {newTitle}\r\n </>\r\n ) : (\r\n <>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n </>\r\n )}\r\n {content}\r\n </div>\r\n </div>\r\n <div className='flex-xs'>\r\n {refineMenu && renderRefiner(refineMenu)}\r\n <div className='ab-results'>\r\n {choiceSummary}\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </div>\r\n </div>\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\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 { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IBaseHeader2023Data } from '../base-header-2023.data';\r\nimport { IBaseHeader2023Props } from '../base-header-2023.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component.\r\n */\r\n@observer\r\nexport class HeaderPreferredStore extends React.PureComponent<IBaseHeader2023Props<IBaseHeader2023Data>> {\r\n private readonly modalCloseButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\r\n\r\n /**\r\n * Handle click on the store selector.\r\n * @returns : Promise void.\r\n */\r\n public handleClick = () => {\r\n return this._findPreferredStoreOnClick(this.props);\r\n };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\r\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\r\n const storeName =\r\n storeSelectorStateManager?.preferredStore && storeSelectorStateManager.preferredStore.StoreName\r\n ? storeSelectorStateManager.preferredStore.StoreName\r\n : resources.headerPreferredStoreText;\r\n\r\n return (\r\n <div className='ms-header__preferred-store-container'>\r\n <button\r\n className='ms-header__preferred-store-btn msc-btn'\r\n color='secondary'\r\n aria-label={resources.headerPreferredStoreAriaLabel}\r\n onClick={this.handleClick}\r\n ref={this.modalCloseButtonRef}\r\n >\r\n <span className='ms-header__preferred-store-text'>{storeName}</span>\r\n </button>\r\n {slots.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async _findPreferredStoreOnClick(props: IBaseHeader2023Props<IBaseHeader2023Data>): Promise<void> {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n modules\r\n } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n await storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: true,\r\n parentElementRef: this.modalCloseButtonRef,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n })\r\n .catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n typeName?: string;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component.\r\n * @extends {React.PureComponent<ILogoConfig>}\r\n */\r\nexport class Logo extends React.PureComponent<ILogoProps> {\r\n private readonly attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render(): JSX.Element {\r\n return <div className={this.props.className}>{this._renderLogo(this.props)}</div>;\r\n }\r\n\r\n private _renderLogo(config: ILogoProps): JSX.Element {\r\n if (config.link && config.link.linkUrl.destinationUrl) {\r\n return (\r\n <a\r\n href={config.link.linkUrl.destinationUrl}\r\n aria-label={config.link.ariaLabel}\r\n target={config.link.openInNewTab ? '_blank' : undefined}\r\n rel='noopener noreferrer'\r\n {...this.attributes}\r\n >\r\n {this._renderImage(config)}\r\n </a>\r\n );\r\n }\r\n return this._renderImage(config);\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Msdyn365.Image\r\n {...config.image}\r\n requestContext={this.props.requestContext}\r\n gridSettings={this.props.gridSettings!}\r\n imageSettings={(config && config.image && config.image.imageSettings) || defaultImageSettings}\r\n loadFailureBehavior='default'\r\n editProps={{\r\n key: config.image || {},\r\n requestContext: this.props.requestContext,\r\n moduleType: this.props.typeName,\r\n imagePropertyName: 'image'\r\n }}\r\n shouldSkipToMainImage\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default Logo;\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IBaseHeader2023Resources } from '../base-header-2023.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IBaseHeader2023Resources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component.\r\n * @extends {React.PureComponent<INavIconProps>}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.PureComponent<INavIconProps> {\r\n private readonly attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <Button\r\n className='ms-header__nav-icon'\r\n onClick={this.props.toggleNavBar}\r\n title={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-expanded={this.props.isExpanded}\r\n aria-controls={this.props.targetId}\r\n {...this.attributes}\r\n />\r\n );\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 { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n KeyCodes,\r\n Modal,\r\n ModalBody,\r\n ModalHeader,\r\n onTelemetryClick,\r\n Popover,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IBaseHeader2023Data } from './base-header-2023.data';\r\nimport { IBaseHeader2023Props, IBaseHeader2023Resources, IMyAccountLinksData } from './base-header-2023.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n hasSigninerror?: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IBaseHeader2023Props<IBaseHeader2023Data>, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n switchCustomerLink?: React.ReactNode;\r\n isOBORequest?: boolean;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component.\r\n * @extends {React.PureComponent<IBaseHeader2023Props<IBaseHeader2023Data>>}\r\n */\r\n@observer\r\nclass Header extends React.PureComponent<IBaseHeader2023Props<IBaseHeader2023Data>, IHeaderState> {\r\n private readonly popOverRef: React.RefObject<HTMLButtonElement>;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private cart: ICartState | undefined;\r\n\r\n /**\r\n * The signed-in user name displayed in the header bar\r\n */\r\n @computed public get displayName(): Readonly<string | undefined> {\r\n const user = this.props.context.request.user;\r\n return user?.isOBORequest ? this.workerName : this.customerName;\r\n }\r\n\r\n /**\r\n * OBO scenario. The name of worker who shops on behalf of customer.\r\n */\r\n @computed public get workerName(): Readonly<string | undefined> {\r\n const user = this.props.context.request.user;\r\n return user?.firstName || user?.name;\r\n }\r\n\r\n @computed public get customerName(): Readonly<string | undefined> {\r\n const user = this.props.context.request.user;\r\n const customer = this.props.data.accountInformation?.result;\r\n if (user?.isOBORequest) {\r\n // For OBO scenario, display full customer name because multiple customers may have the same first name.\r\n return customer ? customer.Name : undefined;\r\n } else {\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n }\r\n\r\n public constructor(props: IBaseHeader2023Props<IBaseHeader2023Data>) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false,\r\n hasSigninerror: false\r\n };\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 }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n reaction(\r\n () => this.props.data.cart.result,\r\n () => {\r\n this.cart = this.props.data.cart.result;\r\n }\r\n );\r\n\r\n const {\r\n context: {\r\n request: { user }\r\n },\r\n resources: { signUpCustomerNotFoundTitle, signUpMultipleCustomerFoundTitle, closeNotificationLabel }\r\n } = this.props;\r\n\r\n const signinNotificationError = this._getSigninNotification(user, signUpMultipleCustomerFoundTitle, signUpCustomerNotFoundTitle);\r\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\r\n // For signup show simple error notification.\r\n NotificationsManager.instance().addNotification(new ErrorNotification(signinNotificationError, closeNotificationLabel));\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation, wishlists },\r\n context: {\r\n request: { user }\r\n },\r\n context,\r\n resources: { cartLabel, cartQtyLabel }\r\n } = this.props;\r\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\r\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\r\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\r\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('menuBar');\r\n const searchSlot = this._getSlot('search');\r\n let wishlistCount = 0;\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n if (wishlists !== undefined) {\r\n if (\r\n !wishlists.result ||\r\n !ArrayExtensions.hasElements(wishlists.result) ||\r\n !wishlists.result[0].CommerceListLines ||\r\n !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)\r\n ) {\r\n wishlistCount = 0;\r\n } else {\r\n wishlistCount = wishlists.result[0].CommerceListLines.length;\r\n }\r\n }\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IBaseHeader2023Props<IBaseHeader2023Data>),\r\n ...this.state,\r\n logo: (\r\n <Logo\r\n {...{\r\n link: logoLink,\r\n image: logoImage,\r\n className: 'ms-header__logo',\r\n gridSettings: this.props.context.request.gridSettings,\r\n requestContext: this.props.context.request,\r\n telemetryContent: this.telemetryContent,\r\n typeName: this.props.typeName\r\n }}\r\n />\r\n ),\r\n wishListIconDesktop: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-desktop'\r\n showButtonTooltip={!disableTooltip}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n wishlistCount={wishlistCount}\r\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\r\n isDispayWishlistCount={shouldShowWishlistCount}\r\n />\r\n ),\r\n wishListIconMobile: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-mobile'\r\n showButtonTooltip={!disableTooltip}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n wishlistCount={wishlistCount}\r\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\r\n isDispayWishlistCount={shouldShowWishlistCount}\r\n />\r\n ),\r\n cartIcon: ArrayExtensions.hasElements(cartIconSlot) ? (\r\n cartIconSlot[0]\r\n ) : (\r\n <CartIconComponent\r\n cartLabel={cartLabel}\r\n cartQtyLabel={cartQtyLabel}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{ cart: this.cart }}\r\n />\r\n ),\r\n navIcon: (\r\n <NavIcon\r\n {...{\r\n resources: this.props.resources,\r\n isExpanded: !this.state.mobileMenuCollapsed,\r\n targetId: navbarKey,\r\n toggleNavBar: this._toggleNavbar,\r\n telemetryContent: this.telemetryContent\r\n }}\r\n />\r\n ),\r\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\r\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\r\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n 'aria-label': this.props.resources.headerAriaLabel,\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container inside-xxl')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ms-header__topbar')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal',\r\n toggle: this._toggleNavbar\r\n },\r\n MobileMenuHeader: <ModalHeader className='ms-header__mobile-hamburger-menu-header' toggle={this._toggleNavbar} />,\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body'\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links'\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: 'ms-header__account-info'\r\n },\r\n AccountInfoDropdownPopoverConentContainer: this.displayName\r\n ? {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover\r\n }\r\n : undefined,\r\n signInLink: this._getSigninButton(user, this.props.resources),\r\n signOutLink: this._getSignOutButton(user, this.props.resources),\r\n isOBORequest: user?.isOBORequest,\r\n switchCustomerLink: this._getSwitchCustomerButton(user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(user, this.props.resources),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: ArrayExtensions.hasElements(preferredStoreSlot) && <HeaderPreferredStore {...this.props} />\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Handle link text change.\r\n * @param linkIndex - Link Index.\r\n * @returns : Void.\r\n */\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\r\n if (this.props.config.myAccountLinks?.[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\r\n }\r\n };\r\n\r\n /**\r\n * Get the slot.\r\n * @param slotName - Name of the slot.\r\n * @returns The slot.\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 /**\r\n * Renders the sign in button.\r\n * @param user - Request context user.\r\n * @param resources - Resources.\r\n * @returns React Node.\r\n */\r\n private _getSigninButton(user: MsDyn365.IRequestContextUser | undefined, resources: IBaseHeader2023Resources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n !this.displayName && (\r\n <Button\r\n className='ms-header__signin-button'\r\n title={resources.signInLinkText}\r\n href={user?.signInUrl}\r\n aria-label={resources.signInLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signin-button-text' aria-hidden>\r\n {resources.signInLinkText}\r\n </span>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Renders the sign out button.\r\n * @param user - Request context user.\r\n * @param resources - Resources.\r\n * @returns React Node.\r\n */\r\n private _getSignOutButton(user: MsDyn365.IRequestContextUser | undefined, resources: IBaseHeader2023Resources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n this.displayName && (\r\n <Button\r\n className='ms-header__signout-button'\r\n title={resources.signOutLinkText}\r\n href={user?.signOutUrl ?? ''}\r\n aria-label={resources.signOutLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signout-button-text' aria-hidden>\r\n {resources.signOutLinkText}\r\n </span>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Renders the sign out button.\r\n * @param user - Request context user.\r\n * @param resources - Resources.\r\n * @returns React Node.\r\n */\r\n private _getSwitchCustomerButton(\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n resources: IBaseHeader2023Resources\r\n ): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SwitchCustomer);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const isOBOAccountSelected = user?.isOBORequest && this.props.context.request.cookies.getAccountSelectionCookie();\r\n return (\r\n this.displayName &&\r\n isOBOAccountSelected && (\r\n <a\r\n aria-label={resources.switchCustomerLinkAriaText}\r\n className='ms-signin-info__account-link-button'\r\n title={resources.switchCustomerLinkText}\r\n href={this.getBusinessPartnerSelectionUrl()}\r\n role='link'\r\n onClick={() => this.props.context.request.cookies.removeAccountSelectionCookie()}\r\n {...attributes}\r\n >\r\n <div className='ms-header__switchcustomer-button-text'>\r\n <div className='ms-header__shoppingas-text'>{format(resources.shoppingAsText, this.customerName)}</div>\r\n <div>{resources.switchCustomerLinkText}</div>\r\n </div>\r\n </a>\r\n )\r\n );\r\n }\r\n\r\n private getBusinessPartnerSelectionUrl(): string | undefined {\r\n const route = MsDyn365.getUrlSync('businessPartnerSelection', this.props.context.actionContext);\r\n if (!route || !MsDyn365.msdyn365Commerce.isBrowser) {\r\n return undefined;\r\n }\r\n\r\n // MsDyn365.getUrlSync persists some params in the route and remove other params.\r\n // Among the persisted params, we need to remove catalogid.\r\n const persistedParamToRemove = ['catalogid'];\r\n const url = new URL(route, window.location.href);\r\n persistedParamToRemove.forEach(param => url.searchParams.delete(param));\r\n return url.href;\r\n }\r\n\r\n private _getSigninNotification(\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n signUpMultipleCustomerFoundTitle: string,\r\n signUpCustomerNotFoundTitle: string\r\n ): string | undefined {\r\n const { signUpCustomerNotFound, signUpMultipleCustomerFound } = this.props.config;\r\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\r\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\r\n\r\n if (user?.retailServerErrorCode === notFoundError) {\r\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\r\n } else if (user?.retailServerErrorCode === multipleAccountError) {\r\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\r\n }\r\n return undefined;\r\n }\r\n\r\n private _getAccountInfoDropdownButton(\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n resources: IBaseHeader2023Resources\r\n ): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n this.displayName && (\r\n <Button\r\n innerRef={this.popOverRef}\r\n className='ms-header__profile-button'\r\n aria-describedby='myprofilePopover'\r\n onClick={this._togglePopover}\r\n color='link'\r\n aria-label={this.displayName}\r\n aria-expanded={this.state.signinPopoverOpen}\r\n {...attributes}\r\n >\r\n <div className='ms-profile-button-text'>\r\n <div>{this.displayName}</div>\r\n {user?.isOBORequest && this.customerName && <div>{format(resources.shoppingAsText, this.customerName)}</div>}\r\n </div>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if (!customer || !this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'link',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n <MsDyn365.Link\r\n key={index}\r\n link={editableLink}\r\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\r\n />\r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(event: KeyboardEvent): void {\r\n if (event.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;\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 { Collapse, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IHeaderViewProps } from './base-header-2023';\r\n\r\nconst headerView: React.FC<IHeaderViewProps> = props => {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n // MobileMenuContainer,\r\n // MobileMenuBodyContainer,\r\n // MobileMenuLinksContainer,\r\n Divider\r\n } = props;\r\n return (\r\n <Module {...HeaderTag}>\r\n <Node {...HeaderContainer}>\r\n <Node {...HeaderTopBarContainer}>\r\n\r\n <div className='base-logo'>\r\n {props.logo}\r\n {props.navIcon}\r\n </div>\r\n\r\n <div className='base-menu desktop-nav'>\r\n {_renderReactFragment(props.menuBar)}\r\n </div>\r\n\r\n <div className='base-other always-flex align-items-center'>\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconDesktop}\r\n <Node {...Divider} />\r\n {props.cartIcon}\r\n {_renderReactFragment(props.siteOptions)}\r\n </div>\r\n \r\n </Node>\r\n \r\n {_renderCollapseMenu(props)}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n <Collapse className={'ms-header__collapsible-hamburger'} isOpen={!mobileMenuCollapsed}>\r\n <Node {...MobileMenuLinksContainer}>\r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconMobile}\r\n </Node>\r\n\r\n\r\n </Collapse>\r\n );\r\n}\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {accountInfoDropdownButton}\r\n <Node {...AccountInfoDropdownPopoverConentContainer}>\r\n {accountLinks ? accountLinks.map(link => link) : false}\r\n {signOutLink}\r\n </Node>\r\n </Node>\r\n );\r\n } else if (signInLink) {\r\n return <Node {...AccountInfoDropdownParentContainer}>{signInLink}</Node>;\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <>\r\n {items && items.length > 0\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return <React.Fragment key={index}>{slot}</React.Fragment>;\r\n })\r\n : null}\r\n </>\r\n );\r\n}\r\n\r\nexport default headerView;\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 { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IConnellyb2BHeader2023Data } from '../connellyb2b-header-2023.data';\r\nimport { IConnellyb2bHeader2023Props } from '../connellyb2b-header-2023.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component.\r\n */\r\n@observer\r\nexport class HeaderPreferredStore extends React.PureComponent<IConnellyb2bHeader2023Props<IConnellyb2BHeader2023Data>> {\r\n private readonly modalCloseButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\r\n\r\n /**\r\n * Handle click on the store selector.\r\n * @returns : Promise void.\r\n */\r\n public handleClick = () => {\r\n return this._findPreferredStoreOnClick(this.props);\r\n };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\r\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\r\n const storeName =\r\n storeSelectorStateManager?.preferredStore && storeSelectorStateManager.preferredStore.StoreName\r\n ? storeSelectorStateManager.preferredStore.StoreName\r\n : resources.headerPreferredStoreText;\r\n\r\n return (\r\n <div className='ms-header__preferred-store-container'>\r\n <button\r\n className='ms-header__preferred-store-btn msc-btn'\r\n color='secondary'\r\n aria-label={resources.headerPreferredStoreAriaLabel}\r\n onClick={this.handleClick}\r\n ref={this.modalCloseButtonRef}\r\n >\r\n <span className='ms-header__preferred-store-text'>{storeName}</span>\r\n </button>\r\n {slots.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async _findPreferredStoreOnClick(props: IConnellyb2bHeader2023Props<IConnellyb2BHeader2023Data>): Promise<void> {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n modules\r\n } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n await storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: true,\r\n parentElementRef: this.modalCloseButtonRef,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n })\r\n .catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n typeName?: string;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component.\r\n * @extends {React.PureComponent<ILogoConfig>}\r\n */\r\nexport class Logo extends React.PureComponent<ILogoProps> {\r\n private readonly attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render(): JSX.Element {\r\n return <div className={this.props.className}>{this._renderLogo(this.props)}</div>;\r\n }\r\n\r\n private _renderLogo(config: ILogoProps): JSX.Element {\r\n if (config.link && config.link.linkUrl.destinationUrl) {\r\n return (\r\n <a\r\n href={config.link.linkUrl.destinationUrl}\r\n aria-label={config.link.ariaLabel}\r\n target={config.link.openInNewTab ? '_blank' : undefined}\r\n rel='noopener noreferrer'\r\n {...this.attributes}\r\n >\r\n {this._renderImage(config)}\r\n </a>\r\n );\r\n }\r\n return this._renderImage(config);\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Msdyn365.Image\r\n {...config.image}\r\n requestContext={this.props.requestContext}\r\n gridSettings={this.props.gridSettings!}\r\n imageSettings={(config && config.image && config.image.imageSettings) || defaultImageSettings}\r\n loadFailureBehavior='default'\r\n editProps={{\r\n key: config.image || {},\r\n requestContext: this.props.requestContext,\r\n moduleType: this.props.typeName,\r\n imagePropertyName: 'image'\r\n }}\r\n shouldSkipToMainImage\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default Logo;\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IConnellyb2bHeader2023Resources } from '../connellyb2b-header-2023.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IConnellyb2bHeader2023Resources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component.\r\n * @extends {React.PureComponent<INavIconProps>}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.PureComponent<INavIconProps> {\r\n private readonly attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <Button\r\n className='ms-header__nav-icon'\r\n onClick={this.props.toggleNavBar}\r\n title={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-expanded={this.props.isExpanded}\r\n aria-controls={this.props.targetId}\r\n {...this.attributes}\r\n />\r\n );\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 { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n KeyCodes,\r\n Modal,\r\n ModalBody,\r\n ModalHeader,\r\n onTelemetryClick,\r\n Popover,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IConnellyb2BHeader2023Data } from './connellyb2b-header-2023.data';\r\nimport { IConnellyb2bHeader2023Props, IConnellyb2bHeader2023Resources, IMyAccountLinksData } from './connellyb2b-header-2023.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n hasSigninerror?: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IConnellyb2bHeader2023Props<IConnellyb2BHeader2023Data>, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n switchCustomerLink?: React.ReactNode;\r\n isOBORequest?: boolean;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component.\r\n * @extends {React.PureComponent<IConnellyb2bHeader2023Props<IConnellyb2bHeader2023Data>>}\r\n */\r\n@observer\r\nclass Header extends React.PureComponent<IConnellyb2bHeader2023Props<IConnellyb2BHeader2023Data>, IHeaderState> {\r\n private readonly popOverRef: React.RefObject<HTMLButtonElement>;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private cart: ICartState | undefined;\r\n\r\n /**\r\n * The signed-in user name displayed in the header bar\r\n */\r\n @computed public get displayName(): Readonly<string | undefined> {\r\n const user = this.props.context.request.user;\r\n return user?.isOBORequest ? this.workerName : this.customerName;\r\n }\r\n\r\n /**\r\n * OBO scenario. The name of worker who shops on behalf of customer.\r\n */\r\n @computed public get workerName(): Readonly<string | undefined> {\r\n const user = this.props.context.request.user;\r\n return user?.firstName || user?.name;\r\n }\r\n\r\n @computed public get customerName(): Readonly<string | undefined> {\r\n const user = this.props.context.request.user;\r\n const customer = this.props.data.accountInformation?.result;\r\n if (user?.isOBORequest) {\r\n // For OBO scenario, display full customer name because multiple customers may have the same first name.\r\n return customer ? customer.Name : undefined;\r\n } else {\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n }\r\n\r\n public constructor(props: IConnellyb2bHeader2023Props<IConnellyb2BHeader2023Data>) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false,\r\n hasSigninerror: false\r\n };\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 }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n reaction(\r\n () => this.props.data.cart.result,\r\n () => {\r\n this.cart = this.props.data.cart.result;\r\n }\r\n );\r\n\r\n const {\r\n context: {\r\n request: { user }\r\n },\r\n resources: { signUpCustomerNotFoundTitle, signUpMultipleCustomerFoundTitle, closeNotificationLabel }\r\n } = this.props;\r\n\r\n const signinNotificationError = this._getSigninNotification(user, signUpMultipleCustomerFoundTitle, signUpCustomerNotFoundTitle);\r\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\r\n // For signup show simple error notification.\r\n NotificationsManager.instance().addNotification(new ErrorNotification(signinNotificationError, closeNotificationLabel));\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation, wishlists },\r\n context: {\r\n request: { user }\r\n },\r\n context,\r\n resources: { cartLabel, cartQtyLabel }\r\n } = this.props;\r\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\r\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\r\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\r\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('menuBar');\r\n const searchSlot = this._getSlot('search');\r\n let wishlistCount = 0;\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n if (wishlists !== undefined) {\r\n if (\r\n !wishlists.result ||\r\n !ArrayExtensions.hasElements(wishlists.result) ||\r\n !wishlists.result[0].CommerceListLines ||\r\n !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)\r\n ) {\r\n wishlistCount = 0;\r\n } else {\r\n wishlistCount = wishlists.result[0].CommerceListLines.length;\r\n }\r\n }\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IConnellyb2bHeader2023Props<IConnellyb2BHeader2023Data>),\r\n ...this.state,\r\n logo: (\r\n <Logo\r\n {...{\r\n link: logoLink,\r\n image: logoImage,\r\n className: 'ms-header__logo',\r\n gridSettings: this.props.context.request.gridSettings,\r\n requestContext: this.props.context.request,\r\n telemetryContent: this.telemetryContent,\r\n typeName: this.props.typeName\r\n }}\r\n />\r\n ),\r\n wishListIconDesktop: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-desktop'\r\n showButtonTooltip={!disableTooltip}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n wishlistCount={wishlistCount}\r\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\r\n isDispayWishlistCount={shouldShowWishlistCount}\r\n />\r\n ),\r\n wishListIconMobile: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-mobile'\r\n showButtonTooltip={!disableTooltip}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n wishlistCount={wishlistCount}\r\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\r\n isDispayWishlistCount={shouldShowWishlistCount}\r\n />\r\n ),\r\n cartIcon: ArrayExtensions.hasElements(cartIconSlot) ? (\r\n cartIconSlot[0]\r\n ) : (\r\n <CartIconComponent\r\n cartLabel={cartLabel}\r\n cartQtyLabel={cartQtyLabel}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{ cart: this.cart }}\r\n />\r\n ),\r\n navIcon: (\r\n <NavIcon\r\n {...{\r\n resources: this.props.resources,\r\n isExpanded: !this.state.mobileMenuCollapsed,\r\n targetId: navbarKey,\r\n toggleNavBar: this._toggleNavbar,\r\n telemetryContent: this.telemetryContent\r\n }}\r\n />\r\n ),\r\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\r\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\r\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n 'aria-label': this.props.resources.headerAriaLabel,\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ms-header__topbar')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal',\r\n toggle: this._toggleNavbar\r\n },\r\n MobileMenuHeader: <ModalHeader className='ms-header__mobile-hamburger-menu-header' toggle={this._toggleNavbar} />,\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body'\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links'\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: 'ms-header__account-info'\r\n },\r\n AccountInfoDropdownPopoverConentContainer: this.displayName\r\n ? {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover\r\n }\r\n : undefined,\r\n signInLink: this._getSigninButton(user, this.props.resources),\r\n signOutLink: this._getSignOutButton(user, this.props.resources),\r\n isOBORequest: user?.isOBORequest,\r\n switchCustomerLink: this._getSwitchCustomerButton(user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(user, this.props.resources),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: ArrayExtensions.hasElements(preferredStoreSlot) && <HeaderPreferredStore {...this.props} />\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Handle link text change.\r\n * @param linkIndex - Link Index.\r\n * @returns : Void.\r\n */\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\r\n if (this.props.config.myAccountLinks?.[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\r\n }\r\n };\r\n\r\n /**\r\n * Get the slot.\r\n * @param slotName - Name of the slot.\r\n * @returns The slot.\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 /**\r\n * Renders the sign in button.\r\n * @param user - Request context user.\r\n * @param resources - Resources.\r\n * @returns React Node.\r\n */\r\n private _getSigninButton(user: MsDyn365.IRequestContextUser | undefined, resources: IConnellyb2bHeader2023Resources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n !this.displayName && (\r\n <Button\r\n className='ms-header__signin-button'\r\n title={resources.signInLinkText}\r\n href={user?.signInUrl}\r\n aria-label={resources.signInLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signin-button-text' aria-hidden>\r\n {resources.signInLinkText}\r\n </span>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Renders the sign out button.\r\n * @param user - Request context user.\r\n * @param resources - Resources.\r\n * @returns React Node.\r\n */\r\n private _getSignOutButton(user: MsDyn365.IRequestContextUser | undefined, resources: IConnellyb2bHeader2023Resources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n this.displayName && (\r\n <Button\r\n className='ms-header__signout-button'\r\n title={resources.signOutLinkText}\r\n href={user?.signOutUrl ?? ''}\r\n aria-label={resources.signOutLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signout-button-text' aria-hidden>\r\n {resources.signOutLinkText}\r\n </span>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Renders the sign out button.\r\n * @param user - Request context user.\r\n * @param resources - Resources.\r\n * @returns React Node.\r\n */\r\n private _getSwitchCustomerButton(\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n resources: IConnellyb2bHeader2023Resources\r\n ): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SwitchCustomer);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const isOBOAccountSelected = user?.isOBORequest && this.props.context.request.cookies.getAccountSelectionCookie();\r\n return (\r\n this.displayName &&\r\n isOBOAccountSelected && (\r\n <a\r\n aria-label={resources.switchCustomerLinkAriaText}\r\n className='ms-signin-info__account-link-button'\r\n title={resources.switchCustomerLinkText}\r\n href={this.getBusinessPartnerSelectionUrl()}\r\n role='link'\r\n onClick={() => this.props.context.request.cookies.removeAccountSelectionCookie()}\r\n {...attributes}\r\n >\r\n <div className='ms-header__switchcustomer-button-text'>\r\n <div className='ms-header__shoppingas-text'>{format(resources.shoppingAsText, this.customerName)}</div>\r\n <div>{resources.switchCustomerLinkText}</div>\r\n </div>\r\n </a>\r\n )\r\n );\r\n }\r\n\r\n private getBusinessPartnerSelectionUrl(): string | undefined {\r\n const route = MsDyn365.getUrlSync('businessPartnerSelection', this.props.context.actionContext);\r\n if (!route || !MsDyn365.msdyn365Commerce.isBrowser) {\r\n return undefined;\r\n }\r\n\r\n // MsDyn365.getUrlSync persists some params in the route and remove other params.\r\n // Among the persisted params, we need to remove catalogid.\r\n const persistedParamToRemove = ['catalogid'];\r\n const url = new URL(route, window.location.href);\r\n persistedParamToRemove.forEach(param => url.searchParams.delete(param));\r\n return url.href;\r\n }\r\n\r\n private _getSigninNotification(\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n signUpMultipleCustomerFoundTitle: string,\r\n signUpCustomerNotFoundTitle: string\r\n ): string | undefined {\r\n const { signUpCustomerNotFound, signUpMultipleCustomerFound } = this.props.config;\r\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\r\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\r\n\r\n if (user?.retailServerErrorCode === notFoundError) {\r\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\r\n } else if (user?.retailServerErrorCode === multipleAccountError) {\r\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\r\n }\r\n return undefined;\r\n }\r\n\r\n private _getAccountInfoDropdownButton(\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n resources: IConnellyb2bHeader2023Resources\r\n ): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n this.displayName && (\r\n <Button\r\n innerRef={this.popOverRef}\r\n className='ms-header__profile-button'\r\n aria-describedby='myprofilePopover'\r\n onClick={this._togglePopover}\r\n color='link'\r\n aria-label={this.displayName}\r\n aria-expanded={this.state.signinPopoverOpen}\r\n {...attributes}\r\n >\r\n <div className='ms-profile-button-text'>\r\n <div>{this.displayName}</div>\r\n {user?.isOBORequest && this.customerName && <div>{format(resources.shoppingAsText, this.customerName)}</div>}\r\n </div>\r\n </Button>\r\n )\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if (!customer || !this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'link',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n <MsDyn365.Link\r\n key={index}\r\n link={editableLink}\r\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\r\n />\r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(event: KeyboardEvent): void {\r\n if (event.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IHeaderViewProps } from './connellyb2b-header-2023';\r\n\r\nconst headerView: React.FC<IHeaderViewProps> = props => {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n MobileMenuContainer,\r\n MobileMenuBodyContainer,\r\n MobileMenuLinksContainer,\r\n Divider\r\n } = props;\r\n return (\r\n <Module {...HeaderTag}>\r\n <Node {...HeaderContainer}>\r\n <Node {...HeaderTopBarContainer}>\r\n {props.navIcon}\r\n {props.logo}\r\n {_renderReactFragment(props.search)}\r\n {props.preferredStore}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconDesktop}\r\n <Node {...Divider} />\r\n {props.cartIcon}\r\n {_renderReactFragment(props.siteOptions)}\r\n </Node>\r\n <Node {...MobileMenuContainer}>\r\n <Node {...MobileMenuBodyContainer}>\r\n {props.MobileMenuHeader}\r\n {_renderReactFragment(props.menuBar)}\r\n <Node {...MobileMenuLinksContainer}>\r\n {props.accountLinks ? props.accountLinks.map(link => link) : false}\r\n {props.siteOptions}\r\n {props.wishListIconMobile}\r\n {props.signInLink}\r\n {props.signOutLink}\r\n </Node>\r\n </Node>\r\n </Node>\r\n {_renderReactFragment(props.menuBar)}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {accountInfoDropdownButton}\r\n <Node {...AccountInfoDropdownPopoverConentContainer}>\r\n {accountLinks ? accountLinks.map(link => link) : false}\r\n {signOutLink}\r\n </Node>\r\n </Node>\r\n );\r\n } else if (signInLink) {\r\n return <Node {...AccountInfoDropdownParentContainer}>{signInLink}</Node>;\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <>\r\n {items && items.length > 0\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return <React.Fragment key={index}>{slot}</React.Fragment>;\r\n })\r\n : null}\r\n </>\r\n );\r\n}\r\n\r\nexport default headerView;\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 { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent<ILogoConfig>}\r\n */\r\nexport class Logo extends React.PureComponent<ILogoProps> {\r\n\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n public render():JSX.Element {\r\n return(\r\n <div className={this.props.className}>\r\n {this._renderLogo(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderLogo(config: ILogoProps):JSX.Element {\r\n if(config.link && config.link.linkUrl.destinationUrl) {\r\n return(\r\n <a\r\n href={config.link.linkUrl.destinationUrl}\r\n aria-label={config.link.ariaLabel}\r\n target={config.link.openInNewTab ? '_blank' : undefined}\r\n {...this.attributes}\r\n >\r\n {this._renderImage(config)}\r\n </a>\r\n );\r\n }\r\n return(\r\n this._renderImage(config)\r\n );\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Msdyn365.Image\r\n {...config.image}\r\n gridSettings={this.props.gridSettings!}\r\n imageSettings={config && config.image && config.image.imageSettings || defaultImageSettings}\r\n loadFailureBehavior='default'\r\n editProps= {{key: config.image || {}, requestContext: this.props.requestContext}}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default Logo;","/*---------------------------------------------------------------------------------------------\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 { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IObrienHeader2021Resources } from '../obrien-header-2021.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IObrienHeader2021Resources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent<INavIconProps>}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component<INavIconProps> {\r\n\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render():JSX.Element {\r\n return (\r\n <Button\r\n className='ms-header__nav-icon'\r\n onClick={this.props.toggleNavBar}\r\n title={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-expanded={this.props.isExpanded}\r\n aria-controls={this.props.targetId}\r\n {...this.attributes}\r\n />\r\n );\r\n }\r\n}","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IObrienHeader2021Data } from '../obrien-header-2021.data';\r\nimport { IObrienHeader2021Props } from '../obrien-header-2021.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component\r\n */\r\n@observer\r\nexport class HeaderPreferredStore extends React.PureComponent<IObrienHeader2021Props<IObrienHeader2021Data>> {\r\n\r\n public handleClick = () => { return this._findPreferreStoreOnClick(this.props); };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n if (slots && slots.storeSelector && slots.storeSelector.length) {\r\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\r\n storeSelectorStateManager!.preferredStore.StoreName :\r\n resources.headerPreferredStoreText;\r\n\r\n return (\r\n <div className='ms-header__preferred-store-container'>\r\n <button className='ms-header__preferred-store-btn msc-btn' color='secondary' aria-label={resources.headerPreferredStoreAriaLabel} onClick={this.handleClick} >\r\n <span className='ms-header__preferred-store-text'>{storeName}</span>\r\n </button>\r\n {slots.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async _findPreferreStoreOnClick(props: IObrienHeader2021Props<IObrienHeader2021Data>): Promise<void> {\r\n const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: false,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n }).catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n return;\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\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 {\r\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\r\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IObrienHeader2021Data } from './obrien-header-2021.data';\r\nimport { IObrienHeader2021Props, IObrienHeader2021Resources, IMyAccountLinksData } from './obrien-header-2021.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IObrienHeader2021Props<IObrienHeader2021Data>, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent<IObrienHeader2021Props<IObrienHeader2021Data>>}\r\n */\r\nclass Header extends React.PureComponent<IObrienHeader2021Props<IObrienHeader2021Data>, IHeaderState> {\r\n private popOverRef: React.RefObject<HTMLButtonElement>;\r\n private telemetryContent: ITelemetryContent;\r\n @computed public get displayName(): Readonly<string | undefined> {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n\r\n constructor(props: IObrienHeader2021Props<IObrienHeader2021Data>) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation,\r\n cart: { result: cart },\r\n storeSelectorStateManager: {result: storeSelectorStateManager}\r\n },\r\n context: {\r\n request: {\r\n user\r\n }\r\n },\r\n context,\r\n resources: {\r\n cartLabel,\r\n cartQtyLabel\r\n }\r\n } = this.props;\r\n const { logoLink, logoImage } = this.props.config;\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('kentMenuBar');\r\n const searchSlot = this._getSlot('search');\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IObrienHeader2021Props<IObrienHeader2021Data>),\r\n ...(this.state),\r\n logo: <Logo {...{ link: logoLink, image: logoImage, className: 'ms-header__logo', gridSettings: this.props.context.request.gridSettings, requestContext: this.props.context.request, telemetryContent: this.telemetryContent }} />,\r\n wishListIconDesktop: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-desktop'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n wishListIconMobile: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-mobile'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n cartIcon: (cartIconSlot && cartIconSlot.length > 0)\r\n ? cartIconSlot[0]\r\n : cart && <CartIconComponent cartLabel={cartLabel} cartQtyLabel={cartQtyLabel} context={context} id={id} typeName={typeName} telemetryContent={this.telemetryContent} data={{ cart: cart }} />,\r\n navIcon: <NavIcon {...{ resources: this.props.resources, isExpanded: !this.state.mobileMenuCollapsed, targetId: navbarKey, toggleNavBar: this._toggleNavbar, telemetryContent: this.telemetryContent }} />,\r\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\r\n search: searchSlot && searchSlot.length && searchSlot || [],\r\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ms-header__topbar')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal'\r\n },\r\n MobileMenuHeader: (\r\n <ModalHeader\r\n className='ms-header__mobile-hamburger-menu-header'\r\n toggle={this._toggleNavbar}\r\n />\r\n ),\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body',\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links',\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: 'ms-header__account-info'\r\n },\r\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover,\r\n } || undefined,\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: preferredStoreSlot\r\n && preferredStoreSlot.length\r\n && storeSelectorStateManager\r\n && (<HeaderPreferredStore {...this.props}/>)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /* Handle link text change*/\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\r\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\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 _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IObrienHeader2021Resources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return !customer && (\r\n <Button\r\n className='ms-header__signin-button'\r\n title={resources.signInLinkText}\r\n href={user && user.signInUrl}\r\n aria-label={resources.signInLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signin-button-text' aria-hidden={true}>{resources.signInLinkText}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IObrienHeader2021Resources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n <Button\r\n className={'ms-header__signout-button'}\r\n title={resources.signOutLinkText}\r\n href={user && user.signOutUrl || ''}\r\n aria-label={resources.signOutLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signout-button-text' aria-hidden={true}>{resources.signOutLinkText}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n <Button\r\n innerRef={this.popOverRef}\r\n className={'ms-header__profile-button'}\r\n aria-describedby='myprofilePopover'\r\n onClick={this._togglePopover}\r\n color='link'\r\n aria-expanded={this.state.signinPopoverOpen}\r\n {...attributes}\r\n >\r\n <span className='ms-profile-button-text'>{this.displayName}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if(!customer || ! this.displayName || !myAccountLinks || !myAccountLinks.length) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n <MsDyn365.Link\r\n key={index}\r\n link={editableLink}\r\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\r\n />\r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;","/*---------------------------------------------------------------------------------------------\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\n\r\nimport { Collapse, Drawer, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, {useState} from 'react'\r\nimport classnames from 'classnames';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport { IHeaderViewProps } from './obrien-header-2021';\r\n\r\nconst headerView: React.FC<IHeaderViewProps> = props => {\r\n const [navigate,setNavigate] = useState(false);\r\n const changeBackground = () => { \r\n if(window.scrollY >= 84) {\r\n setNavigate(true)\r\n }else {\r\n setNavigate(false)\r\n }\r\n }\r\n if (typeof window !== `undefined`) {\r\n window.addEventListener('scroll', changeBackground);\r\n }\r\n\r\n\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n //MobileMenuContainer,\r\n //MobileMenuBodyContainer,\r\n //MobileMenuLinksContainer,\r\n //Divider\r\n } = props;\r\n return (\r\n <Module {...HeaderTag}>\r\n <div className={navigate ? 'scrollactive active' : 'scrollactive'}>\r\n <Node {...HeaderContainer}>\r\n <Node {...HeaderTopBarContainer}>\r\n\r\n <div className='ob-top-header'>\r\n <div className='always-flex justify inside-xxl'>\r\n <div id='ob-top-logos' className='align-vertical'>\r\n <a role='button' className='up-obrien' href='https://www.obrien.com' />\r\n <a role='button' className='up-margaritaville' href='https://www.obrien.com/margaritaville' />\r\n <a role='button' className='up-hydroslide' href='https://www.obrien.com/hydroslide' />\r\n </div>\r\n <div className='ob-top-menu always-flex'>\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconDesktop}\r\n {props.cartIcon}\r\n {_renderReactFragment(props.siteOptions)}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className='ob-low-header'>\r\n <div className='always-flex justify inside-xxl obrien-header-2021'>\r\n {props.logo}\r\n {props.navIcon}\r\n {_renderReactFragment(props.menuBar)}\r\n </div>\r\n </div>\r\n\r\n </Node>\r\n {_renderCollapseMenu(props)}\r\n </Node>\r\n </div>\r\n </Module>\r\n );\r\n};\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n <Collapse className={'ms-header__collapsible-hamburger'} isOpen={!mobileMenuCollapsed}>\r\n <Node {...MobileMenuLinksContainer}>\r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\r\n {_renderMobileAccountBlock(props, true)}\r\n {props.wishListIconMobile}\r\n </Node>\r\n\r\n\r\n </Collapse>\r\n );\r\n}\r\n\r\nconst renderCustomerName = (accountInformation: AsyncResult<Customer>): React.ReactChild => {\r\n const customer = accountInformation && accountInformation.result;\r\n return (\r\n <>{customer && customer.FirstName}</>\r\n );\r\n};\r\n\r\nfunction _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n signOutLink,\r\n signInLink,\r\n data,\r\n accountLinks } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames('ms-header__drawer', AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n\r\n if (accountLinks) {\r\n return (\r\n <Drawer className={accountClassName} openGlyph='ms-header__drawer-open' closeGlyph='ms-header__drawer-close' glyphPlacement='end' toggleButtonText={renderCustomerName(data.accountInformation)}>\r\n <div>\r\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\r\n {signOutLink}\r\n </div>\r\n </Drawer>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {accountInfoDropdownButton}\r\n <Node {...AccountInfoDropdownPopoverConentContainer}>\r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n </Node>\r\n </Node>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <>\r\n {items && items.length > 0 ? items.map((slot: React.ReactNode, index: number) => {\r\n return (<React.Fragment key={index}>\r\n {slot}\r\n </React.Fragment>);\r\n }) : null}\r\n </>\r\n );\r\n}\r\n\r\n\r\nexport default headerView;","/*---------------------------------------------------------------------------------------------\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 { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent<ILogoConfig>}\r\n */\r\nexport class Logo extends React.PureComponent<ILogoProps> {\r\n\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n public render():JSX.Element {\r\n return(\r\n <div className={this.props.className}>\r\n {this._renderLogo(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderLogo(config: ILogoProps):JSX.Element {\r\n if(config.link && config.link.linkUrl.destinationUrl) {\r\n return(\r\n <a\r\n href={config.link.linkUrl.destinationUrl}\r\n aria-label={config.link.ariaLabel}\r\n target={config.link.openInNewTab ? '_blank' : undefined}\r\n {...this.attributes}\r\n >\r\n {this._renderImage(config)}\r\n </a>\r\n );\r\n }\r\n return(\r\n this._renderImage(config)\r\n );\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Msdyn365.Image\r\n {...config.image}\r\n gridSettings={this.props.gridSettings!}\r\n imageSettings={config && config.image && config.image.imageSettings || defaultImageSettings}\r\n loadFailureBehavior='default'\r\n editProps= {{key: config.image || {}, requestContext: this.props.requestContext}}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default Logo;","/*---------------------------------------------------------------------------------------------\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 { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IObrienHeader2023Resources } from '../obrien-header-2023.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IObrienHeader2023Resources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent<INavIconProps>}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component<INavIconProps> {\r\n\r\n private attributes?: Msdyn365.IDictionary<string>;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render():JSX.Element {\r\n return (\r\n <Button\r\n className='ms-header__nav-icon'\r\n onClick={this.props.toggleNavBar}\r\n title={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\r\n aria-expanded={this.props.isExpanded}\r\n aria-controls={this.props.targetId}\r\n {...this.attributes}\r\n />\r\n );\r\n }\r\n}","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IObrienHeader2023Data } from '../obrien-header-2023.data';\r\nimport { IObrienHeader2023Props } from '../obrien-header-2023.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component\r\n */\r\n@observer\r\nexport class HeaderPreferredStore extends React.PureComponent<IObrienHeader2023Props<IObrienHeader2023Data>> {\r\n\r\n public handleClick = () => { return this._findPreferreStoreOnClick(this.props); };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n if (slots && slots.storeSelector && slots.storeSelector.length) {\r\n const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\r\n storeSelectorStateManager!.preferredStore.StoreName :\r\n resources.headerPreferredStoreText;\r\n\r\n return (\r\n <div className='ms-header__preferred-store-container'>\r\n <button className='ms-header__preferred-store-btn msc-btn' color='secondary' aria-label={resources.headerPreferredStoreAriaLabel} onClick={this.handleClick} >\r\n <span className='ms-header__preferred-store-text'>{storeName}</span>\r\n </button>\r\n {slots.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private async _findPreferreStoreOnClick(props: IObrienHeader2023Props<IObrienHeader2023Data>): Promise<void> {\r\n const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: false,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n }).catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n return;\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\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 {\r\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\r\n ModalBody, ModalHeader, onTelemetryClick, Popover, TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IObrienHeader2023Data } from './obrien-header-2023.data';\r\nimport { IObrienHeader2023Props, IObrienHeader2023Resources, IMyAccountLinksData } from './obrien-header-2023.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IObrienHeader2023Props<IObrienHeader2023Data>, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n promoBanner: React.ReactNode[];\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent<IObrienHeader2023Props<IObrienHeader2023Data>>}\r\n */\r\nclass Header extends React.PureComponent<IObrienHeader2023Props<IObrienHeader2023Data>, IHeaderState> {\r\n private popOverRef: React.RefObject<HTMLButtonElement>;\r\n private telemetryContent: ITelemetryContent;\r\n @computed public get displayName(): Readonly<string | undefined> {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n\r\n constructor(props: IObrienHeader2023Props<IObrienHeader2023Data>) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation,\r\n cart: { result: cart },\r\n storeSelectorStateManager: {result: storeSelectorStateManager}\r\n },\r\n context: {\r\n request: {\r\n user\r\n }\r\n },\r\n context,\r\n resources: {\r\n cartLabel,\r\n cartQtyLabel\r\n }\r\n } = this.props;\r\n const { logoLink, logoImage } = this.props.config;\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const promoBannerSlot = this._getSlot('obrienPromoBanner');\r\n const menuBarSlot = this._getSlot('kentMenuBar');\r\n const searchSlot = this._getSlot('search');\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IObrienHeader2023Props<IObrienHeader2023Data>),\r\n ...(this.state),\r\n logo: <Logo {...{ link: logoLink, image: logoImage, className: 'ms-header__logo center flex-vertical', gridSettings: this.props.context.request.gridSettings, requestContext: this.props.context.request, telemetryContent: this.telemetryContent }} />,\r\n wishListIconDesktop: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-desktop'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n wishListIconMobile: (\r\n <WishListIconComponent\r\n className='ms-header__wishlist-mobile'\r\n showButtonTooltip={true}\r\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n telemetryContent={this.telemetryContent}\r\n data={{}}\r\n />\r\n ),\r\n cartIcon: (cartIconSlot && cartIconSlot.length > 0)\r\n ? cartIconSlot[0]\r\n : cart && <CartIconComponent cartLabel={cartLabel} cartQtyLabel={cartQtyLabel} context={context} id={id} typeName={typeName} telemetryContent={this.telemetryContent} data={{ cart: cart }} />,\r\n navIcon: <NavIcon {...{ resources: this.props.resources, isExpanded: !this.state.mobileMenuCollapsed, targetId: navbarKey, toggleNavBar: this._toggleNavbar, telemetryContent: this.telemetryContent }} />,\r\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\r\n search: searchSlot && searchSlot.length && searchSlot || [],\r\n promoBanner: promoBannerSlot && promoBannerSlot.length && promoBannerSlot || [],\r\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ob-header-2023')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal'\r\n },\r\n MobileMenuHeader: (\r\n <ModalHeader\r\n className='ms-header__mobile-hamburger-menu-header'\r\n toggle={this._toggleNavbar}\r\n />\r\n ),\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body',\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links',\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: 'ms-header__account-info'\r\n },\r\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover,\r\n } || undefined,\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: preferredStoreSlot\r\n && preferredStoreSlot.length\r\n && storeSelectorStateManager\r\n && (<HeaderPreferredStore {...this.props}/>)\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /* Handle link text change*/\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\r\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\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 _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IObrienHeader2023Resources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return !customer && (\r\n <Button\r\n className='ms-header__signin-button'\r\n title={resources.signInLinkText}\r\n href={user && user.signInUrl}\r\n aria-label={resources.signInLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signin-button-text' aria-hidden={true}>{resources.signInLinkText}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: IObrienHeader2023Resources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n <Button\r\n className={'ms-header__signout-button'}\r\n title={resources.signOutLinkText}\r\n href={user && user.signOutUrl || ''}\r\n aria-label={resources.signOutLinkAriaText}\r\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\r\n {...attributes}\r\n >\r\n <span className='ms-header__signout-button-text' aria-hidden={true}>{resources.signOutLinkText}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n <Button\r\n innerRef={this.popOverRef}\r\n className={'ms-header__profile-button'}\r\n aria-describedby='myprofilePopover'\r\n onClick={this._togglePopover}\r\n color='link'\r\n aria-expanded={this.state.signinPopoverOpen}\r\n {...attributes}\r\n >\r\n <span className='ms-profile-button-text'>{this.displayName}</span>\r\n </Button>\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if(!customer || ! this.displayName || !myAccountLinks || !myAccountLinks.length) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n <MsDyn365.Link\r\n key={index}\r\n link={editableLink}\r\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\r\n />\r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;","/*---------------------------------------------------------------------------------------------\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\n\r\nimport { Collapse, Drawer, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, {useState} from 'react'\r\nimport classnames from 'classnames';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport { IHeaderViewProps } from './obrien-header-2023';\r\n\r\nconst headerView: React.FC<IHeaderViewProps> = props => {\r\n const [navigate,setNavigate] = useState(false);\r\n const changeBackground = () => { \r\n if(window.scrollY >= 48) {\r\n setNavigate(true)\r\n }else {\r\n setNavigate(false)\r\n }\r\n }\r\n if (typeof window !== `undefined`) {\r\n window.addEventListener('scroll', changeBackground);\r\n }\r\n\r\n\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n //MobileMenuContainer,\r\n //MobileMenuBodyContainer,\r\n //MobileMenuLinksContainer,\r\n //Divider\r\n } = props;\r\n return (\r\n <Module {...HeaderTag}>\r\n <div className={navigate ? 'scrollactive active' : 'scrollactive'}>\r\n <Node {...HeaderContainer}>\r\n <Node {...HeaderTopBarContainer}>\r\n\r\n <div className='ob-top-header-23'>\r\n <div className='inside-xxl'>\r\n <div className='obrien-promo always-flex justify'>\r\n <div className='obrien-promo-under flex-vertical'>{_renderReactFragment(props.promoBanner)}</div>\r\n <div className='always-flex'>\r\n {props.wishListIconDesktop}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.cartIcon}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className='ob-low-header'>\r\n <div className='always-flex justify inside-xxl obrien-header-2021'>\r\n {props.logo}\r\n {props.navIcon}\r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\r\n {_renderReactFragment(props.siteOptions)}\r\n </div>\r\n </div>\r\n\r\n </Node>\r\n {_renderCollapseMenu(props)}\r\n </Node>\r\n </div>\r\n </Module>\r\n );\r\n};\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n <Collapse className={'ms-header__collapsible-hamburger'} isOpen={!mobileMenuCollapsed}>\r\n <Node {...MobileMenuLinksContainer}>\r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\r\n {_renderMobileAccountBlock(props, true)}\r\n {props.wishListIconMobile}\r\n </Node>\r\n\r\n\r\n </Collapse>\r\n );\r\n}\r\n\r\nconst renderCustomerName = (accountInformation: AsyncResult<Customer>): React.ReactChild => {\r\n const customer = accountInformation && accountInformation.result;\r\n return (\r\n <>{customer && customer.FirstName}</>\r\n );\r\n};\r\n\r\nfunction _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n signOutLink,\r\n signInLink,\r\n data,\r\n accountLinks } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames('ms-header__drawer', AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n\r\n if (accountLinks) {\r\n return (\r\n <Drawer className={accountClassName} openGlyph='ms-header__drawer-open' closeGlyph='ms-header__drawer-close' glyphPlacement='end' toggleButtonText={renderCustomerName(data.accountInformation)}>\r\n <div>\r\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\r\n {signOutLink}\r\n </div>\r\n </Drawer>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {accountInfoDropdownButton}\r\n <Node {...AccountInfoDropdownPopoverConentContainer}>\r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n </Node>\r\n </Node>\r\n );\r\n } else if (signInLink) {\r\n return (\r\n <Node {...AccountInfoDropdownParentContainer}>\r\n {signInLink}\r\n </Node>\r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <>\r\n {items && items.length > 0 ? items.map((slot: React.ReactNode, index: number) => {\r\n return (<React.Fragment key={index}>\r\n {slot}\r\n </React.Fragment>);\r\n }) : null}\r\n </>\r\n );\r\n}\r\n\r\n\r\nexport default headerView;","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer;\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find(\r\n (refinementCriterion: ProductRefinerValue) => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ProductListInventoryFilteringOptions } from '../actions';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\r\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly<IChoiceSummaryProps>) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n <div className='msc-choice-summary'>\r\n {items.length > 0 && label && <span className='msc-choice-summary__label'>\r\n {label}\r\n </span>}\r\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\r\n {items.map((item: IRefinerMap) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <li className='msc-choice-summary__list-item' key={item.key}>\r\n <a\r\n className='msc-choice-summary__item'\r\n href={this.props.urlBuilder(item.value, false)}\r\n aria-label={`${item.key} ${choiceAriaLabel}`}\r\n onClick={this._onClick}\r\n role='button'\r\n {...attribute}\r\n >\r\n {item.key}\r\n <span className={`${this.closeButtonGlyph} msc-choice-summary__glyph`} role='button' aria-label={closeAriaLabel} />\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {items.length > 0 && clearAllText && <a\r\n href={this.props.urlBuilder({}, true)} className='msc-choice-summary__clear-all' {...clearAllAttributes}\r\n onClick={this._onClick}>\r\n {clearAllText}\r\n </a>}\r\n </div>\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n // eslint-disable-next-line unicorn/prefer-array-some, max-len -- Existing code\r\n (hierarchy: IProductRefinerHierarchy) => !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\r\n return (\r\n <span className='ms-search-result-container__no-results-message'>\r\n <h5 className='error-text'>\r\n {' '}\r\n {text}\r\n {' '}\r\n </h5>\r\n </span>\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IObrienSearchResultContainerResources } from '../obrien-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IObrienSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading = recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n <div className='ms-feature-search-result__item'>\r\n <a\r\n href={productUrl} onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)} {...attribute}\r\n aria-label={product.Name}>\r\n <div className='msc-feature-search-result__item__image'>\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.Name, fallbackImage, context.actionContext.requestContext)}\r\n </div>\r\n </a>\r\n <div className='msc-feature-search-result__item__detail'>\r\n <p className='msc-feature-search-result__item__heading'>\r\n {heading}\r\n </p>\r\n {renderProductTitle(product?.Name)}\r\n </div>\r\n </div>\r\n );\r\n\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string,\r\n altText?: string, fallbackImage?: string, context?: IRequestContext): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return (\r\n <Image\r\n {...img} {...imageProps} loadFailureBehavior='empty'\r\n requestContext={context}\r\n />\r\n );\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return (<h1 className='msc-feature-search-result__item__product-title'>\r\n {title}\r\n </h1>);\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (<a className={className} href={href} aria-label={ariaLabel}>\r\n {' '}\r\n {text}\r\n {' '}\r\n</a>);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (<button\r\n id={id} className='msc-button' aria-label={ariaLabel}\r\n onClick={onClick} ref={innerRef}>\r\n {text}\r\n </button>);\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: <ModalBody className='msc-review-modal-body' />\r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <Modal\r\n autoFocus\r\n applicationNode='renderPage'\r\n returnFocusRef={props.returnRef}\r\n isOpen={props.isOpen}\r\n toggle={props.onModalToggle}\r\n className='msc-search-result-modal'\r\n zIndex={1050}\r\n />\r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <ModalHeader toggle={props.onModalToggle}>\r\n {props.resources.modalTitle}\r\n </ModalHeader>\r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n <ModalFooter>\r\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\r\n {props.resources.modalCloseButtonText}\r\n </Button>\r\n </ModalFooter>\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IObrienSearchResultContainerResources } from '../obrien-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IObrienSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nexport function getInventoryLabel(\r\n channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className='ms-product-search-result__item' key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={allowBackNavigation}\r\n id={moduleId}\r\n key={product.RecordId}\r\n typeName={moduleType}\r\n data={{ product }}\r\n quickViewButton={quickviewSlot}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\r\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\r\n dimensionAvailability => ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId)}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private readonly minInput: React.RefObject<HTMLInputElement>;\r\n\r\n private readonly maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\r\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps,\r\n nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(this.props.productRefinerValue.RefinerRecordId)}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin = this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax = this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ?? maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(sliderId,\r\n sliderKeyString, selectedMin, selectedMinPrice, selectedMax, selectedMaxPrice, maxPrice);\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return ([\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]);\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return ([\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]);\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\r\n {validationErrorMin}\r\n </span>}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\r\n {validationErrorMax}\r\n </span>}\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n <Slider\r\n className='ms-refine-submenu__range-refiner'\r\n key={this.state.sliderId}\r\n sliderKey={sliderKey}\r\n id={this.state.sliderId}\r\n inForm={false}\r\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\r\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\r\n step={1}\r\n orientation='horizontal'\r\n labels={this.state.labels}\r\n showLabels\r\n showTooltip\r\n sliderThumbs={this.state.sliderThumbs}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(selected: string | undefined, touched: boolean, validationError: string | undefined): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\r\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps,\r\n nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(productRefinerValue, parentProductRefinerHierarchy, isChecked, context, index, telemetryContent,\r\n productCountAriaLabel, singleProductCountAriaLabel);\r\n\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText) : '';\r\n } else {\r\n refineMenuItemAriaLabel =\r\n refineItemsAriaLabel ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount) : '';\r\n }\r\n return (\r\n <li className='ms-refine-submenu-item' id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\r\n <a\r\n key={selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-label={refineMenuItemAriaLabel}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attribute}\r\n {...attrs}\r\n >\r\n {this._renderSwatch()}\r\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\r\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n\r\n }\r\n\r\n private _renderSwatch(): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasValidSwatch = hasColor || hasImage;\r\n const shouldDisplayAsSwatch = hasValidSwatch && checkIfShouldDisplayAsSwatch(\r\n dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\r\n const swatchItems = shouldDisplayAsSwatch ? [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ] : undefined;\r\n\r\n if (!swatchItems) {\r\n return null;\r\n }\r\n\r\n return (\r\n <SwatchComponent\r\n className='ms-refine-submenu-item__swatch'\r\n apiSettings={this.props.context.request.apiSettings}\r\n list={swatchItems}\r\n isSelectionEnabled={false}\r\n isRefineItem\r\n />\r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n };\r\n\r\n private _renderRating(productRefinerValue: ProductRefinerValue, parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean, context: ICoreContext, index?: number, telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string, ratingSingleUserCountAriaLabel?: string): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue = (productRefinerValue.Count !== undefined &&\r\n productRefinerValue.Count === defaultChkProductCount) ? (ratingSingleUserCountAriaLabel &&\r\n format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)) : (ratingUserCountAriaLabel &&\r\n format(ratingUserCountAriaLabel, productRefinerValue.Count));\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role={!this.props.isMobileView ? 'presentation' : undefined}\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n role='option'\r\n aria-selected={isChecked}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\r\n ${productCountAriaLabelValue!}`}\r\n onClick={this._onClick}\r\n {...attribute}\r\n >\r\n <RatingComponent\r\n className={ratingComponentClass}\r\n avgRating={refinerRating}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n return undefined;\r\n }\r\n\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext<IGeneric<IAny>>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps,\r\n nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if ((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n <div className={`ms-refine-submenu list-group ${productRefinerHierarchy.KeyName}`}>\r\n <Button\r\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={productRefinerHierarchy.KeyName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {productRefinerHierarchy.KeyName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context,\r\n productCountAriaLabel, singleProductCountAriaLabel, refineItemAriaLabel, refineItemsAriaLabel, isMobile } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue => refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`} {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n sliderKey={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n />\r\n </li>\r\n );\r\n });\r\n return (<ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>\r\n {listItems}\r\n </ul>);\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (<span>\r\n {' '}\r\n {separator}\r\n {' '}\r\n</span>);\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC<ITitle> = ({ text, className }) => (<span className={className}>\r\n {' '}\r\n {text}\r\n {' '}\r\n</span>);\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IObrienSearchResultContainer containerModule 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 expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IObrienSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n newTitle?: INewTitleData;\r\n content?: Msdyn365.RichText;\r\n}\r\n\r\nexport interface IObrienSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n}\r\n\r\nexport const enum NewTitleTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface INewTitleData {\r\n text: string;\r\n tag?: NewTitleTag;\r\n}\r\n\r\nexport interface IObrienSearchResultContainerProps<T> extends Msdyn365.IModule<T> {\r\n resources: IObrienSearchResultContainerResources;\r\n config: IObrienSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n };\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy, IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\n// Nick's content\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice, ProductRefinerValue, SortColumn,\r\n TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, DimensionAvailabilitiesForProductSearchResultInput, DimensionTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction, getPriceForProductSearchResult,\r\n IDimensionsApp, PriceForProductSearchResultInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps,\r\n INodeProps, isMobile, ITelemetryContent, LabeledDropdown, UncontrolledPagination, VariantType } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { buildListPageUrl, getCollectionProducts, getCollectionRefinersAction, getCurrentUrl,\r\n GetFullProductsByCollectionInput, parseQueryParam, ProductListInventoryFilteringOptions, RefinersByCollectionInput, sortOptions } from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,\r\n Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IObrienSearchResultContainerData } from './obrien-search-result-container.data';\r\nimport { expandRefinersCount, IObrienSearchResultContainerProps } from './obrien-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IObrienSearchResultContainerProps<IObrienSearchResultContainerData> {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n content?: string;\r\n newTitle?: React.ReactNode;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container.\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n refiners: IProductRefinerHierarchy[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent<ISearchResultContainerProps<ISearchResultContainerData>>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<IObrienSearchResultContainerProps<IObrienSearchResultContainerData>, ISearchResultContainerState> {\r\n\r\n @computed get isMobile(): boolean {\r\n return (this._viewport === 'xs' || this._viewport === 'sm');\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize = 'lg';\r\n\r\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement>;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n public constructor(props: IObrienSearchResultContainerProps<IObrienSearchResultContainerData>, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\r\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: []\r\n };\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n\r\n // Initalization of list page\r\n // eslint-disable-next-line max-len -- existing code\r\n /* eslint-disable @typescript-eslint/no-floating-promises, promise/catch-or-return, promise/always-return, promise/prefer-await-to-then -- existing code */\r\n this.props.data.products.then((products) => {\r\n this.props.data.listPageState.then((listPageState) => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing, max-len -- existing code\r\n listPageState.currentPageNumber = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n // eslint-disable-next-line max-len -- existing code\r\n return [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n // eslint-disable-next-line max-len -- existing code\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query && this.props.context.request.query.q ? this.props.context.request.query.q : JSON.stringify({ ProductId: this.props.context.request.query?.productId, Recommendation: this.props.context.request.query?.recommendation }),\r\n !!(this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes),\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\r\n }\r\n });\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber)),\r\n this.defaultPageNumber)\r\n },\r\n count: true, Sorting: listPageState.sortingCritera ?? {}\r\n },\r\n listPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.itemId ?? 0),\r\n this.props.context.request.query?.q ? this.props.context.request.query.q : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId\r\n );\r\n\r\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext).then((refiners) => {\r\n this.setState({ refiners });\r\n }).catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n }\r\n );\r\n\r\n });\r\n });\r\n // eslint-disable-next-line max-len -- existing code\r\n /* eslint-enable @typescript-eslint/no-floating-promises, promise/catch-or-return, promise/always-return, promise/prefer-await-to-then -- Existing code. */\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then((products) => {\r\n this.props.data.listPageState.then((listPageStateFeature) => {\r\n listPageStateFeature.featureProduct = products;\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation?.Text;\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\r\n }\r\n\r\n const context = this.props.context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) && !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) && !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { \r\n imageSettings, \r\n className, \r\n content,\r\n newTitle \r\n } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n <FeatureSearchResultItem\r\n product={searchProduct}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n telemetryContent={this.telemetryContent}\r\n recommendation={this.props.context.request.query && this.props.context.request.query?.recommendation}\r\n />\r\n );\r\n\r\n // Nick's Content\r\n const Content = content && (\r\n <Msdyn365.RichTextComponent\r\n text={content}\r\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\r\n />\r\n );\r\n\r\n const NewTitle = newTitle && (\r\n <div className=\"h1-fixer\">\r\n <Msdyn365.Text\r\n tag={newTitle.tag || 'h1'}\r\n text={newTitle.text}\r\n className=\"title-2022\"\r\n editProps={{onEdit: this.handleTextChange, requestContext:this.props.context.request}}\r\n />\r\n </div>\r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container obrien-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container obrien-search-result-container', className)\r\n },\r\n // eslint-disable-next-line max-len -- existing code\r\n sortByOptions: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown() : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n <ModalToggle\r\n text={resources.modalTitle}\r\n ariaLabel={resources.modalTitle}\r\n innerRef={this._modalToggleRef}\r\n onClick={this._toggleModal}\r\n id='search-result-modal'\r\n />\r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n <ErrorMessage text={errorText} />\r\n ),\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n // eslint-disable-next-line max-len -- existing code\r\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n // Nick's Content\r\n content: Content,\r\n newTitle: NewTitle\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n // Nick's content\r\n public handleParagraphChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.content! = event.target.value;\r\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => this.props.config.newTitle!.text = event.target.value;\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise<void> => {\r\n const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext<IDimensionsApp>),\r\n this.props.context.actionContext);\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise<void> => {\r\n const productsList = (this.props.data.listPageState.result?.activeProducts) ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext);\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal(\r\n {\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle = (data.category.result && SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdownOptions = this._getAllSortByOptions();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdownOptions = dropdownOptions.filter((dropdownOption) => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\r\n }\r\n\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />);\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n // eslint-disable-next-line max-len -- existing code\r\n const skipCount = listPageState && listPageState.currentPageNumber !== null ? (listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)) : ((this.props.context.request.query && +this.props.context.request.query.skip) || 0);\r\n const totalItems = listPageState && listPageState.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />);\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners) ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n }) : data.refiners.result && data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus = validRefiners && validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n\r\n };\r\n\r\n /**\r\n * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n return this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId;\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n />\r\n );\r\n\r\n };\r\n\r\n private readonly _getProducts = (): JSX.Element => {\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature');\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={allowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewslot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n // eslint-disable-next-line max-len -- existing code\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find((searchConfiguration) => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves dropdown options.\r\n * @returns All dropdown options.\r\n */\r\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!searchConfiguration) {\r\n return [];\r\n }\r\n\r\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(\r\n mappedSearchConfig => searchConfiguration.find(item => mappedSearchConfig.key === item.key)\r\n );\r\n\r\n return ArrayExtensions.validValues(mappedSearchConfiguration);\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(mappedSearchConfig => mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n },\r\n 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>\r\n {paginationPreviousText}\r\n </span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>\r\n {paginationNextText}\r\n </span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './obrien-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct, content, newTitle } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n <div className=\"seo-2022 text-center\">\r\n {newTitle ? (\r\n <>\r\n {newTitle}\r\n </>\r\n ) : (\r\n <>\r\n {renderTitle(TitleViewProps)}\r\n </>\r\n )}\r\n {content}\r\n </div>\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n \r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n <div className=\"seo-2022 text-center\">\r\n \r\n {newTitle ? (\r\n <>\r\n {newTitle}\r\n </>\r\n ) : (\r\n <>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n </>\r\n )}\r\n \r\n {content}\r\n\r\n </div>\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n {choiceSummary}\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getCatalogId, IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise<IImageData[]> {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getValidProductImages, validateProductImages } from './utils';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IImageData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps<IMediaGalleryData> {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems<ItemType> {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component<IMediaGalleryProps<IMediaGalleryData>, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map<number, HTMLDivElement> = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject<HTMLAnchorElement> = React.createRef();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps<IMediaGalleryData>) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise<void> {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n this._setImages(images);\n } else {\n this._setImages([]);\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || ObjectExtensions.isNullOrUndefined(product.productVariant?.RecordId)) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant!.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n if (product) {\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n this._setImages(images);\n } else {\n this._setImages([]);\n }\n }\n );\n }\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps<IMediaGalleryData>, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(this.props.data.product.result.ItemId, this.props.context.request.apiSettings);\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: mediaLocation.AltText ?? ''\n };\n });\n const curatedImages = this.props.config.images ?? [];\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps<IMediaGalleryData>),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps<ICarouselProps>,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems<IMediaGalleryThumbnailItemViewProps> {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IImageData, index: number) =>\n this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n )\n )\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems<React.ReactNode> {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(zoomView, item, galleryImageSettings ?? this.defaultGalleryImageSettings, index)\n )\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _setImages(images?: IImageData[]): void {\n const curatedImage = this.props.config.images || [];\n const imagesToSet = this._filterMasterImageFromVariant(images);\n\n this.setState({\n mediaGalleryItems: [...imagesToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(image, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(image, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(image, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(image, imageSettings, index, isInPopup)}</>;\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage={isInPopup}\n bypassHideOnFailure={index === 0}\n />\n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n bypassHideOnFailure={index === 0}\n />\n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent<HTMLLIElement>) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div\n className={`ms-inline-zoom ${this.state.isImageZoomed ? 'zoomed' : ''}`}\n ref={this._refHandler(index)}\n data-scale={this.props.config.dataScale ?? defaultDataScale}\n >\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n onClick={this._onInlineImageClick}\n onMouseOver={(this.state.isImageZoomed && this._inlineZoomImageOnHover) || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n <Image\n role='presentation'\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-inline-zoom__zoomedImg'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n onClick={this._onImageMouseOut}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n id={`${this.props.id}__zoom__${index}`}\n onMouseMove={(this.state.isImageZoomed && inlineZoomImageOnMouseMove) || undefined}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n </div>\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent<HTMLImageElement>): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent<HTMLImageElement>) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent<HTMLImageElement, MouseEvent>): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent<HTMLImageElement>): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent<HTMLImageElement>): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-containerZoom__container'>\n <div\n data-scale={this.props.config.dataScale ?? defaultDataScale}\n className='ms-containerZoom__zoom-lens'\n role='presentation'\n onMouseOut={this._onMouseOutLensContainer}\n onClick={this._onMouseOutLensContainer}\n onMouseMove={(this.state.isImageZoomed && onMouseMoveLensContainer) || undefined}\n />\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n onClick={this._onContainerZoomImageClick}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n onMouseOver={(this.state.isImageZoomed && onMouseOverImageContainer) || undefined}\n id={`${this.props.id}__carousel-item__${index}`}\n shouldSkipToMainImage\n imageFallbackOptimize={this.state.shouldUseOptimizedImage && !this.props.config.allowFullScreen}\n bypassHideOnFailure={index === 0}\n />\n </div>\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n <div className='ms-fullscreen-section'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n fallBackSrc={index === 0 ? this.fallbackImage : image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={this.state.shouldUseOptimizedImage}\n bypassHideOnFailure={index === 0}\n />\n <div className='ms-fullscreen-section__overlay'>\n {}\n <a\n href='javascript:void(0);'\n title={this.props.resources.fullScreenTitleText}\n role='button'\n ref={this.fullScreenOverlayButtonRef}\n onClick={this.openModalDialog}\n className='ms-fullscreen-section__magnifying-glass-icon'\n />\n </div>\n </div>\n );\n }\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n <div className='ms-media-gallery__item'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item__image'\n src='empty'\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings ?? this.defaultGalleryImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail-item__image'\n src='empty'\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings ?? this.defaultThumbnailImageSettings}\n loadFailureBehavior='empty'\n />\n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps<ICarouselProps>;\n const carousel = <Carousel {...carouselprops} />;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n <Module {...MediaGallery}>\n <Node {...CarouselProps} />\n {Modal}\n {_renderThumbnails(Thumbnails)}\n </Module>\n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n <Node {...ThumbnailsContainerProps}>\n <Node {...SingleSlideCarouselComponentProps}>{items && items.map(_renderThumbnailItem)}</Node>\n </Node>\n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return <Node {...ThumbnailItemContainerProps}>{Picture}</Node>;\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartComponent, IAddToCartResources, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { getUrlSync, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * The data on which the component should operate.\n */\nexport interface IAddToCartSelectedData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * The resources needed to render a buy selected component.\n */\nexport interface IAddToCartSelectedResources {\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n}\n\n/**\n * Configuration of a buy selected component.\n */\nexport interface IAddToCartSelectedProps extends IComponentProps<IAddToCartSelectedData> {\n className: string;\n context: ICoreContext;\n\n resources: IAddToCartSelectedResources;\n\n isIcon?: boolean;\n}\n\n/**\n * Get the dialog strings.\n * @param props - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getDialogStrings = (props: IAddToCartSelectedProps): IAddToCartResources => {\n return {\n goToCartText: props.resources.quickOrderGridGoToCartText ?? '',\n continueShoppingText: props.resources.quickOrderGridDialogCloseText ?? '',\n closeNotificationLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n headerItemOneText: props.resources.quickOrderGridSingleItemText ?? '',\n headerItemFormatText: props.resources.quickOrderGridMultiLineItemFormatText ?? '',\n headerLinesFormatText: props.resources.quickOrderGridMultiLinesFormatText ?? '',\n headerMessageText: props.resources.quickOrderGridHeaderMessageText ?? '',\n freePriceText: props.resources.freePriceText ?? '',\n originalPriceText: props.resources.originalPriceText ?? '',\n currentPriceText: props.resources.currentPriceText ?? '',\n addedQuantityText: props.resources.addedQuantityText ?? '',\n buyAgainNotificationTitle: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationTitle ?? '',\n buyAgainNotificationCloseAriaLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? ''\n };\n};\n\n/**\n * Get the dialog strings.\n * @param quickOrder - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getOrderDetails = (quickOrder: QuickOrderTemplate): OrderDetailsProduct[] => {\n const orderDetails: OrderDetailsProduct[] = [];\n for (const quickLine of quickOrder.quickOrderTemplateLines) {\n const quantity = quickLine.productListLine.Quantity;\n const salesLine: SalesLine = {\n Quantity: quantity\n };\n const products = new OrderDetailsProduct(salesLine, quickLine.fullProduct?.ProductDetails);\n orderDetails.push(products);\n }\n return orderDetails;\n};\n\n/**\n * Renders a button which adds given products to the cart.\n * @param props - Configuration of the component.\n * @returns A react element or null if no products were given.\n */\nexport const AddToCartProductListComponent: React.FC<IAddToCartSelectedProps> = (props: IAddToCartSelectedProps): JSX.Element | null => {\n const {\n data: { quickOrderTemplate }\n } = props;\n\n if (quickOrderTemplate?.quickOrderTemplateLines[0].fullProduct?.ProductDetails === undefined) {\n return null;\n }\n const quantity = quickOrderTemplate.quickOrderTemplateLines[0].productListLine.Quantity;\n const buttonLabel = props.resources.quickOrderGridBuySelectedButtonText;\n const buttonAriaLabel = props.resources.quickOrderGridBuySelectedButtonAriaLabel;\n const dialogStrings: IAddToCartResources = getDialogStrings(props);\n const shouldSkipSiteSettings: boolean = true;\n const orderDetailProducts = getOrderDetails(quickOrderTemplate);\n return (\n <AddToCartComponent\n addToCartText={buttonLabel ?? ''}\n outOfStockText=''\n addToCartArialLabel={buttonAriaLabel}\n quantity={quantity}\n id={props.id}\n typeName={props.typeName}\n className={props.className}\n navigationUrl={getUrlSync('cart', props.context.actionContext)}\n data={{ product: quickOrderTemplate.quickOrderTemplateLines[0].fullProduct?.ProductDetails }}\n context={props.context}\n dialogStrings={dialogStrings}\n shouldSkipSiteSettings={shouldSkipSiteSettings}\n orderDetailsProducts={orderDetailProducts}\n />\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddToCartProductListComponent } from './add-to-list';\nimport { IQuickOrderGridActionsViewProps } from './utilities';\n\n/**\n * Interface for quick order grid action data.\n */\nexport interface IQuickOrderGridActionsData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * Interface for quick order grid action props.\n */\nexport interface IQuickOrderGridActionsProps extends IComponentProps<IQuickOrderGridActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n moduleClassName: string;\n typeName: string;\n handlers: {\n removeProductList(productListId: string): void;\n };\n resources: {\n quickOrderGridDeleteButtonText: string;\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n };\n}\n\n/**\n * Remove ProductList Action.\n * @param props -Quick order grid action props.\n */\nconst removeQuickOrderList = (props: IQuickOrderGridActionsProps): void => {\n const {\n data: { quickOrderTemplate },\n handlers\n } = props;\n const { removeProductList } = handlers;\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Need to check data.\n if (quickOrderTemplate && quickOrderTemplate.productList.Id) {\n removeProductList(quickOrderTemplate.productList.Id);\n }\n};\n\n/**\n * Get Addtobag Button.\n * @param props -Order template action props.\n * @returns QuickOrderGrid actions view props.\n */\nconst getQuickOrderGridAddToCartDialog = (props: IQuickOrderGridActionsProps): React.ReactNode => {\n const {\n data: { quickOrderTemplate },\n context,\n moduleClassName,\n resources,\n typeName\n } = props;\n const buttonId = 'quick-order-grid';\n return (\n <AddToCartProductListComponent\n className={`${moduleClassName}-action-bar__buy-selected msc-btn`}\n id={buttonId}\n typeName={typeName}\n data={{ quickOrderTemplate }}\n context={context}\n resources={resources}\n />\n );\n};\n\n/**\n * Remove Quick order grid action.\n * @param props -Quick order grid action props.\n * @returns Remove order template.\n */\nconst removeActionHandler = (props: IQuickOrderGridActionsProps) => () => {\n removeQuickOrderList(props);\n};\n\n/**\n * Quick order grid action view.\n * @param props -Quick Order Grid template action props.\n * @returns QuickOrderGrid actions view props.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name needs to be this.\nexport const QuickOrderGridActionsView = (props: IQuickOrderGridActionsProps): IQuickOrderGridActionsViewProps => {\n const { moduleClassName, resources } = props;\n const { quickOrderGridDeleteButtonText } = resources;\n\n return {\n addProductListToBag: getQuickOrderGridAddToCartDialog(props),\n removeProductList: (\n <Button className={`${moduleClassName}-action-bar__delete-list-button`} onClick={removeActionHandler(props)}>\n {quickOrderGridDeleteButtonText}\n </Button>\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderGridDrawerProps } from './quick-order-grid-drawer-props';\n\n/**\n * Interface for drawer state.\n */\nexport interface IQuickOrderGridDrawerState {\n isOpen: boolean;\n}\n\n/**\n * Placement of glyph.\n */\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Grid Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\nexport class QuickOrderGridDrawer extends React.Component<IQuickOrderGridDrawerProps, IQuickOrderGridDrawerState> {\n private readonly _drawerOpenGlyph: string;\n\n private readonly _drawerCloseGlyph: string;\n\n private readonly _drawerGlyphClass: string;\n\n private _isManuallyToggled: boolean;\n\n public constructor(props: IQuickOrderGridDrawerProps) {\n super(props);\n this._isManuallyToggled = false;\n this.state = { isOpen: props.collapseProps?.isOpen ?? false };\n this._drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n const closeGlyph = this.props.closeGlyph ? this.props.closeGlyph : '';\n if (this.props.isAnimateGlyph) {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : closeGlyph);\n this._drawerCloseGlyph = this._drawerOpenGlyph;\n } else {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n this._drawerCloseGlyph = classnames(this._drawerGlyphClass, closeGlyph);\n }\n }\n\n /**\n * Method to call on click of drawer button.\n * @param event - Product DeliveryOption List.\n */\n public toggle = (event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void => {\n event.preventDefault();\n this._isManuallyToggled = true;\n if (this.props.onToggle) {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n this.props.onToggle(this.state);\n } else {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n }\n };\n\n public shouldComponentUpdate(nextProps: IQuickOrderGridDrawerProps, nextState: IQuickOrderGridDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps: ICollapseProps = { ...this.props.collapseProps };\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this._isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className);\n const drawerButtonClassName = `${this.props.className ? this.props.className : ''}__button`;\n this._isManuallyToggled = false;\n return (\n <div className={drawerClass}>\n <Button\n {...this.props.toggleButtonProps}\n onClick={this.toggle}\n aria-expanded={collapseProps.isOpen}\n block\n disabled={this.props.isDisabled}\n className={drawerButtonClassName}\n color='secondary'\n >\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen, drawerClass)}\n </Button>\n <Collapse {...collapseProps} />\n </div>\n );\n }\n\n private _generateDrawerButtonInnerMarkup(isCollapseState: boolean, drawerClass: string): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n const headingDrawerClass = `${drawerClass}-heading`;\n const descriptionDrawerClass = `${drawerClass}-description`;\n return (\n <>\n <h2 className={classnames(drawerButtonTextClass, headingDrawerClass)}>{this.props.moduleHeadingText}</h2>\n <span className={classnames(drawerButtonTextClass, descriptionDrawerClass)}>{this.props.moduleDescriptionText}</span>\n {this._generateGlyphMarkup('drawer__glyph__end', isCollapseState)}\n </>\n );\n }\n\n private _generateGlyphMarkup(location: string, isCollapseState: boolean): JSX.Element {\n let glyphClass = isCollapseState ? this._drawerOpenGlyph : this._drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return <span className={glyphClass} />;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridState } from './utilities';\n\n/**\n * Interface quick order grid form props.\n */\nexport interface IQuickOrderGridFormProps {\n isAddtoListDisabled: boolean | undefined;\n productTextInput: React.RefObject<HTMLInputElement>;\n quantityTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n maxQuantity?: number;\n moduleClassName: string;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n quickOrderGridState: IQuickOrderGridState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddProductListClick(): Promise<void>;\n}\n\n/**\n * Interface quick order grid form view props.\n */\nexport interface IQuickOrderGridFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToListBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleQuantityChange(event.target.value || '');\n};\n\n/**\n * Quick order grid form component.\n * @param props -Component form props.\n * @returns Quick order gridp view props..\n */\nexport const QuickOrderGridFormComponent = (props: IQuickOrderGridFormProps): IQuickOrderGridFormViewProps => {\n const {\n moduleClassName,\n productTextInput,\n quantityTextInput,\n quickOrderGridState,\n maxChars,\n maxQuantity,\n isAddtoListDisabled,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n handleQuantityChange,\n handleInputChange,\n handleAddProductListClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n <div className={`${moduleClassName}__content-form-main-product`}>\n <h2 className={`${moduleClassName}__content-form-main-product-lable`} aria-label={ariaLabelProduct}>\n {ariaLabelProduct}\n </h2>\n <input\n className={`${moduleClassName}__content-form-main-product-input`}\n type='text'\n aria-label={ariaLabelProduct}\n ref={productTextInput}\n onChange={onInputChange}\n />\n </div>\n );\n\n const quantityNode = (\n <div className={`${moduleClassName}__content-form-main-quantity`}>\n <h2 className={`${moduleClassName}__content-form-main-quantity-lable`} aria-label={ariaLabelQuantity}>\n {ariaLabelQuantity}\n </h2>\n <input\n className={`${moduleClassName}__content-form-main-quantity-input`}\n pattern='[0-9]*'\n ref={quantityTextInput}\n onChange={onQuantityInputChange}\n maxLength={maxChars}\n type='number'\n aria-live='polite'\n aria-label={ariaLabelQuantity}\n aria-valuemin={0}\n aria-valuemax={maxQuantity}\n aria-valuenow={quickOrderGridState.quantity}\n />\n </div>\n );\n\n const addToListNode = (\n <div className={`${moduleClassName}__content-form-main-add-to-product-list`}>\n <Button\n className={`${moduleClassName}__content-form-main-add-to-product-list-button`}\n disabled={isAddtoListDisabled}\n aria-label={ariaLabelAddtoCart}\n onClick={handleAddProductListClick}\n >\n {ariaLabelAddtoCart}\n </Button>\n </div>\n );\n\n const userMessageNode = quickOrderGridState.stateMessage ? (\n <Alert color={quickOrderGridState.stateMessage.statusCssString} isOpen={quickOrderGridState.stateMessage.isOpen}>\n <span className={quickOrderGridState.stateMessage.messageGlyph} />\n <span>{quickOrderGridState.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToListBtn: addToListNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { QuickOrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order grid.\n */\nexport class QuickOrderGridProduct {\n @observable\n public isSelected: boolean;\n\n public readonly productLine: QuickOrderTemplateLine;\n\n public constructor(productLine: QuickOrderTemplateLine) {\n this.productLine = productLine;\n this.isSelected = false;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order grid table header resources.\n */\nexport interface IQuickOrderGridTableHeaderResources {\n quickOrderGridProductNumberText: string;\n quickOrderGridProductText: string;\n quickOrderGridUnitPriceText: string;\n quickOrderGridUnitOfMeasureText: string;\n quickOrderGridQuantityText: string;\n quickOrderGridActionsText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderGridTableHeaderResources;\n}\n\n/**\n * Interface for quick order grid table header component.\n */\nexport interface IQuickOrderGridTableHeaderComponent extends IComponent<IQuickOrderGridTableHeaderProps> {}\n\n/**\n * Get the quick order grid header cells for desktop.\n * @param props -- The quick order grid table header props.\n * @returns The list of cells for quick order grid header component in desktop version.\n */\nconst QuickOrderGridDesktopHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n <th>\n <span className={classnames(`${props.className}__emptyColumn`)} />\n </th>\n <th>{resources.quickOrderGridProductNumberText}</th>\n <th>{resources.quickOrderGridProductText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridUnitPriceText}</th>\n <th>{resources.quickOrderGridUnitOfMeasureText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridQuantityText}</th>\n <th>{resources.quickOrderGridActionsText}</th>\n </>\n );\n};\n\n/**\n * Get the quick order grid header cells for mobile.\n * @param props -- The quick order grid table header props.\n * @returns The quick order grid header component in desktop version.\n */\nconst QuickOrderGridMobileHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={classnames(`${props.className}__emptyColumn`)} />\n <th>{resources.quickOrderGridProductNumberText}</th>\n <th />\n </>\n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderGridTableHeaderComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderGridMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopHeaderCellsComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductPrice } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { QuickOrderGridProduct } from '../../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../../utilities';\n\n/**\n * Data required to render each quick order grid row.\n */\nexport interface IQuickOrderGridTableRowData {\n product: QuickOrderGridProduct;\n}\n\n/**\n * Resources for quick order grid table rows.\n */\nexport interface IQuickOrderGridTableRowResources {\n quickOrderGridQuantityMobileText: string;\n quickOrderGridProductDimensionsSeparator: string;\n quickOrderGridViewDetailsButtonText: string;\n quickOrderGridViewDetailsButtonAriaLabel: string;\n quickOrderGridRemoveItemButtonAriaLabel: string;\n quickOrderGridInputQuantityAriaLabel: string;\n quickOrderGridDecrementButtonAriaLabel: string;\n quickOrderGridIncrementButtonAriaLabel: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableRowProps extends IComponentProps<IQuickOrderGridTableRowData> {\n context: ICoreContext;\n className: string;\n productListLine: ProductListLine;\n price?: ProductPrice;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderGridTableRowResources;\n index: number;\n callbacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * The default image settings for quick order grid table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order grid row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderGridTableRowProductImageComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const fallbackImageUrl = getFallbackImageUrl(product?.ItemId, props.context.actionContext.requestContext.apiSettings);\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n <div className={containerClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n className={`${containerClassName}__product-image`}\n altText={product?.Name}\n src={product?.PrimaryImageUrl ?? ''}\n fallBackSrc={fallbackImageUrl}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n};\n\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderProductPrice = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const { context, moduleId, moduleTypeName, resources } = props;\n const price = props.price;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-quick-order-grid-row__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderUnitOfMeasure = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const price = props.price;\n\n if (price) {\n return (\n <div className='ms-quick-order-grid-row__product-unit-of-measure'>\n {StringExtensions.isNullOrEmpty(props.productListLine.UnitOfMeasure) || price.UnitOfMeasure}\n </div>\n );\n }\n return null;\n};\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (\n onChangeQuantity: (\n orderTemplateLineId: string | undefined,\n quantity: number,\n props?: IQuickOrderGridTableRowProps | undefined\n ) => boolean,\n itemKey: string | undefined,\n props: IQuickOrderGridTableRowProps\n) => (newValue: number) => {\n onChangeQuantity(itemKey, newValue, props);\n return true;\n};\n\n/**\n * On Change function.\n * @param onRemoveItem -On change quantity function.\n * @param quickOrderGridProductKey -QuickOrderGridp Product.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onRemoveHandler = (\n onRemoveItem: (quickOrderGridProduct: QuickOrderGridProduct, props?: IQuickOrderGridTableRowProps | undefined) => void,\n quickOrderGridProductKey: QuickOrderGridProduct,\n props: IQuickOrderGridTableRowProps\n) => () => {\n onRemoveItem(quickOrderGridProductKey, props);\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderGridExtraActionsPopupComponent: React.FC<IQuickOrderGridTableRowProps> = (\n props: IQuickOrderGridTableRowProps\n): JSX.Element | null => {\n const {\n resources: { quickOrderGridViewDetailsButtonAriaLabel, quickOrderGridViewDetailsButtonText }\n } = props;\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const [shouldShowActions, setShowActions] = useState(false);\n let productUrl = '';\n if (product === undefined) {\n return null;\n }\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n const onClickViewDetails = React.useCallback(() => {\n if (MsDyn365.isBrowser) {\n window.location.href = productUrl;\n }\n }, [productUrl]);\n\n const toggle = React.useCallback(() => {\n const shouldShowActionsNewValue = !shouldShowActions;\n if (shouldShowActionsNewValue) {\n if (setShowPreviousActions) {\n setShowPreviousActions(false);\n }\n setShowActions(shouldShowActionsNewValue);\n setShowPreviousActions = setShowActions;\n } else {\n setShowPreviousActions = undefined;\n setShowActions(shouldShowActionsNewValue);\n }\n }, [shouldShowActions, setShowActions]);\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n const actionsContainerClassName = `${className}__actions-container`;\n\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} onClick={toggle} />\n {shouldShowActions && (\n <div className={actionsContainerClassName}>\n <Button\n className={`${actionsContainerClassName}__view-details`}\n onClick={onClickViewDetails}\n aria-label={quickOrderGridViewDetailsButtonAriaLabel}\n >\n {quickOrderGridViewDetailsButtonText}\n </Button>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n >\n {props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Renders quick order grid table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for desktop view.\n */\nexport const QuickOrderGridDesktopTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { quantity } = props;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n if (product !== undefined) {\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>{product.ItemId}</td>\n <td>\n <div className={`${props.className}__product-info`}>\n <a className={`${props.className}__product-name`} href={productUrl}>\n {product.Name}\n </a>\n <span className={`${props.className}__product-dimensions`}>\n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderGridProductDimensionsSeparator)}\n </span>\n </div>\n </td>\n <td className={columnWithNumberClassName}>{renderProductPrice(props)}</td>\n <td>{renderUnitOfMeasure(props)}</td>\n <td className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n max={10}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </td>\n <td>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n onClick={onRemoveHandler(props.callbacks.onRemoveItem, props.data.product, props)}\n />\n </td>\n </>\n );\n }\n\n return null;\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for mobile view.\n */\nexport const QuickOrderGridMobileTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { quantity } = props;\n if (product !== undefined) {\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{product.RecordId}</span>\n <span className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n max={10}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </span>\n </div>\n </td>\n <td>\n <QuickOrderGridExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\n }\n return null;\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderGridTableRowComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n let headerCells: JSX.Element;\n if (isMobileView) {\n headerCells = <QuickOrderGridMobileTableRowCellComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopTableRowCellComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderGridProduct } from '../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../utilities';\nimport {\n IQuickOrderGridTableHeaderResources,\n IQuickOrderGridTableRowResources,\n QuickOrderGridTableHeaderComponent,\n QuickOrderGridTableRowComponent\n} from './components';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderGridTableData {\n quickOrderGridProducts: QuickOrderGridProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderGridTableResources extends IQuickOrderGridTableHeaderResources, IQuickOrderGridTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderGridTableProps extends IComponentProps<IQuickOrderGridTableData> {\n context: ICoreContext;\n className: string;\n moduleId: string;\n moduleTypeName: string;\n\n resources: IQuickOrderGridTableResources;\n isMobileView: boolean;\n imageSettings?: IImageSettings;\n callBacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderGridTableComponent extends IComponent<IQuickOrderGridTableProps> {}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderGridTableComponent: React.FC<IQuickOrderGridTableProps> = (props: IQuickOrderGridTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderGridProducts = props.data.quickOrderGridProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n <table className={props.className}>\n <QuickOrderGridTableHeaderComponent\n context={props.context}\n typeName={props.typeName}\n id={headerClassName}\n className={headerClassName}\n isMobile={isMobile}\n resources={props.resources}\n data={{}}\n />\n {quickOrderGridProducts.map((quickOrderProduct, index) => {\n const price = quickOrderProduct.productLine.fullProduct?.ProductPrice;\n const quantity = quickOrderProduct.productLine.productListLine.Quantity!;\n return (\n <QuickOrderGridTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={quickOrderProduct.productLine.fullProduct?.ProductDetails.RecordId}\n className={rowClassName}\n resources={props.resources}\n isMobile={isMobile}\n price={price}\n moduleId={props.moduleId}\n moduleTypeName={props.moduleTypeName}\n quantity={quantity}\n index={index}\n imageSettings={props.imageSettings}\n productListLine={quickOrderProduct.productLine.productListLine}\n callbacks={props.callBacks}\n data={{\n product: quickOrderProduct\n }}\n />\n );\n })}\n </table>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getProductConfigure,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport {\n ProductDimension,\n ProductDimensionType,\n ProductDimensionValue,\n ProductListsDataActions,\n ProductListType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n addItemToProductListAction,\n AddItemToProductListInput,\n ArrayExtensions,\n createProductList,\n CreateProductListInput,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IDimensionForSelectedVariant,\n IPromiseQueue,\n QuickOrderTemplate,\n QuickOrderTemplateLine,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n Heading,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { ActiveProductListInput } from './actions';\nimport {\n IQuickOrderGridActionsProps,\n IQuickOrderGridActionsViewProps,\n IQuickOrderGridRowCallbacks,\n IQuickOrderGridState,\n QuickOrderGridActionsView,\n QuickOrderGridDrawer,\n QuickOrderGridFormComponent,\n QuickOrderGridProduct,\n QuickOrderGridTableComponent\n} from './components';\nimport { IQuickOrderGridData } from './quick-order-grid.data';\nimport { IQuickOrderGridProps, IQuickOrderGridResources } from './quick-order-grid.props.autogenerated';\n\n/**\n * QuickOrder Grid View props.\n */\nexport interface IQuickOrderGridViewProps extends IQuickOrderGridProps<IQuickOrderGridData> {\n header: JSX.Element;\n actions?: INodeProps;\n isB2bCustomer?: boolean;\n isQuickOrderGridFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n loading?: React.ReactNode;\n quickOrderGridForm: INodeProps;\n quickOrderGridFormProductContent: INodeProps;\n quickOrderGridFormMsgContent: INodeProps;\n quickOrderGridProps: IModuleProps;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n container?: JSX.Element;\n orderActions?: IQuickOrderGridActionsViewProps | null;\n bulkPurchase?: React.ReactNode;\n}\n\n/**\n * QuickOrder Grid View port.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * QuickOrderGrid component.\n * @extends {React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>>}\n */\nclass QuickOrderGrid extends React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>, IQuickOrderGridState> {\n private readonly _productTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly _quantityInput: React.RefObject<HTMLInputElement>;\n\n private readonly _waitTime: number = 500;\n\n private readonly _dimensionUpdateQueueMaxLength: number = 2;\n\n private readonly _errorCssClass: string = 'danger';\n\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n\n private readonly _quickOrderGridFormClass: string;\n\n private readonly _quickOrderGridFormProductContent: string;\n\n private readonly _quickOrderGridFormMsgContent: string;\n\n private readonly _telemetryContent: ITelemetryContent;\n\n private readonly _dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(this._dimensionUpdateQueueMaxLength);\n\n private _dimensions: { [id: number]: string } = {};\n\n private readonly _cssClassNameConfigure: string = 'ms-quick-order_grid__content-form-main';\n\n private readonly _className: string = 'ms-quick-order-grid';\n\n // @ts-expect-error: Debouce needs to be used as type.\n private _cancellabelDebounce: debounce;\n\n private readonly _quickOrderGridCallbacks: IProductDimensionCallbacks = {\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this._dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this._dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: string) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw new Error(error);\n }\n });\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n private readonly _quickOrderGridRowCallbacks: IQuickOrderGridRowCallbacks = {\n /**\n * Method to call remove button.\n * @param line - Grid row product.\n */\n onRemoveItem: (line: QuickOrderGridProduct): void => {\n this._removeItemRowFromTable(line.productLine);\n },\n\n /**\n * Method to call on change quantity button.\n * @param productListLineId - Grid row product list line id.\n * @param quantity - Product quantity.\n * @returns - Falg to get confirmation for action.\n */\n onChangeQuantity: (productListLineId: string | undefined, quantity: number): boolean => {\n return this._changeRowQuantity(productListLineId, quantity);\n }\n };\n\n public constructor(props: IQuickOrderGridProps<IQuickOrderGridData>) {\n super(props);\n this._productTextInput = React.createRef();\n this._quantityInput = React.createRef<HTMLInputElement>();\n\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n isQuickOrderGridFormExpanded: false,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: [],\n isUpdatingDimension: false,\n productListId: ''\n };\n\n this._quickOrderGridFormClass = 'ms-quick-order-grid__content-form';\n this._quickOrderGridFormProductContent = 'ms-quick-order-grid__content-form-main';\n this._quickOrderGridFormMsgContent = 'ms-quick-order-grid__content-form-msg';\n }\n\n @computed public get isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n const quickOrderTemplate = data.quickOrderTemplate;\n\n if (quickOrderTemplate?.result !== undefined) {\n this.setState({\n products: quickOrderTemplate.result.quickOrderTemplateLines,\n productListId: quickOrderTemplate.result.productList.Id\n });\n }\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderGridModuleHeading,\n quickOrderGridModuleDescription,\n quickOrderGridAddtogrid,\n quickOrderGridProductQuantityInputLabel,\n quickOrderGridProductInputLabel,\n quickOrderGridProductDimensionTypeColor,\n quickOrderGridProductDimensionTypeConfiguration,\n quickOrderGridSelectDimensionFormatString,\n quickOrderGridProductDimensionTypeSize,\n quickOrderGridProductDimensionTypeStyle,\n quickOrderGridProductDimensionTypeAmount,\n quickOrderGridModulePageHeading\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderGridSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderGridProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderGridProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderGridProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderGridProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderGridProductDimensionTypeAmount\n };\n\n const { isQuickOrderGridFormExpanded, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const headerClassName = `${this._className}__header`;\n\n const header = (\n <div className={headerClassName}>\n <Heading className={`${headerClassName}-heading`} text={quickOrderGridModulePageHeading} />\n </div>\n );\n\n const viewProps: IQuickOrderGridViewProps = {\n ...(this.props as IQuickOrderGridProps<IQuickOrderGridData>),\n\n quickOrderGridProps: { className: classnames('ms-quick-order-grid', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order-grid__content' },\n isB2bCustomer: customerInfo?.IsB2b,\n header,\n actions: {\n className: `${this._className}-action-bar`,\n tag: 'div'\n },\n drawer: {\n tag: QuickOrderGridDrawer,\n className: `${this._className}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderGridFormExpanded },\n moduleHeadingText: quickOrderGridModuleHeading,\n moduleDescriptionText: quickOrderGridModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this._telemetryContent\n },\n bulkPurchase: this._renderBulkPurchase(),\n quickOrderGridForm: {\n className: `${this._quickOrderGridFormClass} ${isQuickOrderGridFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderGridFormProductContent: {\n className: this._quickOrderGridFormProductContent\n },\n quickOrderGridFormMsgContent: {\n className: this._quickOrderGridFormMsgContent\n },\n form: QuickOrderGridFormComponent({\n productTextInput: this._productTextInput,\n quantityTextInput: this._quantityInput,\n isAddtoListDisabled: !productResponse,\n ariaLabelAddtoCart: quickOrderGridAddtogrid,\n ariaLabelProduct: quickOrderGridProductInputLabel,\n ariaLabelQuantity: quickOrderGridProductQuantityInputLabel,\n maxChars: 50,\n maxQuantity,\n moduleClassName: this._className,\n quickOrderGridState: this.state,\n handleInputChange: this._handleInputChange,\n handleQuantityChange: this._handleQuantityChange,\n handleAddProductListClick: this._addItemToProductListLine\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this._cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderGridSelectDimensionFormatString,\n productConfigureResources,\n this._quickOrderGridCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderGridFormExpanded: this.state.isQuickOrderGridFormExpanded,\n isMobileView: this.state.isMobile,\n container: ArrayExtensions.hasElements(this.state.products) ? this._renderListContainer() : undefined,\n orderActions: this._renderQuickOrderGridActions(quickOrderTemplate?.result)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderQuickOrderGridActions(quickOrderTemplate: QuickOrderTemplate | undefined): IQuickOrderGridActionsViewProps | null {\n const { typeName, context, resources } = this.props;\n const {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n } = resources;\n if (ArrayExtensions.hasElements(quickOrderTemplate?.quickOrderTemplateLines)) {\n const quickOrderGridActions: IQuickOrderGridActionsProps = {\n data: { quickOrderTemplate },\n moduleClassName: this._className,\n id: 'quick-order-grid',\n typeName,\n context,\n handlers: {\n removeProductList: this._removeProductList\n },\n resources: {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n }\n };\n\n return QuickOrderGridActionsView(quickOrderGridActions);\n }\n return null;\n }\n\n /**\n * Renders bulk purchase module.\n * @returns Bulk purchase module react node.\n */\n private _renderBulkPurchase(): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Temporary switch for the feature which is under development.\n if (!this.props.context.app.config.isBulkPurchaseEnabled) {\n return null;\n }\n\n if (!ArrayExtensions.hasElements(this.props.slots.bulkPurchaseSlots)) {\n return null;\n }\n\n const containerClass = `${this._className}__bulk-purchase`;\n return (\n <div className={containerClass}>\n {React.cloneElement(this.props.slots.bulkPurchaseSlots[0] as React.ReactElement, {\n productDimensions: this.state.productDimensions\n })}\n </div>\n );\n }\n\n /**\n * Render list container.\n * @returns JSX element.\n */\n private _renderListContainer(): JSX.Element {\n const containerClass = `${this._className}__table-content`;\n return <div className={containerClass}>{this._renderQuickOrderTable(this._className)}</div>;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderGridProducts(): QuickOrderGridProduct[] {\n const products: QuickOrderTemplateLine[] = this.state.products;\n\n const quickOrderGridProduct: QuickOrderGridProduct[] = products.map((product: QuickOrderTemplateLine) => {\n return new QuickOrderGridProduct(product);\n });\n\n return ArrayExtensions.validValues(quickOrderGridProduct);\n }\n\n /**\n * Method to call on clear button.\n */\n private readonly _removeProductList = () => {\n const { context, data, telemetry, resources } = this.props;\n const { quickOrderTemplate } = data;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && quickOrderTemplate && quickOrderTemplate.result) {\n ProductListsDataActions.deleteAsync({ callerContext: context.actionContext }, quickOrderTemplate.result.productList)\n .then(() => {\n window.location.reload();\n })\n .catch((error: string) => {\n telemetry.warning('[quick-order-grid] Unable to delete product list.');\n telemetry.error(error);\n this._updateStatusState(\n resources.quickOrderGridDeleteProductListFailedText,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n });\n } else {\n telemetry.warning('[quick-order-grid] Failed to delete product list. Product List was not found');\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n <QuickOrderGridTableComponent\n id={tableClassName}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n typeName={this.props.typeName}\n key={tableClassName}\n className={tableClassName}\n data={{\n quickOrderGridProducts: this._initQuickOrderGridProducts()\n }}\n context={this.props.context}\n resources={this.props.resources}\n isMobileView={this.state.isMobile}\n callBacks={this._quickOrderGridRowCallbacks}\n />\n );\n }\n\n /**\n * Method to called on product input change.\n * @param query - Product inventory info.\n */\n private readonly _handleInputChange = (query: string): void => {\n const queryMinLength = 4;\n if (!query || query.length > queryMinLength) {\n this.setState({ quantity: 0, productDimensions: [], productResponse: undefined });\n this._updateStatusState('', '', '', false);\n }\n if (this._cancellabelDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this._cancellabelDebounce.cancel();\n }\n\n const { telemetry, context } = this.props;\n const zeroNumber = 0;\n if (!StringExtensions.isNullOrEmpty(query)) {\n this._cancellabelDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext\n )\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderGridFormExpanded: true\n });\n })\n .catch((error: Error) => {\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this._waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this._cancellabelDebounce();\n }, zeroNumber);\n this.setState({ isQuickOrderGridFormExpanded: true });\n } else {\n this.setState({ productResponse: undefined, isQuickOrderGridFormExpanded: true });\n }\n };\n\n /**\n * Method to called on quantity change.\n * @param value - Quantity value.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n const currentValue = Number.parseInt(value, 10);\n const inputElement = this._quantityInput.current instanceof HTMLInputElement && this._quantityInput.current;\n const quantityChangeDebounceTimeout = 200;\n const minimumQuantity = 0;\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (!Number.isNaN(this.state.quantity) && !(this.state.quantity < minimumQuantity) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, quantityChangeDebounceTimeout)();\n });\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionType - Dimension Type.\n * @param resources - String resources.\n * @returns Dropdwon label.\n */\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update dimension and product in UI.\n */\n private readonly _updateDimensions = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n if (!productResponse || !hasProductDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this._dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // eslint-disable-next-line no-console -- Testing.\n console.log(this.state.isUpdatingDimension);\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const dimensionKey of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[dimensionKey]) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[dimensionKey] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n ?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) ?? dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n // eslint-disable-next-line no-async-promise-executor -- existing code\n const selectedProduct = new Promise<SimpleProduct | null>(async resolve => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n };\n\n /**\n * Method to get updated dimension value.\n * @param productDimensionFull - Product dimension full.\n * @param newValueId - New Dimension value.\n * @returns Dimension Value.\n */\n private readonly _updateDimensionValue = (\n productDimensionFull: IDimensionForSelectedVariant,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionTypeValue - Dimension Type.\n * @param resources - String resources.\n * @param isGiftCard - Flag to check if its a giftcard product.\n * @returns Dropdwon error label.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderGridResources,\n isGiftCard?: boolean\n ): string => {\n const amountErrorMessage = resources.quickOrderGridproductDimensionTypeAmountErrorMessage;\n\n switch (dimensionTypeValue) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.quickOrderGridproductDimensionTypeColorErrorMessage;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.quickOrderGridproductDimensionTypeConfigurationErrorMessage;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.quickOrderGridproductDimensionTypeSizeErrorMessage;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? amountErrorMessage : resources.quickOrderGridproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param productResponse - Simple Product.\n * @param quantity - Product Quantity.\n * @returns Flag to validate productlistline.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- existing code\n const missingDimensions = productResponse.Dimensions?.filter(\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n );\n const minimumQuantity = 0;\n if (ArrayExtensions.hasElements(missingDimensions)) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code\n if (this.state.productDimensionErrorState.configureErrors) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= minimumQuantity) {\n const resources = this.props.resources;\n this._updateStatusState(resources.quickOrderGridWrongQuantityErrorMsg, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n }\n return true;\n };\n\n /**\n * Initial the products on quick order.\n * @param result - Simple Product.\n * @param isGiftCard - Product Quantity.\n * @returns Flag to validate cart.\n */\n private _getConfigureErrors(\n result: ProductDimension[] | undefined,\n isGiftCard?: boolean\n ): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n\n /**\n * Method to call on quantity change in row.\n * @param itemKey - Product Key.\n * @param quantity - Product quantity.\n * @returns Flag to update status.\n */\n private readonly _changeRowQuantity = (itemKey: string | undefined, quantity: number): boolean => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n if (quickOrderTemplate?.result) {\n const quickOrderTemplateLinesData = quickOrderTemplate.result.quickOrderTemplateLines;\n if (ArrayExtensions.hasElements(quickOrderTemplateLinesData)) {\n const orderLineIndex = quickOrderTemplateLinesData.findIndex(\n (lines: QuickOrderTemplateLine) => lines.productListLine.LineId === itemKey\n );\n const newProductListLine = { ...quickOrderTemplateLinesData[orderLineIndex] };\n if (quickOrderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return true;\n }\n const previousQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n ProductListsDataActions.updateProductListLinesAsync(\n { callerContext: context.actionContext },\n quickOrderTemplate.result.productList.Id,\n [line.productListLine]\n )\n .then(list => {\n if (ArrayExtensions.hasElements(list)) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n quickOrderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...quickOrderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedProductList = { ...quickOrderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(\n new ActiveProductListInput(context.actionContext.requestContext),\n updatedProductList\n );\n return true;\n }\n\n return false;\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable to update product quantity.');\n telemetry.error(error.message);\n const userMessage = 'Failed to update quantity value.';\n newProductListLine.productListLine.Quantity = previousQuantity;\n this._updateStatusState(userMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n });\n }\n return false;\n }\n\n return false;\n };\n\n /**\n * Method to call on remove item from table.\n * @param line - Order Template Line.\n */\n private readonly _removeItemRowFromTable = (line: QuickOrderTemplateLine): void => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n\n if (quickOrderTemplate?.result) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken) {\n ProductListsDataActions.removeProductListLinesAsync(\n { callerContext: context.actionContext },\n line.productListLine.ProductListId!,\n [line.productListLine]\n )\n .then(() => {\n window.location.reload(false);\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable remove item from product list grid');\n telemetry.error(error.message);\n });\n } else {\n telemetry.warning('[quick-order-grid] Unable remove items from product list grid user token was not found');\n }\n }\n };\n\n /**\n * Method to call on add item from form.\n */\n private readonly _addItemToProductListLine = async (): Promise<void> => {\n const {\n context: { actionContext },\n resources,\n telemetry\n } = this.props;\n const {\n quickOrderGridAddedToGridSuccessMessage,\n quickOrderGridAddedToGridFailureMessage,\n quickOrderGridAddedToGridDuplicateError\n } = resources;\n const { productResponse, quantity, productListId } = this.state;\n let newProductList = '';\n\n this._updateStatusState('', '', '', false);\n\n if (productResponse !== undefined && this._validateCart(productResponse, quantity)) {\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n newProductList = this._createProductList();\n } else {\n newProductList = this.state.productListId;\n }\n\n if (StringExtensions.isNullOrWhitespace(newProductList)) {\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return;\n }\n\n const input = new AddItemToProductListInput(\n newProductList,\n productResponse.RecordId,\n quantity,\n productResponse.DefaultUnitOfMeasure ?? 'ea'\n );\n\n await addItemToProductListAction(input, actionContext)\n .then(result => {\n if (result.ProductListId) {\n this._updateStatusState(quickOrderGridAddedToGridSuccessMessage, 'success', 'fas fa-check', true);\n window.location.reload();\n this.setState({});\n }\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error trying to Update Grid Line from the quick order grid');\n if (error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n this._updateStatusState(\n quickOrderGridAddedToGridDuplicateError,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n } else {\n this._updateStatusState(\n quickOrderGridAddedToGridFailureMessage,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n }\n });\n }\n };\n\n /**\n * Method to create product list.\n * @returns - ProductListId.\n */\n private readonly _createProductList = (): string => {\n const {\n context: { actionContext },\n telemetry,\n resources\n } = this.props;\n const { productListId } = this.state;\n const { quickOrderGridAddedToGridFailureMessage } = resources;\n\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n const input = new CreateProductListInput('', ProductListType.QuickOrder);\n\n createProductList(input, actionContext)\n .then(result => {\n if (!StringExtensions.isNullOrWhitespace(result.Id)) {\n this.setState({ productListId: result.Id });\n return result.Id;\n }\n return '';\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error on creating productlist from quick order grid');\n telemetry.error(error.message);\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return '';\n });\n return '';\n }\n\n return productListId;\n };\n\n /**\n * Method to create product list.\n * @param messageText - Message Text.\n * @param statusCssString - Css class names.\n * @param messageGlyph - Glyph string.\n * @param isOpen - Flag to show.\n */\n private readonly _updateStatusState = (messageText: string, statusCssString: string, messageGlyph: string, isOpen: boolean): void => {\n this.setState({\n // eslint-disable-next-line react/no-unused-state -- Showing user message in Form component.\n stateMessage: {\n messageText,\n statusCssString,\n messageGlyph,\n isOpen\n }\n });\n };\n}\nexport default QuickOrderGrid;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridFormViewProps } from './components';\nimport { IQuickOrderGridViewProps } from './quick-order-grid';\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...containerProps}>\n <Node {...labelContainerProps}>{heading}</Node>\n {errors}\n {select}\n </Node>\n );\n};\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return <Node {...containerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n }\n return null;\n};\n\n/**\n * Render product dimension/configure container.\n * @param form -- Form props.\n * @param isMobileView -- Flag to check mobile view.\n * @param quickOrderForm - Form component container.\n * @param quickOrderProductContent - Form product component.\n * @param quickOrderMessageContent - Form user message component.\n * @param configure - Product Dimension component.\n * @returns Jsx element of quick order form component.\n */\nconst renderForm = (\n form: IQuickOrderGridFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMessageContent: INodeProps,\n configure?: IProductDimensionConfigureViewProps\n) => {\n return isMobileView ? (\n <Node {...quickOrderForm}>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n {form.addToListBtn}\n </Node>\n </Node>\n ) : (\n <Node {...quickOrderForm}>\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToListBtn}\n </Node>\n </Node>\n );\n};\n\n/**\n * Retrieves current sort criteria.\n * @param props - QuickOrder Grid view props.\n * @returns - Render View.\n */\nconst quickOrderGridView: React.FC<IQuickOrderGridViewProps> = props => {\n const {\n quickOrderGridProps,\n contentProps,\n form,\n quickOrderGridForm,\n drawer,\n configure,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n isMobileView,\n header,\n container,\n actions,\n orderActions\n } = props;\n\n return (\n <Module {...quickOrderGridProps}>\n {header}\n {actions && (\n <Node {...actions}>\n {orderActions?.addProductListToBag}\n {orderActions?.removeProductList}\n </Node>\n )}\n <Node {...drawer}>\n <Node {...contentProps}>\n {renderForm(\n form as IQuickOrderGridFormViewProps,\n isMobileView,\n quickOrderGridForm,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n configure\n )}\n {props.bulkPurchase}\n </Node>\n </Node>\n {container}\n </Module>\n );\n};\n\nexport default quickOrderGridView;\n"],"names":["Logo","React","constructor","props","super","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","this","attributes","getTelemetryAttributes","render","className","_renderLogo","config","link","linkUrl","destinationUrl","Object","assign","href","ariaLabel","target","openInNewTab","undefined","_renderImage","defaultImageSettings","viewports","xs","q","w","h","lg","lazyload","Msdyn365","image","gridSettings","imageSettings","loadFailureBehavior","editProps","key","requestContext","NavIcon","Button","onClick","toggleNavBar","title","resources","mobileHamburgerAriaLabel","isExpanded","__decorate","observer","HeaderPreferredStore","handleClick","_findPreferreStoreOnClick","data","storeSelectorStateManager","result","slots","storeSelector","length","storeName","preferredStore","StoreName","headerPreferredStoreText","color","headerPreferredStoreAriaLabel","async","modules","storeSelectorId","keys","id","openDialog","showMapViewLink","onLocationSelected","orgUnitLocation","Promise","resolve","catch","error","telemetry","message","debug","Header","handleLinkTextChange","linkIndex","event","myAccountLinks","linkText","value","popOverRef","_toggleNavbar","bind","_togglePopover","_keydown","state","mobileMenuCollapsed","signinPopoverOpen","getTelemetryObject","context","request","telemetryPageName","friendlyName","displayName","_this$props$data$acco","customer","accountInformation","FirstName","Name","componentDidMount","MsDyn365","isBrowser","window","addEventListener","componentWillUnmount","removeEventListener","typeName","cart","user","cartLabel","cartQtyLabel","logoLink","logoImage","headerClassName","classnames","navbarKey","cartIconSlot","_getSlot","menuBarSlot","promoBannerSlot","searchSlot","siteOptionsSlot","preferredStoreSlot","viewProps","_objectSpread","logo","wishListIconDesktop","WishListIconComponent","showButtonTooltip","wishlistTooltipText","wishListIconMobile","cartIcon","CartIconComponent","navIcon","targetId","menuBar","promoBanner","search","siteOptions","HeaderTag","moduleProps","tag","HeaderContainer","HeaderTopBarContainer","Divider","MobileMenuContainer","Modal","isOpen","wrapClassName","MobileMenuHeader","ModalHeader","toggle","MobileMenuBodyContainer","ModalBody","MobileMenuLinksContainer","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","Popover","placement","signInLink","_getSigninButton","signOutLink","_getSignOutButton","accountInfoDropdownButton","_getAccountInfoDropdownButton","accountLinks","_getAccountLinks","renderView","slotName","SignIn","signInLinkText","signInUrl","signInLinkAriaText","onTelemetryClick","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","MyProfile","innerRef","map","cta","index","contentAction","etext","editableLink","role","additionalProperties","onTextChange","setState","e","keyCode","KeyCodes","Escape","computed","renderCustomerName","_renderReactFragment","items","slot","navigate","setNavigate","useState","changeBackground","scrollY","Node","_renderDesktopAccountBlock","Collapse","renderForMobile","accountClassName","Drawer","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","_renderMobileAccountBlock","_renderCollapseMenu","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","push","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","closeButtonGlyph","_onClick","preventDefault","stopPropagation","currentTarget","clearAll","getAttribute","includes","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedRefinersMap","_this$props$context","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","app","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","filter","choice","parent","hierarchy","RecordId","_getKeyForRefinerValue","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","clearAllAttributes","item","attribute","ref","urlBuilder","choiceFormat","choiceRangeValueFormat","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","warning","replace","_formatPrice","UnitText","LeftValueBoundLocalizedString","amount","currency","trace","cultureFormatter","formatCurrency","Number","selected","textContent","trim","ErrorMessage","_ref","text","FeatureSearchResultItem","product","recommendation","productName","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","apiSettings","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","renderProductPlacementImage","PrimaryImageUrl","Link","ModalToggle","modalNode","autoFocus","applicationNode","returnFocusRef","returnRef","onModalToggle","zIndex","modalHeaderNode","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","getInventoryLabel","ArrayExtensions","hasElements","AttributeValues","inventoryAttribute","TextValue","ProductSearchResultItems","products","moduleType","moduleId","allowBackNavigation","quickviewSlot","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","currencyCode","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","input","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","_this$props","isDisabled","productCountAriaLabel","singleProductCountAriaLabel","children","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","Rating","_renderRating","productText","productCount","Count","refineMenuItemAriaLabel","format","_getRefinerUrl","tabIndex","_renderSwatch","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","dimensionType","toLocaleLowerCase","hasColor","StringExtensions","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","swatchItems","checkIfShouldDisplayAsSwatch","itemId","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","isMobile","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","expandRefinersCount","NewTitleTag","SearchResultContainer","SearchResultContainer_1","_this$props$context$r6","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","catalogId","getCatalogId","handleParagraphChange","content","handleTextChange","newTitle","_getProductsDimensionsAvailabilities","_this$props$data$list","_this$props$data$list2","productsList","listPageState","activeProducts","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","category","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","totalProductCount","count","numberOfProducts","oneProduct","TitleContainer","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","_shouldHideFromRefiners","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod","_getChoiceSummary","_this$props$data$prod2","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$data$feat","_this$props$data$prod3","breaCrumbType","breadcrumbType","quickviewslot","quickview","isPriceMinMaxFeatureState","featureState","IsEnabled","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","validValues","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","device","Type","_updateViewport","productPrices","pending","rangeNameFormat","validationErrorNotNumber","validationErrorNotRange","then","querySorting","sorting","parse","decodeURIComponent","pageSize","hydrateRefinersFromUrl","reaction","_this$props$context$r","_this$props$context$r2","GetFullProductsByCollectionInput","Paging","Top","Skip","Math","Sorting","ProductId","productId","Recommendation","includeAttributes","getCollectionProducts","productResults","_this$props$context$a","_this$props$context$a2","enableAffiliationBasedPricing","isAuthenticated","_listPageState$curren","_listPageState$sortin","_listPageState$active","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","featureProduct","listPageStateFeature","static","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a3","_this$props$context$a4","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","_this$props$context$r7","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","Content","onEdit","NewTitle","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","_getViewport","variant","VariantType","Browser","Viewport","observable","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","_props$context$action","Module","modalCloseButtonRef","_findPreferredStoreOnClick","parentElementRef","rel","imagePropertyName","shouldSkipToMainImage","_this$props$config$my","hasSigninerror","isOBORequest","workerName","customerName","firstName","name","signUpCustomerNotFoundTitle","signUpMultipleCustomerFoundTitle","closeNotificationLabel","signinNotificationError","_getSigninNotification","NotificationsManager","instance","addNotification","ErrorNotification","wishlists","shouldShowWishlistCount","disableTooltip","headerToggleClass","wishlistCount","CommerceListLines","wishlistCountLabel","isDispayWishlistCount","headerAriaLabel","switchCustomerLink","_getSwitchCustomerButton","_user$signOutUrl","SwitchCustomer","isOBOAccountSelected","cookies","getAccountSelectionCookie","switchCustomerLinkAriaText","switchCustomerLinkText","getBusinessPartnerSelectionUrl","removeAccountSelectionCookie","shoppingAsText","route","URL","location","param","searchParams","delete","signUpCustomerNotFound","signUpMultipleCustomerFound","retailServerErrorCode","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","ariaValueText","maxValueSliderThumbAriaLabel","formAttrs","ariaAttributes","validateMediaLocationAsync","mediaLocation","imageData","Uri","AltText","IsApplicableForChildEntities","isApplicableForChildEntities","http","XMLHttpRequest","open","status","send","_unused","getValidProductImages","channelId","selectedProduct","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","mediaLocations","pairs","pair","exception","validateProductImages","MediaGallery","_this","_props$config$zoomedI","_inlineZoomDivRef","fullScreenOverlayButtonRef","mediaGalleryImages","defaultGalleryImageSettings","sm","md","cropFocalRegion","defaultThumbnailImageSettings","onExiting","animating","onExited","removeInlineZoomStyle","isLastItem","nextIndex","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","_getCarouselItem","isInPopup","arguments","bypassHideOnFailure","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","_refHandler","divRef","set","which","Enter","Space","openModalDialog","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","ontoggle","galleryCarousel","ImagefullView","isImageZoomed","isInitialLoad","skipImageValidation","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","_this$props$config$im","source","imageSource","shouldUpdateOnPartialDimensionSelection","_setRenderType","mediaLocationsForSelectedVariant","_this$props$config$th","thumbnailImageSettings","_setImages","_this$props$config$th2","productVariant","_product$productVaria","ObjectExtensions","isNullOrUndefined","_this$props$config$th3","_this$props$config$th4","_this$props$config$im2","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","emptyPlaceHolderImage","placeholderImageName","_this$props$config$im3","_mediaLocation$Uri","_mediaLocation$AltTex","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","_this$state$mediaGall","lastUpdate","defaultKey","_getEmptyThumbnailItem","_this$state$mediaGall2","zoomView","_renderEmptyImage","curatedImage","imagesToSet","Date","now","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","_handleMobileViewZoomedImageClick","mobileZoomedInImageClassName","style","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","add","scrollTo","_this$props$config$da4","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","fullScreenTitleText","_product$PrimaryImage","_this$fullScreenOverl","parentDiv","querySelector","removeAttribute","removeContainerZoomStyle","_renderThumbnails","thumbnails","_renderThumbnailItem","thumbnail","AddToCartProductListComponent","_quickOrderTemplate$q","_quickOrderTemplate$q2","quickOrderTemplate","quickOrderTemplateLines","fullProduct","ProductDetails","quantity","productListLine","Quantity","buttonLabel","quickOrderGridBuySelectedButtonText","buttonAriaLabel","quickOrderGridBuySelectedButtonAriaLabel","dialogStrings","_props$resources$quic","_props$resources$quic2","_props$resources$quic3","_props$resources$quic4","_props$resources$quic5","_props$resources$quic6","_props$resources$quic7","_props$resources$free","_props$resources$orig","_props$resources$curr","_props$resources$adde","_props$resources$quic8","_props$resources$quic9","goToCartText","quickOrderGridGoToCartText","continueShoppingText","quickOrderGridDialogCloseText","quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel","headerItemOneText","quickOrderGridSingleItemText","headerItemFormatText","quickOrderGridMultiLineItemFormatText","headerLinesFormatText","quickOrderGridMultiLinesFormatText","headerMessageText","quickOrderGridHeaderMessageText","addedQuantityText","buyAgainNotificationTitle","quickOrderGridBuySelectedAddingToCartErrorNotificationTitle","buyAgainNotificationCloseAriaLabel","getDialogStrings","orderDetailProducts","quickOrder","orderDetails","quickLine","_quickLine$fullProduc","salesLine","OrderDetailsProduct","getOrderDetails","AddToCartComponent","addToCartText","outOfStockText","addToCartArialLabel","navigationUrl","getUrlSync","shouldSkipSiteSettings","orderDetailsProducts","getQuickOrderGridAddToCartDialog","moduleClassName","removeActionHandler","handlers","removeProductList","productList","Id","removeQuickOrderList","QuickOrderGridDrawer","_props$collapseProps$","_props$collapseProps","_isManuallyToggled","previousState","collapseProps","_drawerGlyphClass","toggleGlyphClassName","isAnimateGlyph","_drawerOpenGlyph","_drawerCloseGlyph","drawerClass","drawerButtonClassName","toggleButtonProps","block","disabled","_generateDrawerButtonInnerMarkup","isCollapseState","drawerButtonTextClass","toggleButtonClassName","headingDrawerClass","descriptionDrawerClass","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderGridFormComponent","productTextInput","quantityTextInput","quickOrderGridState","maxChars","maxQuantity","isAddtoListDisabled","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleInputChange","handleAddProductListClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","type","quantityNode","pattern","maxLength","addToListBtn","userMessage","stateMessage","Alert","statusCssString","messageGlyph","messageText","QuickOrderGridProduct","productLine","isSelected","QuickOrderGridDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderGridProductNumberText","quickOrderGridProductText","quickOrderGridUnitPriceText","quickOrderGridUnitOfMeasureText","quickOrderGridQuantityText","quickOrderGridActionsText","QuickOrderGridMobileHeaderCellsComponent","QuickOrderGridTableHeaderComponent","rowClassName","headerCells","QuickOrderGridTableRowProductImageComponent","_props$data$product$p","_props$imageSettings","fallbackImageUrl","containerClassName","setShowPreviousActions","onChangeHandler","onChangeQuantity","itemKey","newValue","onRemoveHandler","onRemoveItem","quickOrderGridProductKey","QuickOrderGridExtraActionsPopupComponent","_props$data$product$p2","quickOrderGridViewDetailsButtonAriaLabel","quickOrderGridViewDetailsButtonText","shouldShowActions","setShowActions","onClickViewDetails","shouldShowActionsNewValue","actionsContainerClassName","quickOrderGridRemoveItemButtonAriaLabel","QuickOrderGridDesktopTableRowCellComponent","_props$data$product$p3","_product$Dimensions","_productListLine$Line","Dimensions","dimension","_dimension$DimensionV","DimensionValue","Value","dimensionValue","join","quickOrderGridProductDimensionsSeparator","price","PriceComponent","renderProductPrice","isNullOrEmpty","UnitOfMeasure","renderUnitOfMeasure","IncrementalQuantity","LineId","currentCount","inputQuantityAriaLabel","quickOrderGridInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderGridDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderGridIncrementButtonAriaLabel","isGiftCard","IsGiftCard","callbacks","QuickOrderGridMobileTableRowCellComponent","_props$data$product$p4","_productListLine$Line2","QuickOrderGridTableRowComponent","QuickOrderGridTableComponent","setIsMobile","quickOrderGridProducts","updateViewport","quickOrderProduct","_quickOrderProduct$pr","_quickOrderProduct$pr2","ProductPrice","callBacks","QuickOrderGrid","_waitTime","_dimensionUpdateQueueMaxLength","_errorCssClass","_errorCssGlyphClass","_dimensionUpdateQueue","FinitePromiseQueue","_dimensions","_cssClassNameConfigure","_className","_quickOrderGridCallbacks","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","Error","getDropdownName","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_quickOrderGridRowCallbacks","line","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","token","ProductListsDataActions","callerContext","reload","_updateStatusState","quickOrderGridDeleteProductListFailedText","_handleInputChange","productDimensions","productResponse","_cancellabelDebounce","cancel","isQuickOrderGridFormExpanded","_debounce","getScanResult","GetScanResultInput","results","Product","ProductDimensionFull","_handleQuantityChange","currentValue","inputElement","_quantityInput","HTMLInputElement","setAttribute","_this$state$productRe","ProductDimensionType","Color","productDimensionTypeColor","Configuration","productDimensionTypeConfiguration","Size","productDimensionTypeSize","Style","productDimensionTypeAmount","productDimensionTypeStyle","hasProductDimensions","dimensionsToUpdate","console","log","productDimensionErrorState","otherError","clearOtherErrorState","dimensionKey","configureErrors","errorState","mappedDimensions","_this$_updateDimensio","DimensionTypeValue","_updateDimensionValue","ExtensionProperties","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","productDimensionFull","newValueId","DimensionValues","_getDimensionErrorString","dimensionTypeValue","amountErrorMessage","quickOrderGridproductDimensionTypeAmountErrorMessage","quickOrderGridproductDimensionTypeColorErrorMessage","quickOrderGridproductDimensionTypeConfigurationErrorMessage","quickOrderGridproductDimensionTypeSizeErrorMessage","quickOrderGridproductDimensionTypeStyleErrorMessage","_validateCart","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderGridWrongQuantityErrorMsg","quickOrderTemplateLinesData","orderLineIndex","lines","newProductListLine","previousQuantity","newLine","updatedLines","updatedProductList","ProductListLines","update","ActiveProductListInput","ProductListId","_addItemToProductListLine","quickOrderGridAddedToGridSuccessMessage","quickOrderGridAddedToGridFailureMessage","quickOrderGridAddedToGridDuplicateError","productListId","newProductList","_productResponse$Defa","_createProductList","AddItemToProductListInput","DefaultUnitOfMeasure","addItemToProductListAction","CreateProductListInput","ProductListType","QuickOrder","createProductList","_productTextInput","_telemetryContent","_quickOrderGridFormClass","_quickOrderGridFormProductContent","_quickOrderGridFormMsgContent","customerInformation","customerInfo","quickOrderGridModuleHeading","quickOrderGridModuleDescription","quickOrderGridAddtogrid","quickOrderGridProductQuantityInputLabel","quickOrderGridProductInputLabel","quickOrderGridProductDimensionTypeColor","quickOrderGridProductDimensionTypeConfiguration","quickOrderGridSelectDimensionFormatString","quickOrderGridProductDimensionTypeSize","quickOrderGridProductDimensionTypeStyle","quickOrderGridProductDimensionTypeAmount","quickOrderGridModulePageHeading","productConfigureResources","selectDimensionFormatString","header","Heading","quickOrderGridProps","contentProps","isB2bCustomer","IsB2b","actions","drawer","bulkPurchase","_renderBulkPurchase","quickOrderGridForm","quickOrderGridFormProductContent","quickOrderGridFormMsgContent","form","configure","getProductConfigure","container","_renderListContainer","orderActions","_renderQuickOrderGridActions","quickOrderGridDeleteButtonText","addProductListToBag","QuickOrderGridActionsView","isBulkPurchaseEnabled","bulkPurchaseSlots","containerClass","_renderQuickOrderTable","_initQuickOrderGridProducts","quickOrderGridProduct","tableClassName","dimensions","renderConfigureDropdown","dropdown","containerProps","labelContainerProps","errors","select","renderConfigure","dropdowns","renderForm","quickOrderForm","quickOrderProductContent","quickOrderMessageContent"],"sourceRoot":""}