{"version":3,"file":"static/js/6.220ed7d02b199e326457.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-promo-banner/components/close-button.tsx?6326","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-promo-banner/components/links.tsx?8a5a","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-promo-banner/components/text.tsx?4ec1","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-promo-banner/absolute-promo-banner.tsx?9180","webpack://Msdyn365.Commerce.Online/./src/modules/absolute-promo-banner/absolute-promo-banner.view.tsx?57d2","webpack://Msdyn365.Commerce.Online/./src/modules/base-header/components/logo.tsx?5652","webpack://Msdyn365.Commerce.Online/./src/modules/base-header/components/nav-icon.tsx?115c","webpack://Msdyn365.Commerce.Online/./src/modules/base-header/components/base-header-preferred-store.tsx?cfec","webpack://Msdyn365.Commerce.Online/./src/modules/base-header/base-header.tsx?7992","webpack://Msdyn365.Commerce.Online/./src/modules/base-header/base-header.view.tsx?a658","webpack://Msdyn365.Commerce.Online/./src/modules/freedom-header/components/logo.tsx?d857","webpack://Msdyn365.Commerce.Online/./src/modules/freedom-header/components/nav-icon.tsx?8633","webpack://Msdyn365.Commerce.Online/./src/modules/freedom-header/components/freedom-header-preferred-store.tsx?9b07","webpack://Msdyn365.Commerce.Online/./src/modules/freedom-header/freedom-header.tsx?0910","webpack://Msdyn365.Commerce.Online/./src/modules/freedom-header/freedom-header.view.tsx?2205","webpack://Msdyn365.Commerce.Online/./src/modules/hosports-b2b-header/components/logo.tsx?65af","webpack://Msdyn365.Commerce.Online/./src/modules/hosports-b2b-header/components/nav-icon.tsx?1b7b","webpack://Msdyn365.Commerce.Online/./src/modules/hosports-b2b-header/components/hosports-b2b-header-preferred-store.tsx?5754","webpack://Msdyn365.Commerce.Online/./src/modules/hosports-b2b-header/hosports-b2b-header.tsx?ef00","webpack://Msdyn365.Commerce.Online/./src/modules/hosports-b2b-header/hosports-b2b-header.view.tsx?ecad","webpack://Msdyn365.Commerce.Online/./src/modules/liquid-header-2021/components/logo.tsx?7e67","webpack://Msdyn365.Commerce.Online/./src/modules/liquid-header-2021/components/nav-icon.tsx?1eec","webpack://Msdyn365.Commerce.Online/./src/modules/liquid-header-2021/components/liquid-header-2021-preferred-store.tsx?722e","webpack://Msdyn365.Commerce.Online/./src/modules/liquid-header-2021/liquid-header-2021.tsx?e59d","webpack://Msdyn365.Commerce.Online/./src/modules/liquid-header-2021/liquid-header-2021.view.tsx?1e34","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-promo-banner/components/close-button.tsx?5a63","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-promo-banner/components/links.tsx?0190","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-promo-banner/components/text.tsx?0994","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-promo-banner/obrien-promo-banner.tsx?48ed","webpack://Msdyn365.Commerce.Online/./src/modules/obrien-promo-banner/obrien-promo-banner.view.tsx?c979","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/active-image-utilities/active-product.tsx?69b2","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.tsx?00d3","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.view.tsx?a935","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.tsx?9fd5","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.view.tsx?feac","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.tsx?80d4","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.view.tsx?d82f","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/promocode.component.tsx?d9d6","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.tsx?4008","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.view.tsx?5d36","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/links.tsx?2587","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/text.tsx?782b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.view.tsx?7f77","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","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-drawer.tsx?f8b4","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-form.tsx?eb54","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-product.ts?7702","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/components/quick-order-table-header-component.tsx?49e7","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/components/quick-order-table-row-component.tsx?e487","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/components/quick-order-table/quick-order-table-component.tsx?46c1","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/quick-order.tsx?ef21","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order/quick-order.view.tsx?a96d","webpack://Msdyn365.Commerce.Online/./src/actions/submit-user-review.ts?ac78","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/submit-user-review-input.ts?3afb","webpack://Msdyn365.Commerce.Online/./src/common/review-modal.tsx?54a9","webpack://Msdyn365.Commerce.Online/./src/common/rnrInterface.ts?f761","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/component/components.tsx?f324","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.tsx?f6bc","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.view.tsx?5bff","webpack://Msdyn365.Commerce.Online/./src/actions/report-review-concern.ts?bf43","webpack://Msdyn365.Commerce.Online/./src/actions/submit-helpfulness-vote.ts?a8ab","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/report-review-concern-input.ts?b071","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/components.tsx?033b","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/report-review-modal.tsx?53d3","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/components/review-card.tsx?6bbd","webpack://Msdyn365.Commerce.Online/./src/actions/inputs/submit-helpfulness-vote-input.ts?07aa","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/reviews-list.tsx?37e8","webpack://Msdyn365.Commerce.Online/./src/modules/reviews-list/reviews-list.view.tsx?0e4a","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/components/components.tsx?3575","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/write-review.tsx?9afc","webpack://Msdyn365.Commerce.Online/./src/modules/write-review/write-review.view.tsx?b867","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/title.tsx?c269","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.tsx?bbcb","webpack://Msdyn365.Commerce.Online/./src/modules/social-share-item/social-share-item.view.tsx?2d3e","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/components/additional-content.tsx?b368","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.tsx?53e5","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.view.tsx?fedb","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/cart-icon.view.tsx?7ec9","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/ratings-histogram.view.tsx?bb5b"],"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 * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPromoBannerCloseButton {\r\n closeButtonAriaLabel?: string;\r\n label?: string;\r\n telemetryContent?: ITelemetryContent;\r\n onClose(): void;\r\n\r\n}\r\n\r\nexport const PromoBannerCloseButton: React.FC = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\r\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\r\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n \r\n );\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\n/* eslint-disable no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ILinksData } from '../absolute-promo-banner.props.autogenerated';\r\n\r\nexport interface IPromoBannerLinks {\r\n links: ILinksData[];\r\n requestContext: Msdyn365.IRequestContext;\r\n telemetryContent: ITelemetryContent;\r\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\r\n}\r\n\r\nexport const PromoBannerLinks: React.FC = ({ links, requestContext, onTextChange, telemetryContent }) => {\r\n const editableLinks = _mapEditableLinks(links, telemetryContent);\r\n return(\r\n \r\n {editableLinks && editableLinks.length ?\r\n \r\n : null\r\n }\r\n \r\n );\r\n};\r\n\r\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\r\n if(!linkdata || linkdata.length === 0) {\r\n return null;\r\n }\r\n const editableLinks: Msdyn365.ILinksData[] = [];\r\n linkdata.forEach((link,index) => {\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\r\n const linkText = link.linkText ? link.linkText : '';\r\n payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\r\n const editableLink: Msdyn365.ILinksData = {\r\n ariaLabel: link.ariaLabel,\r\n className: 'ms-promo-banner__link',\r\n linkText: link.linkText,\r\n linkUrl: link.linkUrl.destinationUrl,\r\n openInNewTab: link.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes,\r\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\r\n };\r\n editableLinks.push(editableLink);\r\n });\r\n\r\n return editableLinks;\r\n};\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\n/* eslint-disable no-duplicate-imports */\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface IPromoBannerText {\r\n text: string;\r\n requestContext: Msdyn365.IRequestContext;\r\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\r\n}\r\n\r\nexport const PromoBannerText: React.FC = ({ text, onTextChange, requestContext }) => {\r\n return(\r\n \r\n );\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\n/* eslint-disable no-duplicate-imports */\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\r\nimport { IBannerMessagesData, IAbsolutePromoBannerProps } from './absolute-promo-banner.props.autogenerated';\r\n\r\nexport interface IPromoBannerState {\r\n animating: boolean;\r\n isVisible: boolean;\r\n activeIndex: number;\r\n}\r\n\r\nexport interface IPromoBannerViewProps extends IAbsolutePromoBannerProps<{}>, IPromoBannerState {\r\n promoBannerProps: IModuleProps;\r\n contentProps: INodeProps ;\r\n bannerMessages: IBannerMessagesData[];\r\n PromoBannerTextProps: INodeProps;\r\n PromoBannerLinksProps: INodeProps;\r\n CarouselProps: INodeProps;\r\n closeButton?: React.ReactNode;\r\n className: string;\r\n onDismiss(): void;\r\n handleText(): void;\r\n handleLinks(): void;\r\n}\r\n\r\n/**\r\n *\r\n * PromoBannerModule component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass PromoBanner extends React.PureComponent, IPromoBannerState> {\r\n public state: IPromoBannerState = {\r\n animating: false,\r\n isVisible: true,\r\n activeIndex: 0\r\n };\r\n\r\n private telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n\r\n public render(): JSX.Element | null {\r\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className= '' } = this.props.config;\r\n const { closeButtonAriaLabel, closeButtonLabel } = this.props.resources;\r\n const { isVisible, activeIndex } = this.state;\r\n\r\n if (!isVisible) {\r\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const viewProps = {\r\n // Context for telemetry and raw data for C1 to do customization\r\n // Including computed data, state data and methods\r\n ...this.props,\r\n className: classnames('ms-promo-banner', className),\r\n isVisible, // state data\r\n onDismiss: this._onDismiss, // methods\r\n handleLinks: this.handleLinkTextChange,\r\n handleText: this.handleTextChange,\r\n\r\n promoBannerProps: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\r\n PromoBannerTextProps: {\r\n tag: PromoBannerText\r\n },\r\n PromoBannerLinksProps: {\r\n tag: PromoBannerLinks,\r\n telemetryContent: this.telemetryContent\r\n },\r\n contentProps: { className: 'ms-promo-banner__content absolute-promo-container' },\r\n bannerMessages: bannerMessages,\r\n activeIndex: activeIndex,\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-promo-banner__carousel',\r\n activeIndex: activeIndex,\r\n next: this._next,\r\n previous: this._previous,\r\n onIndicatorsClickHandler: this._goToIndex,\r\n hideIndicator: hideFlipper,\r\n interval: interval,\r\n hideFlipper: hideFlipper,\r\n autoplay: autoplay\r\n },\r\n closeButton: dismissEnabled && \r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\r\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\r\n this.props.config.bannerMessages[0].text = event.target.value;\r\n }\r\n }\r\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\r\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\r\n const links = this.props.config.bannerMessages[1].links;\r\n if(links) {\r\n links[linkIndex].linkText = event.target.value;\r\n }\r\n }\r\n };\r\n\r\n private _next = (): void => {\r\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this._goToIndex(nextIndex);\r\n };\r\n\r\n private _previous = (): void => {\r\n const nextIndex = this._isFirstItem() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : this.state.activeIndex - 1;\r\n this._goToIndex(nextIndex);\r\n };\r\n\r\n private _goToIndex = (index: number): void => {\r\n if (this.state.animating) {\r\n return;\r\n }\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private _isLastItem = () => this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\r\n\r\n private _onDismiss = (): void => {\r\n this.setState({ isVisible: false });\r\n };\r\n}\r\n\r\nexport default PromoBanner;\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\n/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, {useState} from 'react';\r\nimport { IPromoBannerViewProps } from './absolute-promo-banner';\r\n\r\nimport { Modal, ModalHeader, ModalBody, Button } from 'reactstrap';\r\n\r\nconst PromoBannerView: React.FC = props => {\r\n const {\r\n promoBannerProps,\r\n contentProps,\r\n closeButton,\r\n bannerMessages,\r\n PromoBannerTextProps,\r\n PromoBannerLinksProps,\r\n CarouselProps,\r\n handleLinks,\r\n handleText\r\n } = props;\r\n\r\n const [modal, setModal] = useState(false);\r\n const toggle = () => setModal(!modal);\r\n\r\n const slides = bannerMessages && bannerMessages.map((message, index) => {\r\n return (\r\n \r\n {message.text && }\r\n {message.links && message.links.length > 0 && }\r\n \r\n \r\n Notice on Inventory\r\n \r\n
\r\n
\r\n

Due to high demand, and disruptions in supply chain, some items may be temporarily out of stock. As products become available, we will continue to add them to the website, so please check back often.

\r\n
\r\n
\r\n
\r\n\r\n
\r\n );\r\n });\r\n\r\n return (\r\n \r\n \r\n {closeButton}\r\n \r\n );\r\n};\r\nexport default PromoBannerView;\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}\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 {this._renderImage(config)}\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 { IBaseHeaderResources } from '../base-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IBaseHeaderResources;\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 { IBaseHeaderData } from '../base-header.data';\r\nimport { IBaseHeaderProps } from '../base-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: IBaseHeaderProps): 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 { IBaseHeaderData } from './base-header.data';\r\nimport { IBaseHeaderProps, IBaseHeaderResources, IMyAccountLinksData } from './base-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 IBaseHeaderProps, 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>}\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: IBaseHeaderProps) {\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('baseMenuBar');\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 IBaseHeaderProps),\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 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('inside-xxl 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: IBaseHeaderResources): 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: IBaseHeaderResources): 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, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React 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 './base-header';\r\n\r\nconst headerView: React.FC = props => {\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\r\n {/* This is the area that is majorly revamped. Subtract components as needed. */}\r\n\r\n
\r\n {props.logo}\r\n {props.navIcon}\r\n \r\n
\r\n\r\n
\r\n {_renderReactFragment(props.menuBar)}\r\n
\r\n \r\n
\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconDesktop}\r\n \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\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n \r\n \r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\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 * 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 {this._renderImage(config)}\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 { IFreedomHeaderResources } from '../freedom-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IFreedomHeaderResources;\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 { IFreedomHeaderData } from '../freedom-header.data';\r\nimport { IFreedomHeaderProps } from '../freedom-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: IFreedomHeaderProps): 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 { IFreedomHeaderData } from './freedom-header.data';\r\nimport { IFreedomHeaderProps, IFreedomHeaderResources, IMyAccountLinksData } from './freedom-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 IFreedomHeaderProps, 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>}\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: IFreedomHeaderProps) {\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('freedomMenuBar');\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 IFreedomHeaderProps),\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 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 freedom')\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: IFreedomHeaderResources): 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: IFreedomHeaderResources): 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, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React 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 './freedom-header';\r\n\r\nconst headerView: React.FC = props => {\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\r\n {/* This is the area that is majorly revamped. Subtract components as needed. */}\r\n\r\n
\r\n {props.logo}\r\n {props.navIcon}\r\n \r\n
\r\n\r\n
\r\n {_renderReactFragment(props.menuBar)}\r\n
\r\n \r\n
\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconDesktop}\r\n \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\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n \r\n \r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\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 * 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 {this._renderImage(config)}\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 { IHosportsB2bHeaderResources } from '../hosports-b2b-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IHosportsB2bHeaderResources;\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}\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IHosportsB2BHeaderData } from '../hosports-b2b-header.data';\r\nimport { IHosportsB2bHeaderProps } from '../hosports-b2b-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: IHosportsB2bHeaderProps): 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 * 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 { IHosportsB2BHeaderData } from './hosports-b2b-header.data';\r\nimport { IHosportsB2bHeaderProps, IHosportsB2bHeaderResources, IMyAccountLinksData } from './hosports-b2b-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 IHosportsB2bHeaderProps, 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>}\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: IHosportsB2bHeaderProps) {\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('baseMenuBar');\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 IHosportsB2bHeaderProps),\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 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('inside-xxl 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: IHosportsB2bHeaderResources): 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: IHosportsB2bHeaderResources): 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","/*---------------------------------------------------------------------------------------------\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 * as React 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 './hosports-b2b-header';\r\n\r\nconst headerView: React.FC = props => {\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\r\n {/* This is the area that is majorly revamped. Subtract components as needed. */}\r\n\r\n
\r\n {props.logo}\r\n {props.navIcon}\r\n\r\n
\r\n\r\n
\r\n {_renderReactFragment(props.menuBar)}\r\n
\r\n\r\n
\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconDesktop}\r\n \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\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n \r\n \r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\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","/*---------------------------------------------------------------------------------------------\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 {this._renderImage(config)}\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 { ILiquidHeader2021Resources } from '../liquid-header-2021.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: ILiquidHeader2021Resources;\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 { ILiquidHeader2021Data } from '../liquid-header-2021.data';\r\nimport { ILiquidHeader2021Props } from '../liquid-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> {\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: ILiquidHeader2021Props): 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 { ILiquidHeader2021Data } from './liquid-header-2021.data';\r\nimport { ILiquidHeader2021Props, ILiquidHeader2021Resources, IMyAccountLinksData } from './liquid-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 ILiquidHeader2021Props, 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>}\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: ILiquidHeader2021Props) {\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('liquidMenuBar');\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 ILiquidHeader2021Props),\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 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 liquid')\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: ILiquidHeader2021Resources): 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: ILiquidHeader2021Resources): 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, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React 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 './liquid-header-2021';\r\n\r\nconst headerView: React.FC = props => {\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\r\n {/* This is the area that is majorly revamped. Subtract components as needed. */}\r\n\r\n
\r\n {props.logo}\r\n {props.navIcon}\r\n \r\n
\r\n\r\n
\r\n {_renderReactFragment(props.menuBar)}\r\n
\r\n \r\n
\r\n {_renderReactFragment(props.search)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.wishListIconDesktop}\r\n \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\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { MobileMenuLinksContainer, mobileMenuCollapsed } = props;\r\n return (\r\n \r\n \r\n {_renderReactFragment(props.menuBar)}\r\n {_renderReactFragment(props.search)}\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 * 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 {this._renderImage(config)}\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 { 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}\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 { 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> {\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: IObrienHeader2021Props): 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 { 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, 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>}\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: IObrienHeader2021Props) {\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),\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 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 \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: 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 \r\n {resources.signInLinkText}\r\n \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 \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, 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 = 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 \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.menuBar)}\r\n {_renderReactFragment(props.search)}\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 > 0 ? items.map((slot: React.ReactNode, index: number) => {\r\n return (\r\n {slot}\r\n );\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}\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 {this._renderImage(config)}\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 { 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}\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 { 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> {\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: IObrienHeader2023Props): 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 { 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, 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>}\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: IObrienHeader2023Props) {\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),\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 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 \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: 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 \r\n {resources.signInLinkText}\r\n \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 \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, 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 = 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 \r\n
\r\n \r\n \r\n\r\n
\r\n
\r\n
\r\n
{_renderReactFragment(props.promoBanner)}
\r\n
\r\n {props.wishListIconDesktop}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.cartIcon}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\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
\r\n
\r\n\r\n
\r\n {_renderCollapseMenu(props)}\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.menuBar)}\r\n {_renderReactFragment(props.search)}\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 > 0 ? items.map((slot: React.ReactNode, index: number) => {\r\n return (\r\n {slot}\r\n );\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\n/* eslint-disable no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPromoBannerCloseButton {\r\n closeButtonAriaLabel?: string;\r\n label?: string;\r\n telemetryContent?: ITelemetryContent;\r\n onClose(): void;\r\n\r\n}\r\n\r\nexport const PromoBannerCloseButton: React.FC = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\r\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\r\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n \r\n );\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\n/* eslint-disable no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { ILinksData } from '../obrien-promo-banner.props.autogenerated';\r\n\r\nexport interface IPromoBannerLinks {\r\n links: ILinksData[];\r\n requestContext: Msdyn365.IRequestContext;\r\n telemetryContent: ITelemetryContent;\r\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\r\n}\r\n\r\nexport const PromoBannerLinks: React.FC = ({ links, requestContext, onTextChange, telemetryContent }) => {\r\n const editableLinks = _mapEditableLinks(links, telemetryContent);\r\n return(\r\n \r\n {editableLinks && editableLinks.length ?\r\n \r\n : null\r\n }\r\n \r\n );\r\n};\r\n\r\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\r\n if(!linkdata || linkdata.length === 0) {\r\n return null;\r\n }\r\n const editableLinks: Msdyn365.ILinksData[] = [];\r\n linkdata.forEach((link,index) => {\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\r\n const linkText = link.linkText ? link.linkText : '';\r\n payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\r\n const editableLink: Msdyn365.ILinksData = {\r\n ariaLabel: link.ariaLabel,\r\n className: 'ms-promo-banner__link',\r\n linkText: link.linkText,\r\n linkUrl: link.linkUrl.destinationUrl,\r\n openInNewTab: link.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes,\r\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\r\n };\r\n editableLinks.push(editableLink);\r\n });\r\n\r\n return editableLinks;\r\n};\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\n/* eslint-disable no-duplicate-imports */\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface IPromoBannerText {\r\n text: string;\r\n requestContext: Msdyn365.IRequestContext;\r\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\r\n}\r\n\r\nexport const PromoBannerText: React.FC = ({ text, onTextChange, requestContext }) => {\r\n return(\r\n \r\n );\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\n/* eslint-disable no-duplicate-imports */\r\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { Carousel } from '@msdyn365-commerce/components';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\r\nimport { IBannerMessagesData, IObrienPromoBannerProps } from './obrien-promo-banner.props.autogenerated';\r\n\r\nexport interface IPromoBannerState {\r\n animating: boolean;\r\n isVisible: boolean;\r\n activeIndex: number;\r\n}\r\n\r\nexport interface IPromoBannerViewProps extends IObrienPromoBannerProps<{}>, IPromoBannerState {\r\n promoBannerProps: IModuleProps;\r\n contentProps: INodeProps ;\r\n bannerMessages: IBannerMessagesData[];\r\n PromoBannerTextProps: INodeProps;\r\n PromoBannerLinksProps: INodeProps;\r\n CarouselProps: INodeProps;\r\n closeButton?: React.ReactNode;\r\n className: string;\r\n onDismiss(): void;\r\n handleText(): void;\r\n handleLinks(): void;\r\n}\r\n\r\n/**\r\n *\r\n * PromoBannerModule component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass PromoBanner extends React.PureComponent, IPromoBannerState> {\r\n public state: IPromoBannerState = {\r\n animating: false,\r\n isVisible: true,\r\n activeIndex: 0\r\n };\r\n\r\n private telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\r\n\r\n public render(): JSX.Element | null {\r\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className= '' } = this.props.config;\r\n const { closeButtonAriaLabel, closeButtonLabel } = this.props.resources;\r\n const { isVisible, activeIndex } = this.state;\r\n\r\n if (!isVisible) {\r\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const viewProps = {\r\n // Context for telemetry and raw data for C1 to do customization\r\n // Including computed data, state data and methods\r\n ...this.props,\r\n className: classnames('ms-promo-banner', className),\r\n isVisible, // state data\r\n onDismiss: this._onDismiss, // methods\r\n handleLinks: this.handleLinkTextChange,\r\n handleText: this.handleTextChange,\r\n\r\n promoBannerProps: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\r\n PromoBannerTextProps: {\r\n tag: PromoBannerText\r\n },\r\n PromoBannerLinksProps: {\r\n tag: PromoBannerLinks,\r\n telemetryContent: this.telemetryContent\r\n },\r\n contentProps: { className: 'ms-promo-banner__content' },\r\n bannerMessages: bannerMessages,\r\n activeIndex: activeIndex,\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-promo-banner__carousel',\r\n activeIndex: activeIndex,\r\n next: this._next,\r\n previous: this._previous,\r\n onIndicatorsClickHandler: this._goToIndex,\r\n hideIndicator: hideFlipper,\r\n interval: interval,\r\n hideFlipper: hideFlipper,\r\n autoplay: autoplay\r\n },\r\n closeButton: dismissEnabled && \r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\r\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\r\n this.props.config.bannerMessages[0].text = event.target.value;\r\n }\r\n }\r\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\r\n if(this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\r\n const links = this.props.config.bannerMessages[1].links;\r\n if(links) {\r\n links[linkIndex].linkText = event.target.value;\r\n }\r\n }\r\n };\r\n\r\n private _next = (): void => {\r\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this._goToIndex(nextIndex);\r\n };\r\n\r\n private _previous = (): void => {\r\n const nextIndex = this._isFirstItem() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : this.state.activeIndex - 1;\r\n this._goToIndex(nextIndex);\r\n };\r\n\r\n private _goToIndex = (index: number): void => {\r\n if (this.state.animating) {\r\n return;\r\n }\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private _isLastItem = () => this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\r\n\r\n private _onDismiss = (): void => {\r\n this.setState({ isVisible: false });\r\n };\r\n}\r\n\r\nexport default PromoBanner;\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\n/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, {useState} from 'react';\r\nimport { IPromoBannerViewProps } from './obrien-promo-banner';\r\n\r\nimport { Modal, ModalHeader, ModalBody, Button } from 'reactstrap';\r\n\r\nconst PromoBannerView: React.FC = props => {\r\n const {\r\n promoBannerProps,\r\n contentProps,\r\n closeButton,\r\n bannerMessages,\r\n PromoBannerTextProps,\r\n PromoBannerLinksProps,\r\n CarouselProps,\r\n handleLinks,\r\n handleText\r\n } = props;\r\n\r\n const [modal, setModal] = useState(false);\r\n const toggle = () => setModal(!modal);\r\n\r\n const slides = bannerMessages && bannerMessages.map((message, index) => {\r\n return (\r\n \r\n {message.text && }\r\n {message.links && message.links.length > 0 && }\r\n \r\n \r\n

Notice on Shipping Delays

\r\n \r\n
\r\n \r\n \"2021-O'Brien-Boy-Life-Jacket-updated.jpg\"\r\n \r\n
\r\n
\r\n

Unfortunately, our warehouse is a little backed up due to a large influx \r\n of orders creating shipping delays. \r\n As a result, order processing is currently \r\n taking up to 7 business days from the date of purchase. \r\n We are very sorry about any inconvenience and are doing \r\n everything we can to speed this up and process orders as efficiently as possible.

\r\n Contact Us\r\n
\r\n
\r\n
\r\n\r\n
\r\n );\r\n });\r\n\r\n return (\r\n \r\n \r\n {closeButton}\r\n \r\n );\r\n};\r\nexport default PromoBannerView;\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 { 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 { 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 = ({\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 { 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 = ({\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 { 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
\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 { isDisabled, 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, 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
  • \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 * 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 extends Msdyn365.IModule {\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 {\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: IObrienSearchResultContainerProps, 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 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 \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 './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 { PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport {\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * IActiveProductProps interface.\n */\nexport interface IActiveProductProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n}\n\n/**\n * IActiveProduct interface.\n */\nexport interface IActiveProduct extends IComponent<IActiveProductProps> {}\n\n/**\n * RenderDescription function.\n * @param description - Product description string.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-active-image-product__text'>{description}</p>;\n}\n\n/**\n * GetRatingAriaLabel function.\n * @param rating - Product rating number.\n * @param ratingAriaLabel - Product rating aria label.\n * @returns - Returns string.\n */\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n const numberTwo: number = 2;\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(numberTwo);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\n/**\n * RenderRating function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param ratingId - The rating id.\n * @param avgRating - The average rating.\n * @param totalRatings - The total ratings.\n * @param ariaLabel - The rating aria label.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderRating(\n context: ICoreContext,\n typeName: string,\n ratingId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() ?? undefined;\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\n\n return (\n <RatingComponent\n context={context}\n id={ratingId}\n typeName={typeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabel}\n data={{}}\n />\n );\n}\n\n/**\n * RenderPrice function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param productId - The product id.\n * @param basePrice - The base price of the product.\n * @param adjustedPrice - The adjusted price of the product.\n * @param savingsText - The savings text of the product.\n * @param freePriceText - The free price text.\n * @param originalPriceText - The original price text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n productId: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={productId}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n />\n );\n}\n\n/**\n * RenderProductPlacementImage function.\n * @param requestContext - RequestContext.\n * @param imageSettings - The product image settings.\n * @param gridSettings - The viewport gird settings.\n * @param imageUrl - The product image url.\n * @param altText - The product image alt text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderProductPlacementImage(\n requestContext: IRequestContext,\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const imgData: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return <Image {...imgData} {...imageProps} requestContext={requestContext} loadFailureBehavior='empty' />;\n}\n\n/**\n * ActiveProduct constant.\n * @param props - The active product props.\n * @param props.data - The product search result data.\n * @param props.context - The core context.\n * @param props.imageSettings - The prodcut image settings.\n * @param props.savingsText - The product savings text.\n * @param props.freePriceText - The free price text.\n * @param props.originalPriceText - The original price text.\n * @param props.ratingAriaLabel - The product rating aria label.\n * @param props.typeName - The type name of the module.\n * @param props.id - The id of the product.\n * @returns - Returns JSX.Element | null.\n */\nexport const ActiveProductComponent: React.FC<IActiveProductProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n ratingAriaLabel,\n typeName,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\n id\n}) => {\n const product = data.product;\n if (!product) {\n return null;\n }\n\n return (\n <>\n <div className='msc-active-image-product'>\n <div className='msc-active-image-product__image'>\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n </div>\n <div className='msc-active-image-product__details'>\n <h4 className='msc-active-image-product__title'>{product.Name}</h4>\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\n {renderDescription(product.Description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n </div>\n </div>\n </>\n );\n};\n\nexport default ActiveProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * ILinksData: Interface for\n * Additional content.\n */\ninterface ILinksData {\n linkText?: string;\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n isOpenInNewTab?: boolean;\n}\n\n/**\n * IAdditionalContentData: Interface for\n * Active content.\n */\ninterface IAdditionalContentData {\n heading?: string;\n subtext?: string;\n links?: ILinksData[];\n}\n\n/**\n * IActiveImageAdditionalContentProps: Interface for\n * Active Image Additional Content Component props.\n */\nexport interface IActiveImageAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IActiveImageAdditionalContentViewProps: Interface for\n * Active Image Additional Content view props.\n */\nexport interface IActiveImageAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Active Image Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='msc-active-image__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Active Image Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='msc-active-image__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Active Image Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IActiveImageAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'msc-active-image__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.isOpenInNewTab,\n role: 'button'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Active Image additonal content item props.\n * @param props - Active Image Additional content component props.\n * @returns IActiveImageAdditionalContentItemViewProps.\n */\nconst assembleNode = (item: IAdditionalContentData, props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\n };\n};\n\n/**\n * ActiveImageAdditionalContent component.\n * @param props - Active Image Additional content component props.\n * @returns Active Image Additional content view props.\n */\nexport const activeImageAdditionalContent = (\n props: IActiveImageAdditionalContentProps\n): IActiveImageAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n return assembleNode(additionalContent, props);\n};\n\nexport default activeImageAdditionalContent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\n\n/**\n * @interface IRgbColor\n * @description - The IRgbColor interface contract.\n */\nexport interface IRgbColor {\n rValue: number;\n gValue: number;\n bValue: number;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IArea {\n areaId: string;\n coords: number[];\n href?: string;\n center?: number[];\n primaryImageUrl?: string;\n productUrl: string;\n productSearchResult?: ProductSearchResult;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IAreaMap {\n name: string;\n areas: IArea[];\n}\n\n/**\n * @enum CanvasCalculations\n * @description - The canvas calculations enum.\n */\nexport enum CanvasCalculations {\n defaultWidth = 0,\n defaultHeight = 0,\n defaultPositionX = 0,\n defaultPositionY = 0,\n defaultScale = 1,\n halfDivisor = 2,\n doubleMultiplier = 2,\n buttonHeight = 30,\n buttonPadding = 30,\n paddingAdjustment = 3,\n expandAnimationStartWidth = 10,\n expandAnimationEndWidth = 40,\n collapseAnimationStartWidth = 40,\n collapseAnimationEndWidth = 8,\n expandRadius = 12,\n collapseRadius = 8,\n rotation = 1.57,\n startAngle = 0,\n endAngle = 7,\n clearMargin = 50,\n clearHeight = 100,\n clearWidth = 100,\n textFadeInStartValue = 0,\n textFadeOutStartValue = 0.5,\n textFadeInterval = 0.01\n}\n\n/**\n * @enum CanvasStyles\n * @description - The canvas styles enum.\n */\nexport enum CanvasStyles {\n color = '#FFFFFF',\n buttonTextClor = '#000000'\n}\n\n/**\n * @enum\n * @description - The canvas styles enum.\n */\nexport interface IImageMapperResources {\n buttonText?: string;\n altText?: string;\n}\n\n/**\n * @interface IImageMapperProps\n * @description - The IImageMapperProps interface contract.\n */\nexport interface IImageMapperProps {\n imageData: IImageData;\n areaMap: IAreaMap;\n viewPort: string;\n requestContext: IRequestContext;\n color?: string;\n buttonTextClor?: string;\n width?: number;\n imgWidth?: number;\n activeImageRefs: React.RefObject<HTMLDivElement>;\n imageMapperResources?: IImageMapperResources;\n onLoad?(): void;\n onClick?(area: IArea, index: number, event: AreaEvent): void;\n onFocus?(area: IArea, index: number, event: AreaEvent): void;\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\n}\n\n/**\n * ImageMapper.\n */\nexport class ImageMapper extends React.Component<IImageMapperProps> {\n private readonly _backgroundImage: React.RefObject<Image>;\n\n private readonly _container: React.RefObject<HTMLDivElement>;\n\n private readonly _canvas: React.RefObject<HTMLCanvasElement>;\n\n private _isDesktopViewPort: boolean = false;\n\n private _context: CanvasRenderingContext2D | null | undefined = null;\n\n public constructor(props: IImageMapperProps) {\n super(props);\n this._backgroundImage = React.createRef();\n this._container = React.createRef();\n this._canvas = React.createRef();\n }\n\n /**\n * ComponentDidMount method.\n */\n public componentDidMount(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n this.renderAreas();\n this._context = null;\n }\n\n /**\n * ComponentDidUpdate method.\n */\n public componentDidUpdate(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n }\n\n /**\n * ShouldComponentUpdate method.\n * @param nextProps - Next props.\n * @returns Returns boolean.\n */\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\n let shouldRender = false;\n if (nextProps !== this.props) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n /**\n * GetActiveImageWidth method - Gets the active image width.\n * @returns Returns number | undefined.\n */\n public getActiveImageWidth = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return undefined;\n };\n\n /**\n * GetActiveImageHeight method - Gets the active image height.\n * @returns Returns number | undefined.\n */\n public getActiveImageHeight = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return undefined;\n };\n\n /**\n * ConvertHexToRgb method - This method takes color in HEX format and returns IRgbColor color object.\n * @param hexColor -The color hex value.\n * @returns -Returns IRgbColor object.\n */\n public convertHexToRgb = (hexColor: string): IRgbColor => {\n // RegEx used to execute the conversion of the hex color to rgb value.\n const regEx = new RegExp('^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$', 'u');\n\n // RegEx.exec method executes a search for a match in a specified string. Returns a result array, or null.\n const result = regEx.exec(hexColor);\n const defaultValue = 0;\n return result\n ? {\n rValue: Number.parseInt(result[1], 16),\n gValue: Number.parseInt(result[2], 16),\n bValue: Number.parseInt(result[3], 16)\n }\n : {\n rValue: defaultValue,\n gValue: defaultValue,\n bValue: defaultValue\n };\n };\n\n /**\n * ApplyFadingTransition method - Applys fading transition to button text.\n * @param text -The button text.\n * @param coords -The coordinates.\n * @param rgbColor -The RGB color object.\n * @param alpha -The alpha value of the button text.\n */\n public applyFadingTransition = (text: string, coords: number[], rgbColor: IRgbColor, alpha: number): void => {\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n context.fillStyle = `rgba(${rgbColor.rValue}, ${rgbColor.gValue}, ${rgbColor.bValue}, ${alpha} )`;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * Draw button method - Draws button and contains fixed hight, padding values.\n * @param text -The button text.\n * @param coords -The coordinates.\n */\n public drawButton = (text: string, coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonHeight = CanvasCalculations.buttonHeight;\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n const buttonPositionX = coords[0] - buttonWidth / halfDivisor;\n const buttonPositionY = coords[1] - buttonHeight / halfDivisor;\n const arcsize = buttonHeight / halfDivisor;\n\n context.beginPath();\n context.moveTo(buttonPositionX + arcsize, buttonPositionY);\n context.lineTo(buttonPositionX + buttonWidth - arcsize, buttonPositionY);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY,\n buttonPositionX + buttonWidth,\n buttonPositionY + arcsize,\n arcsize\n );\n context.lineTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight - arcsize);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY + buttonHeight,\n buttonPositionX + buttonWidth - arcsize,\n buttonPositionY + buttonHeight,\n arcsize\n );\n context.lineTo(buttonPositionX + arcsize, buttonPositionY + buttonHeight);\n context.arcTo(buttonPositionX, buttonPositionY + buttonHeight, buttonPositionX, buttonPositionY - arcsize, arcsize);\n context.lineTo(buttonPositionX, buttonPositionY + arcsize);\n context.arcTo(buttonPositionX, buttonPositionY, buttonPositionX + arcsize, buttonPositionY, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY);\n context.stroke();\n context.closePath();\n context.fillStyle = color;\n context.fill();\n context.fillStyle = buttonTextClor;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * ExpandAnimation method - Shows expand animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public expandAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.expandAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.expandAnimationEndWidth;\n const radius = CanvasCalculations.expandRadius;\n const rotation = CanvasCalculations.rotation;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeInValue = CanvasCalculations.textFadeInStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Reders expand animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n context.fillStyle = color;\n if (buttonText) {\n if (animationStartWidth < animationEndWidth) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeInValue);\n textFadeInValue += CanvasCalculations.textFadeInterval;\n animationStartWidth++;\n } else {\n this.drawButton(buttonText, [pointPositionX, pointPositionY]);\n }\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * CollapseAnimation method - Shows collapse animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public collapseAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.collapseAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.collapseAnimationEndWidth;\n const rotation = CanvasCalculations.rotation;\n const clearMargin = CanvasCalculations.clearMargin;\n const clearHeight = CanvasCalculations.clearHeight;\n const clearWidth = CanvasCalculations.clearWidth;\n const radius = CanvasCalculations.collapseRadius;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeOutValue = CanvasCalculations.textFadeOutStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Renders collapse animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.clearRect(pointPositionX - clearMargin, pointPositionY - clearMargin, clearWidth, clearHeight);\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n if (animationEndWidth < animationStartWidth && buttonText) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeOutValue);\n textFadeOutValue -= CanvasCalculations.textFadeInterval;\n animationStartWidth--;\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * DrawCircle method - Renders active points.\n * @param coords -Coordinates.\n */\n public drawCircle = (coords: number[]): void => {\n const { color = CanvasStyles.color, viewPort } = this.props;\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n const startAngle: number = CanvasCalculations.startAngle;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n const radius = viewPort === 'xs' || viewPort === 'sm' ? coords[2] * doubleMultiplier : coords[2];\n if (!context) {\n return;\n }\n context.fillStyle = color;\n context.beginPath();\n context.strokeStyle = color;\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\n context.closePath();\n context.stroke();\n context.fill();\n };\n\n /**\n * ScaleCoords method - To scale the active point coordinates based on the window size.\n * @param coords -Coordinates.\n * @returns -Returns number[].\n */\n public scaleCoords = (coords: number[]): number[] => {\n const { imgWidth } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultScale: number = CanvasCalculations.defaultScale;\n\n // Calculate scale based on current 'width' and the original 'imgWidth'\n const width = this.getActiveImageWidth();\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\n return coords.map(coord => coord * scale);\n };\n\n /**\n * RenderPrefilledAreas method - To render active points in case of events.\n */\n public renderPrefilledAreas = (): void => {\n const { areaMap } = this.props;\n areaMap.areas.map(area => {\n this.drawCircle(this.scaleCoords(area.coords));\n return null;\n });\n };\n\n /**\n * ComputeCenter method - To re-calculate the center of active point based on window size.\n * @param area -IArea.\n * @returns -Returns number[].\n */\n public computeCenter = (area: IArea): number[] => {\n const scaledCoords = this.scaleCoords(area.coords);\n return [scaledCoords[0], scaledCoords[1]];\n };\n\n /**\n * HandleHoverOn method - To handle mouse hover on event.\n * @param area -IArea.\n */\n public handleHoverOn = (area: IArea): void => {\n if (area.center && this._canvas.current) {\n this.drawCircle(this.scaleCoords(area.coords));\n this.expandAnimation(area.center);\n }\n };\n\n /**\n * HandleHoverOff method - To handle mouse hover off event.\n * @param area -IArea.\n */\n public handleHoverOff = (area: IArea): void => {\n if (this._canvas.current) {\n const context = this._canvas.current.getContext('2d') ?? this._context;\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\n\n if (!context) {\n return;\n }\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\n this.renderPrefilledAreas();\n if (area.center) {\n this.collapseAnimation(area.center);\n }\n }\n };\n\n /**\n * Click method - Mouse click event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public click = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onClick } = this.props;\n if (onClick) {\n event.preventDefault();\n onClick(area, index, event);\n }\n };\n\n /**\n * HoverOn method - Mouse hover on event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseEnter } = this.props;\n this.handleHoverOn(area);\n if (onMouseEnter) {\n onMouseEnter(area, index, event);\n }\n };\n\n /**\n * HoverOff method - Mouse hover off event.\n * @param area - IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseLeave } = this.props;\n\n this.handleHoverOff(area);\n\n if (onMouseLeave) {\n onMouseLeave(area, index, event);\n }\n };\n\n /**\n * RenderAreas method - Renders active points at given coordinates.\n * @returns -Returns JSX.Element[].\n */\n public renderAreas = (): JSX.Element[] => {\n const { areaMap, viewPort } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n\n return areaMap.areas.map((area, index) => {\n const scaledCoords = this.scaleCoords(area.coords);\n const xsRadius = area.coords[2] * doubleMultiplier;\n if (viewPort === 'xs') {\n scaledCoords[2] = xsRadius;\n }\n const center = this.computeCenter(area);\n const extendedArea = { ...area, scaledCoords, center };\n const areaKey = `area-${index}`;\n const altTextWithProductName = altText\n .replace('{buttonText}', buttonText ? buttonText : '')\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\n return (\n <area\n key={areaKey}\n shape='circle'\n coords={scaledCoords.join(',')}\n onMouseEnter={this.hoverOn(extendedArea, index)}\n onMouseLeave={this.hoverOff(extendedArea, index)}\n onClick={this.click(extendedArea, index)}\n onFocus={this.hoverOn(extendedArea, index)}\n onBlur={this.hoverOff(extendedArea, index)}\n href={area.productUrl}\n tabIndex={0}\n alt={altTextWithProductName}\n aria-label={altTextWithProductName}\n />\n );\n });\n };\n\n /**\n * InitCanvas method - To render the canvas.\n */\n public initCanvas = (): void => {\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\n return;\n }\n\n const { color, onLoad } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultHeight: number = CanvasCalculations.defaultHeight;\n\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\n\n this._canvas.current.width = canvasWidth;\n this._canvas.current.height = canvasHeight;\n this._container.current.style.width = `${canvasWidth}px`;\n\n const context = this._canvas.current.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.fillStyle = color ?? '';\n\n if (onLoad) {\n onLoad();\n }\n\n this.renderPrefilledAreas();\n };\n\n /**\n * Render method - To render the image mapper component with active image, canvas and active points.\n * @returns -Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const { imageData, areaMap, requestContext } = this.props;\n\n return (\n <div className='msc-active-image-container' ref={this._container}>\n <Image\n src={imageData.src}\n useMap={`#${areaMap.name}`}\n alt={areaMap.name}\n ref={this._backgroundImage}\n height={imageData.height}\n width={imageData.width}\n className='msc-active-image-img'\n imageSettings={imageData.imageSettings}\n gridSettings={requestContext.gridSettings ?? {}}\n requestContext={requestContext}\n />\n <canvas ref={this._canvas} className='msc-active-image-canvas' />\n <map name={areaMap.name} className='msc-active-image-map'>\n {this.renderAreas()}\n </map>\n </div>\n );\n }\n}\n\nexport default ImageMapper;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper\n} from '../active-image-utilities';\nimport { IActiveImageData } from './active-image.data';\nimport { IActiveImageProps } from './active-image.props.autogenerated';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\n\n/**\n * @interface IActiveImageViewProps\n * @classdesc - The IActiveImageViewProps interface contract.\n */\nexport interface IActiveImageViewProps extends IActiveImageProps<{}>, IImageMapperProps {\n activePointContainer: IModuleProps;\n activePointDetailsContainer: INodeProps;\n imageMapper: React.ReactNode;\n overlay: React.ReactNode;\n productCard: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IActiveImageAdditionalContentViewProps;\n productCardleftPosition: number;\n productCardtopPosition: number;\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\n}\n\n/**\n * @interface IActiveImageLinksData\n * @classdesc - The IActiveImageLinksData interface contract.\n */\nexport interface IActiveImageLinksData {\n linkText?: string;\n linkUrl: MsDyn365.ILinkData;\n ariaLabel?: string;\n willOpenInNewTab?: boolean;\n}\n\n/**\n * @interface IActiveImageState\n * @classdesc - The IActiveImageState interface contract.\n */\ninterface IActiveImageState {\n clientWidth: number;\n area: IArea | null;\n viewport: string;\n overlayClass: string;\n}\n\n/**\n * @enum ActiveImageConstants\n * @description - The active image constants enum.\n */\nexport enum ActiveImageConstants {\n timeoutInterval = 200,\n enterKey = 'Enter',\n escKey = 'Escape'\n}\n\n/**\n *\n * ActiveImage class.\n * @extends {React.PureComponent<IActiveImageProps<{}> & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent<IActiveImageProps<IActiveImageData> & IImageMapperProps, IActiveImageState> {\n private readonly _telemetryContent: ITelemetryContent;\n\n private _isDesktopViewPort: boolean;\n\n private readonly _defaultProductCardWidth: number = 315;\n\n private readonly _defaultProdutCardHight: number = 490;\n\n private readonly _activePoints: IArea[] = [];\n\n private readonly _activeImageRefs: React.RefObject<HTMLDivElement>;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject<HTMLDivElement>;\n\n public constructor(props: IActiveImageProps<IActiveImageData> & IImageMapperProps) {\n super(props);\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\n this.state = {\n clientWidth: 0,\n area: null,\n viewport,\n overlayClass: ''\n };\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n this._activeImageRefs = React.createRef();\n this._productCardDivRef = React.createRef();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('resize', this.updateClientWidth);\n document.addEventListener('keydown', this.keyDown, false);\n document.addEventListener('mousedown', this._handleOutsideClick);\n }\n setTimeout(() => {\n this.updateClientWidth();\n }, ActiveImageConstants.timeoutInterval);\n\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\n const images: HTMLCollectionOf<Element> = this._activeImageRefs.current.getElementsByClassName(\n 'msc-thumbnail_image msc-active-image-img'\n );\n if (ArrayExtensions.hasElements(Array.from(images))) {\n images[0].removeAttribute('usemap');\n }\n }\n }\n\n /**\n * AddActivePoints method - To handle add Active Points.\n * @param area - IArea.\n * @param product - ProductSearchResult.\n * @param coords - Coords.\n * @param productUrl - String.\n */\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\n if (!area) {\n this._activePoints.push({\n areaId: product.RecordId.toString(),\n coords,\n primaryImageUrl: product.PrimaryImageUrl ?? '',\n productUrl,\n productSearchResult: product\n });\n }\n };\n\n /**\n * ComponentWillUnmount method.\n */\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('resize', this.updateClientWidth);\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\n }\n }\n\n /**\n * UpdateClientWidth method to update client width in state.\n */\n public updateClientWidth = (): void => {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport });\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n };\n\n /**\n * Render method.\n * @returns - Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const viewProps: IActiveImageViewProps = {\n ...(this.props as IImageMapperProps & IActiveImageProps<{}>),\n activePointContainer: {\n moduleProps: this.props,\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\n },\n activePointDetailsContainer: {\n tag: 'div',\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\n ref: this._activeImageRefs\n },\n imgWidth: this.props.config.canvasWidth,\n imageMapper: this.renderImageMapper(),\n overlay: this.renderOverlay(),\n productCard: this.renderProductCard(),\n productCardleftPosition: this.getProductCardPositionX(),\n productCardtopPosition: this.getProductCardPositionY(),\n title: this.renderActiveImageDetailsHeading(),\n text: this.renderActiveImageDetailsParagraph(),\n links: this.renderActiveImageDetailsLinks(),\n detailsContainer: { className: 'msc-active-image__details' },\n detailsContainerCta: { className: 'msc-active-image__details__cta' },\n additionalContent: activeImageAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleAdditionalLinkText: this.handleAdditionalTextChange\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * RenderImageMapper method - To render image mapper.\n * @returns - Returns React.ReactNode | null.\n */\n public renderImageMapper = (): React.ReactNode | null => {\n const { config, context } = this.props;\n const defaultPosition: number = 0;\n const defaultLength: number = 0;\n const productResults = this.props.data.products.result;\n if (config.activePoints && productResults) {\n for (const product of productResults) {\n for (const configProduct of config.activePoints) {\n if (product.ItemId === configProduct.itemId) {\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\n const coords = [\n configProduct.xPosition ?? defaultPosition,\n configProduct.yPosition ?? defaultPosition,\n configProduct.radius ?? defaultPosition\n ];\n const area = this._activePoints.find(activePoint => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\n this.addActivePoints(area, product, coords, productUrl);\n }\n }\n }\n }\n const mappedArea: IAreaMap = {\n name: `map-${this._activeImageClass}`,\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\n };\n\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n return (\n <ImageMapper\n viewPort={this.state.viewport}\n requestContext={this.props.context.actionContext.requestContext}\n width={this.state.clientWidth}\n imgWidth={this.props.config.canvasWidth}\n onClick={this.enterArea}\n onFocus={this.enterArea}\n onMouseEnter={this.enterArea}\n onMouseLeave={this.leaveArea}\n imageData={this.props.config.activeImage ?? {}}\n areaMap={mappedArea}\n activeImageRefs={this._activeImageRefs}\n imageMapperResources={{\n altText: this.props.resources.altTextForSeeMoreButtonWithProductName,\n buttonText: this.props.resources.seeMoreButtonText\n }}\n />\n );\n };\n\n /**\n * EnterArea method - To handle mouse enter event.\n * @param area - Active point area.\n * @param index - Active point index.\n * @param event - Active point AreaEvent.\n */\n public enterArea = (area: IArea, index: number, event: AreaEvent): void => {\n this.setState({ area, overlayClass: 'msc-active-image-overlay' });\n if (this.props.onMouseEnter) {\n this.props.onMouseEnter(area, index, event);\n }\n if (event.type.toLocaleLowerCase() === 'click' && this._isDesktopViewPort) {\n window.open(area.productUrl, '_self');\n }\n };\n\n /**\n * LeaveArea method - To handle mouse leave event.\n */\n public leaveArea = (): void => {\n if (this._isDesktopViewPort) {\n this.resetState();\n }\n };\n\n /**\n * ResetState method - To reset the state for area and overlayclass.\n */\n public resetState = (): void => {\n this.setState({ area: null, overlayClass: '' });\n };\n\n /**\n * RenderProductComponent method - To render the product card with product information.\n * @returns - Returns React.ReactNode.\n */\n public renderProductComponent = (): React.ReactNode => {\n if (this.state.area?.productSearchResult) {\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\n const imageUrl: string = this.state.area.primaryImageUrl ?? '';\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\n const product: ProductSearchResult = this.state.area.productSearchResult;\n product.PrimaryImageUrl = primaryImageUrl;\n\n return (\n <ActiveProductComponent\n context={this.props.context}\n imageSettings={this.props.config.productImageSettings}\n id={product.ItemId ?? ''}\n typeName={this.props.typeName || ''}\n data={{ product }}\n />\n );\n }\n return React.Fragment;\n };\n\n /**\n * RenderProductCard method - To render product cards.\n * @returns - Returns React.ReactNode.\n */\n public renderProductCard = (): React.ReactNode => {\n const { area } = this.state;\n\n return (\n <>\n {area?.center && (\n <div className='msc-active-image-product-card' ref={this._productCardDivRef}>\n <div className='msc-active-image-product-card-wrapper' key={area.areaId}>\n {!this._isDesktopViewPort && <button onClick={this.resetState} className='close-button' />}\n {area.productSearchResult && this.renderProductComponent()}\n {!this._isDesktopViewPort && (\n <a href={area.productUrl} className='see-more-button'>\n {this.props.resources.seeMoreButtonText}\n </a>\n )}\n </div>\n </div>\n )}\n </>\n );\n };\n\n /**\n * RenderOverlay method - To render overlay for non desktop viewports.\n * @returns - Returns React.ReactNode.\n */\n public renderOverlay = (): React.ReactNode => {\n return <>{!this._isDesktopViewPort && <div className={this.state.overlayClass} />}</>;\n };\n\n /**\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\n * For xs, sm and md viewports it provides x position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionX = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsWidth = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.w\n : defaultImageSettings.viewports.lg?.w;\n const defaultPositionX: number = 0;\n const halfDivisor: number = 2;\n const productCardWidth: number = productImageSettingsWidth ? productImageSettingsWidth : this._defaultProductCardWidth;\n const { area, clientWidth, viewport } = this.state;\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\n const leftAllignPosition = pointPositionX - productCardWidth - productCardWidth / halfDivisor;\n const rightAllignPosition = pointPositionX + productCardWidth / halfDivisor;\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n if (leftAllignPosition < defaultPositionX) {\n position = rightAllignPosition;\n } else {\n position = leftAllignPosition;\n }\n }\n return position;\n };\n\n /**\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\n * For xs, sm and md viewports it provides y position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionY = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsHeight = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.h\n : defaultImageSettings.viewports.lg?.h;\n const halfDivisor: number = 2;\n const { area, viewport } = this.state;\n const produtCardHight: number = productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\n let position: number = pointPositionY;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - produtCardHight / halfDivisor;\n }\n return position;\n };\n\n /**\n * GetDefaultImageSettings method.\n * @returns MsDyn365.IImageSettings.\n */\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\n const defaultImageSettings: MsDyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\n },\n lazyload: true\n };\n\n return defaultImageSettings;\n };\n\n /**\n * KeyDown method - To handle keydown event.\n * @param event - KeyboardEvent.\n */\n public keyDown = (event: KeyboardEvent): void => {\n if (event.key === ActiveImageConstants.enterKey) {\n const target: HTMLElement = event.target as HTMLElement;\n if (target.nodeName === 'AREA') {\n const area: HTMLAreaElement = target as HTMLAreaElement;\n if (area.href) {\n window.open(area.href, '_self');\n }\n }\n }\n if (event.key === ActiveImageConstants.escKey) {\n this.resetState();\n }\n };\n\n /**\n * GetActiveImageWidth method - To get active image width.\n * @returns Returns number.\n */\n public getActiveImageWidth = (): number => {\n const defaultWidth: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return defaultWidth;\n };\n\n /**\n * GetActiveImageHeight method - To get active image height.\n * @returns Returns number.\n */\n public getActiveImageHeight = (): number => {\n const defaultHeight: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return defaultHeight;\n };\n\n /**\n * HandleLinkTextChange method - To handle link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleTextChange method - To handle text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * HandleParagraphChange method - To handle paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * HandleAdditionalTextChange method - To handle additional text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * RenderActiveImageDetailsLinks method - To render active image details links.\n * @returns - React node.\n */\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\n\n return links?.map((linkData: IActiveImageLinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'msc-active-image__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.willOpenInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n };\n\n /**\n * RenderActiveImageDetailsHeading method - To render active image details heading.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='msc-active-image__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n };\n\n /**\n * RenderActiveImageDetailsParagraph method - To render active image details paragraph.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsParagraph = (): React.ReactNode | undefined => {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='msc-active-image__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n };\n\n /**\n * GetActiveImageId - To get active image id from src.\n * @returns - String.\n */\n public getActiveImageId = (): string => {\n const { activeImage } = this.props.config;\n let activeImageId: string = '';\n if (activeImage?.src) {\n const activeImageSource = activeImage.src.split('/');\n const decrementOne: number = 1;\n const activeImageIdPart = activeImageSource[activeImageSource.length - decrementOne].split('?');\n activeImageId = activeImageIdPart[0] ?? '';\n }\n return activeImageId;\n };\n\n /**\n * Handle outside click method - To handle outside click of the active image product.\n * @param event - Mouse event.\n */\n private readonly _handleOutsideClick = (event: MouseEvent) => {\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\n return;\n }\n this.resetState();\n };\n}\nexport default ActiveImage;\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 { IActiveImageAdditionalContentViewProps } from '../active-image-utilities';\nimport { IActiveImageViewProps } from './active-image';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\n return (\n <Node {...additionalContent.additionalContentNode}>\n {additionalContent.heading}\n <Node {...additionalContent.additionalContentContainer}>\n {additionalContent.text}\n <Node {...additionalContent.additionalContentItemLinks}>{additionalContent.links}</Node>\n </Node>\n </Node>\n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC<IActiveImageViewProps> = props => {\n return (\n <Module {...props.activePointContainer}>\n <Node {...props.activePointDetailsContainer}>\n {props.imageMapper}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </Node>\n <Node\n className='msc-active-image-product-card-container'\n style={{ top: `${props.productCardtopPosition}px`, left: `${props.productCardleftPosition}px` }}\n >\n {props.overlay}\n {props.productCard}\n </Node>\n </Module>\n );\n};\n\nexport default activeImageView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport { ProductDimensionsMatrix } from '@msdyn365-commerce/components';\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions, IDimensionsApp } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IBulkPurchaseData } from './bulk-purchase.data';\nimport { IBulkPurchaseProps } from './bulk-purchase.props.autogenerated';\n\n/**\n * Additional optional props for the bulk purchase.\n */\nexport interface IBulkPurchaseExtendedProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n container: IModuleProps;\n content: React.ReactElement;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n}\n\n/**\n * Bulk-purchase module.\n */\nexport class BulkPurchase extends React.PureComponent<IBulkPurchaseExtendedProps, IBulkPurchaseState> {\n public static readonly className = 'ms-bulk-purchase';\n\n public constructor(props: IBulkPurchaseExtendedProps) {\n super(props);\n\n this.state = {\n isExpanded: false\n };\n }\n\n public render(): React.ReactElement | null {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const hasDimensionsInData = ArrayExtensions.hasElements(this.props.data.productDimensions?.result);\n if (!hasDimensionsInProps && !hasDimensionsInData) {\n return null;\n }\n\n const viewProps: IBulkPurchaseViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className: classnames(BulkPurchase.className, this.props.config.className)\n },\n content: this._renderCollapseContent(`${BulkPurchase.className}__content`)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderCollapseContent(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n </div>\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n <Button\n className={className}\n onClick={this._toggleCollapse}\n aria-expanded={this.state.isExpanded}\n title={this.props.resources.bulkPurchaseHeaderTitle}\n >\n {this.props.resources.bulkPurchaseHeaderTitle}\n </Button>\n );\n }\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n <Collapse className={className} isOpen={this.state.isExpanded}>\n {this._renderMainContent(`${className}__main-content`)}\n </Collapse>\n );\n }\n\n private _renderMainContent(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n return (\n <div className={className}>\n {!isMobileDevice && (\n <div className={`${className}__description`}>\n <RichTextComponent text={this.props.resources.bulkPurchaseDescriptionText} />\n </div>\n )}\n {this._renderMatrix(`${className}__matrix-container`)}\n </div>\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n\n return (\n <ProductDimensionsMatrix\n className={className}\n context={this.props.context as ICoreContext<IDimensionsApp>}\n data={{\n dimensions: hasDimensionsInProps ? this.props.productDimensions! : this.props.data.productDimensions!.result!,\n orderTemplates: this.props.data.orderTemplates?.result,\n customerInformation: this.props.data.customerInformation?.result\n }}\n resources={this.props.resources}\n />\n );\n }\n\n /**\n * Callback which toggles collapse mode.\n */\n private readonly _toggleCollapse = () => {\n this.setState(state => ({\n isExpanded: !state.isExpanded\n }));\n };\n}\n\nexport default BulkPurchase;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IBulkPurchaseViewProps } from './bulk-purchase';\n\n/**\n * Bulk purchase view.\n * @param props - Bulk purchase view props.\n * @returns React node with a module.\n */\nexport const BulkPurchaseViewComponent: React.FC<IBulkPurchaseViewProps> = props => {\n return <Module {...props.container}>{props.content}</Module>;\n};\n\nexport default BulkPurchaseViewComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselData } from './carousel.data';\nimport { ICarouselProps } from './carousel.props.autogenerated';\nimport { ICarouselState } from './carousel.state';\n\nexport interface ICarouselViewProps extends ICarouselProps<{}>, ICarouselState {\n closeAnimation: string;\n carouselContainer: IModuleProps;\n telemetryContent: ITelemetryContent;\n next(): void;\n previous(): void;\n onIndicatorsClickHandler(): void;\n handleDismissCarousel(): void;\n handleOnExited(): void;\n handleOnExiting(): void;\n}\n\n/**\n *\n * CarouselModule component.\n * @extends {React.PureComponent<ICarouselProps<ICarouselData>>}\n */\nclass CarouselModule extends React.PureComponent<ICarouselProps<ICarouselData>, ICarouselState> {\n private animating: boolean;\n\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: ICarouselProps<ICarouselData>, state: ICarouselState) {\n super(props);\n this.state = { activeIndex: 0, closeNow: false, dismissCarousel: false };\n this.animating = false;\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public componentDidMount(): void {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n if (this.props.context.request.cookies.get(`CarouselDismiss_${this.props.id}`) === undefined) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'false');\n this.setState({ dismissCarousel: false });\n }\n }\n }\n\n public render(): JSX.Element | null {\n if (this.state.dismissCarousel) {\n return null;\n }\n\n const { className } = this.props.config;\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n ...this.state,\n telemetryContent: this.telemetryContent,\n carouselContainer: {\n moduleProps: this.props,\n className: classnames('ms-carousel', className)\n },\n closeAnimation: this.state.closeNow ? 'close-now' : '',\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n handleDismissCarousel: this._handleDismissCarousel,\n handleOnExited: this._onExited,\n handleOnExiting: this._onExiting\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Function implementation to dismiss the Carousel.\n */\n private readonly _handleDismissCarousel = (): void => {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'true');\n this.setState({ dismissCarousel: true });\n }\n };\n\n /**\n * Function implementation to move to next slide.\n */\n private readonly _next = (): void => {\n const { slots } = this.props;\n const nextIndex = this.state.activeIndex === (slots && slots.content && slots.content.length - 1) ? 0 : this.state.activeIndex + 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n /**\n * Function implementation to move to previous slide.\n */\n private readonly _previous = (): void => {\n const slots = this.props.slots && this.props.slots.content;\n const nextIndex = this.state.activeIndex === 0 ? (slots ? slots.length - 1 : 0) : this.state.activeIndex - 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n private readonly _onExiting = (): void => {\n this.animating = true;\n };\n\n private readonly _onExited = (): void => {\n this.animating = false;\n this.setState({ closeNow: false });\n };\n\n /**\n * Function implementation to move to a given slide.\n * @param newIndex\n */\n private readonly _goToIndex = (newIndex: number): void => {\n if (this.animating) {\n return;\n }\n this.setState({ activeIndex: newIndex });\n };\n}\n\nexport default CarouselModule;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselViewProps } from './carousel';\n\n/**\n * Returns item slots.\n * @returns Array of item slots.\n * @param props -Props.\n */\nconst retrieveItems = (props: ICarouselViewProps): React.ReactNode[] => {\n let items = [];\n items = props.slots && props.slots.content && props.slots.content.length > 0 ? props.slots.content : [];\n return items;\n};\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\n <Module {...props.carouselContainer} {...props.renderModuleAttributes(props)}>\n <Carousel\n className={classnames(props.closeAnimation)}\n activeIndex={props.activeIndex}\n next={props.next}\n previous={props.previous}\n pause={props.config.pauseOnHover ? 'hover' : false}\n ride={props.config.autoplay ? 'carousel' : undefined}\n autoplay={props.config.autoplay}\n interval={props.config.interval}\n transitionType={props.config.transitionType ? props.config.transitionType : undefined}\n items={retrieveItems(props)}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n keyboard={props.config.keyboard}\n />\n </Module>\n);\n\nexport default CarouselView;\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 { IComponentProps } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoCodeProps extends IComponentProps<{}> {\n cart: ICartState | undefined;\n promoCodeHeadingText: string;\n appliedPromoCodeHeadingText: string;\n removePromoAriaLabelFormat: string;\n promoPlaceholderText: string;\n promoCodeApplyButtonText: string;\n collapseTimeOut: number;\n removePromoText: string;\n invalidPromoCodeErrorText: string;\n failedToAddPromoCodeErrorText: string;\n duplicatePromoCodeErrorText: string;\n failedToRemovePromoCodeErrorText: string;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n promoCodeApplyCallback?(): void;\n}\n\ninterface IPromoCodeState {\n isCollapseOpen: boolean;\n promoCodeInputValue: string;\n error: string;\n canApply: boolean;\n}\n\n/**\n *\n * The PromoCode component renders the promocode section.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass PromoCode extends React.Component<IPromoCodeProps, IPromoCodeState> {\n private readonly payLoad: IPayLoad;\n\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\n this.state = {\n isCollapseOpen: false,\n promoCodeInputValue: '',\n error: '',\n canApply: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IPromoCodeProps, nextState: IPromoCodeState): 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 return (\n <div>\n <div className='msc-promo-code-heading'>{this.props.promoCodeHeadingText}</div>\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\n {this.state.error}\n </p>\n {this._renderAppliedPromoCode(this.props)}\n </div>\n );\n }\n\n private readonly _onInputChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\n const error = e.target.value === '' ? '' : this.state.error;\n this.setState({\n promoCodeInputValue: e.target.value.trim(),\n error,\n canApply: !!e.target.value\n });\n };\n\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart) {\n return;\n }\n const appliedPromo = this.state.promoCodeInputValue;\n\n cartState\n .addPromoCode({ promoCode: appliedPromo })\n .then(result => {\n if (result.status === 'SUCCESS') {\n // Show success text\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\n } else if (result.substatus === 'ALREADYADDED') {\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\n } else {\n this.setState({ error: this.props.invalidPromoCodeErrorText });\n }\n })\n .catch(error => {\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\n });\n };\n\n /**\n * On Submit function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n this._applyPromotionHandler(cartState);\n };\n\n /**\n * On apply promotion function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _applyPromotionHandler = (cartState: ICartState | undefined) => () => {\n this._applyPromotion(cartState);\n };\n\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <form onSubmit={this._onSubmitHandler(cartState)} className='msc-promo-code__form-container'>\n <div className='msc-promo-code__group'>\n <input\n className='msc-promo-code__input-box'\n onChange={this._onInputChangeHandler}\n value={this.state.promoCodeInputValue}\n placeholder={promoPlaceholderText}\n />\n <Button\n title={promoCodeApplyButtonText}\n className='msc-promo-code__apply-btn btn'\n onClick={this._applyPromotionHandler(cartState)}\n disabled={!this.state.canApply}\n {...attributes}\n >\n {promoCodeApplyButtonText}\n </Button>\n </div>\n </form>\n );\n };\n\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\n if (!cartState) {\n return;\n }\n const code = event.currentTarget.getAttribute('data-value') || '';\n cartState\n .removePromoCodes({\n promoCodes: [code]\n })\n .then(result => {\n if (result.status === 'SUCCESS') {\n this.setState({ error: '' });\n }\n })\n .catch(() => {\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\n });\n };\n\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\n return;\n }\n let discountAmount = 0;\n for (const line of cartState.cart.CartLines) {\n if (line.DiscountLines) {\n for (const discountLine of line.DiscountLines) {\n if (discountLine.DiscountCode === code) {\n discountAmount += discountLine.DiscountCost!;\n }\n }\n }\n }\n return discountAmount * -1;\n };\n\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || props.cart.cart.Coupons.length === 0) {\n return;\n }\n\n const removePromotionHandler = (event: React.MouseEvent<HTMLElement>) => {\n this._removePromotion(props.cart, event);\n };\n\n const promoCodTotalDiscount = props.cart.cart.Coupons.reduce((count: number, coupon: Coupon) => {\n return count + (this._calculateDiscount(coupon.Code || '', props.cart) || 0);\n }, 0);\n\n return (\n <>\n <div className='msc-promo-code__discount'>\n <div className='msc-promo-code__discount-heading'>{this.props.appliedPromoCodeHeadingText}</div>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: promoCodTotalDiscount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__discount-value'\n />\n </div>\n {props.cart.cart.Coupons.map((coupon: Coupon) => {\n const ariaLabel = props.removePromoAriaLabelFormat\n ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code)\n : '';\n\n return (\n <div key={coupon.Code} className='msc-promo-code__line-container'>\n <div className='msc-promo-code__line-value'>\n {coupon.Code}{' '}\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__line-discount-value'\n />\n </div>\n <Button\n title={props.removePromoText}\n className='msc-promo-code__line__btn-remove'\n onClick={removePromotionHandler}\n data-value={coupon.Code}\n aria-label={ariaLabel}\n >\n {props.removePromoText}\n </Button>\n </div>\n );\n })}\n </>\n );\n };\n}\n\nexport default PromoCode;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n ObjectExtensions,\n PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getTelemetryObject,\n IComponentNodeProps,\n IModuleProps,\n INodeProps,\n ISingleSlideCarouselProps,\n ITelemetryContent,\n NodeTag,\n SingleSlideCarousel\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductCollectionData } from './product-collection.data';\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\n\nexport interface IProductCollectionViewProps extends IProductCollectionProps<IProductCollectionData> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n seeAllButton?: React.ReactNode;\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent<IProductCollectionProps<IProductCollectionData>, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps<IProductCollectionData>) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection.products\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\n await this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n const { heading, className, shouldDisplaySeeAllButton } = this.props.config;\n const { resources } = this.props;\n const recommendation = this.props.config.productCollection.recommendationListId;\n\n // Initialize state in case if the products were not found during initial module render\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\n this.initProductState(this.props.config.productCollection);\n\n const products = this.state.products;\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingLabel = heading ? heading.text : '';\n const headingComponent = heading && (\n <Msdyn365.Text\n className='ms-product-collection__heading'\n tag={heading.tag || 'h1'}\n text={headingLabel}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\n const getProductData = this._getProduct(item, index);\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\n });\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items'\n },\n isCarousel,\n\n products:\n ArrayExtensions.hasElements(updatedProducts) &&\n updatedProducts.filter(item => {\n return item !== undefined;\n }),\n productPrices: this.productPrices,\n seeAllButton:\n recommendation && shouldDisplaySeeAllButton && ArrayExtensions.hasElements(updatedProducts)\n ? this._getSeeAllButton(recommendation, headingLabel)\n : undefined\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n /**\n * Get products dimension availabilities.\n * @param products - Products.\n * @returns Promise.\n */\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n const validProducts = ArrayExtensions.validValues(products);\n if (\n ArrayExtensions.hasElements(validProducts) &&\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\n ) {\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n validProducts,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n }\n };\n\n /**\n * Helper method to initialize products state.\n * @param productCollection - List of products.\n */\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\n let products = this.state.products;\n const productCollectionProducts = productCollection.products;\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\n products = productCollectionProducts;\n this.setState({ products });\n } else if (\n ArrayExtensions.hasElements(products) &&\n ArrayExtensions.hasElements(productCollectionProducts) &&\n !ArrayExtensions.equals(products, productCollectionProducts)\n ) {\n products = productCollectionProducts;\n this.setState({ products });\n }\n\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n };\n\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\n if (!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const quickviewSlot =\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\n const productComparisonButtonSlot = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const reviewCount = 1;\n const reviewTotalRatings = Number(product.TotalRatings);\n const reviewCountAriaLabelValue =\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index\n },\n productComponent: (\n <ProductComponent\n context={this.props.context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n ratingCountAriaLabel={reviewCountAriaLabelValue}\n allowBack={allowBack}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButtonSlot}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled?.IsEnabled}\n priceResources={priceResources}\n dimensionAvailabilities={this.state.productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\n )}\n />\n )\n };\n };\n\n /**\n * Get the active price for products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.state.products;\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n if (Msdyn365.msdyn365Commerce.isBrowser) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n\n this.setState({ products });\n };\n\n /**\n * Get the see all button.\n * @param recommendation - Recommendation.\n * @param headingLabel - Heading label.\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\n */\n private readonly _getSeeAllButton = (recommendation: string, headingLabel: string): React.ReactNode => {\n const catalogId = getCatalogId(this.props.context.request);\n const seeAllLink = `/search?recommendation=${recommendation}&title=${headingLabel}&catalogid=${catalogId}`;\n return (\n <Button\n className='ms-product-collection__see-all-btn msc-cta__primary'\n title={this.props.resources.seeAllButtonText}\n href={seeAllLink}\n >\n {this.props.resources.seeAllButtonText}\n </Button>\n );\n };\n}\n\nexport default ProductCollection;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const {\n heading,\n ProductCollectionContainer,\n products,\n SingleSlideCarouselComponentProps,\n GridComponentProps,\n isCarousel,\n seeAllButton\n } = props;\n\n if (products) {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {seeAllButton}\n {isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)}\n </Module>\n );\n }\n props.context.telemetry.error('Product collection content is empty, module wont render.');\n return null;\n};\n\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return <Node {...carouselContainer}>{items && items.map(_renderProduct)}</Node>;\n};\n\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return <Node {...gridContainer}>{items && items.map(_renderProduct)}</Node>;\n};\n\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\n const { ProductContainer, productComponent } = product;\n\n return <Node {...ProductContainer}>{productComponent}</Node>;\n};\n\nexport default ProductCollectionView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n}\n\nexport const PromoBannerCloseButton: React.FC<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose} {...attributes}>\n <span className='ms-promo-banner__close-button__label' aria-hidden>\n {label}\n </span>\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n <span className='ms-promo-banner__links'>\n {editableLinks && editableLinks.length > 0 ? (\n <Msdyn365.Links links={editableLinks} editProps={{ onTextChange, requestContext }} />\n ) : null}\n </span>\n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n return <Msdyn365.Text className='ms-promo-banner__text' tag='span' text={text} editProps={{ onEdit: onTextChange, requestContext }} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText, bannerAriaLabel } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: {\n className: classnames('ms-promo-banner', className),\n moduleProps: this.props,\n role: 'banner',\n 'aria-label': bannerAriaLabel\n },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && (\n <PromoBannerCloseButton\n {...{\n onClose: this._onDismiss,\n label: closeButtonLabel,\n closeButtonAriaLabel,\n telemetryContent: this.telemetryContent\n }}\n />\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem()\n ? this.props.config.bannerMessages\n ? this.props.config.bannerMessages.length - 1\n : 0\n : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () =>\n this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\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 { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides =\n bannerMessages &&\n bannerMessages.map((message, index) => {\n return (\n <Node {...contentProps} key={index} aria-live='polite' role='marquee'>\n <span className='sr-only'>{promoBannerText}</span>\n {message.text && <Node {...promoBannerTextProps} text={message.text} onClick={handleText} />}\n {message.links && message.links.length > 0 && (\n <Node {...promoBannerLinksProps} links={message.links} onClick={handleLinks} />\n )}\n </Node>\n );\n });\n\n return (\n <Module {...promoBannerProps}>\n <Node {...carouselProps} items={slides} />\n {closeButton}\n </Module>\n );\n};\nexport default PromoBannerView;\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 isB2bCustomer,\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 isB2bCustomer ? (\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 ) : null;\n};\n\nexport default quickOrderGridView;\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 { IQuickOrderDrawerProps } from './quick-order-drawer-props';\n\nexport interface IQuickOrderDrawerState {\n isOpen: boolean;\n}\n\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\n\nexport default class QuickOrderDrawer extends React.Component<IQuickOrderDrawerProps, IQuickOrderDrawerState> {\n public state: IQuickOrderDrawerState;\n\n private readonly drawerOpenGlyph: string;\n\n private readonly drawerCloseGlyph: string;\n\n private readonly drawerGlyphClass: string;\n\n private isManuallyToggled: boolean;\n\n constructor(props: IQuickOrderDrawerProps) {\n super(props);\n this._toggle = this._toggle.bind(this);\n this.isManuallyToggled = false;\n this.state = { isOpen: (props.collapseProps && props.collapseProps.isOpen) || false };\n this.drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n\n if (this.props.animateGlyph) {\n this.drawerOpenGlyph = classnames(\n this.drawerGlyphClass,\n this.props.openGlyph ? this.props.openGlyph : this.props.closeGlyph ? this.props.closeGlyph : ''\n );\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, this.props.closeGlyph ? this.props.closeGlyph : '');\n }\n }\n\n public shouldComponentUpdate(nextProps: IQuickOrderDrawerProps, nextState: IQuickOrderDrawerState): 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 = { ...this.props.collapseProps } as ICollapseProps;\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 } else {\n // eslint-disable-next-line react/no-direct-mutation-state\n this.state.isOpen = collapseProps.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className ? this.props.className : '');\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.disabled}\n className='drawer__button'\n color='secondary'\n >\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\n </Button>\n <Collapse {...collapseProps} />\n </div>\n );\n }\n\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n return (\n <>\n <h2 className={classnames(drawerButtonTextClass, '__start ms-quick-order__heading')}>{this.props.moduleHeadingText}</h2>\n <span className={classnames(drawerButtonTextClass, '__start ms-quick-order__description')}>\n {this.props.moduleDescriptionText}\n </span>\n {this._generateGlyphMarkup('drawer__glyph__end', collapseState)}\n </>\n );\n }\n\n private _generateGlyphMarkup(location: string, collapseState: boolean): JSX.Element {\n let glyphClass = collapseState ? this.drawerOpenGlyph : this.drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return <span className={glyphClass} />;\n }\n\n private _toggle(e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void {\n e.preventDefault();\n this.setState({ isOpen: !this.state.isOpen });\n this.isManuallyToggled = true;\n if (this.props.onToggle) {\n this.props.onToggle(this.state);\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 { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderState } from '../quick-order';\n\nexport interface IQuickOrderFormProps {\n disableAddtoCart: boolean | undefined;\n productTextInput: React.RefObject<HTMLInputElement>;\n quantityTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n maxQuantity?: number;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n addQuantityPlaceholderText: string;\n quickOrderState: IQuickOrderState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddToCartClick(): Promise<void>;\n}\n\nexport interface IQuickOrderFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToCartBtn: 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\nexport const QuickOrderFormComponent = (props: IQuickOrderFormProps): IQuickOrderFormViewProps => {\n const {\n productTextInput,\n quantityTextInput,\n quickOrderState,\n maxChars,\n maxQuantity,\n disableAddtoCart,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n addQuantityPlaceholderText,\n handleQuantityChange,\n handleInputChange,\n handleAddToCartClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n <div className='ms-quick-order__content-form-main-product'>\n <h2 className='ms-quick-order__content-form-main-product-lable' aria-label={ariaLabelProduct}>\n {ariaLabelProduct}\n </h2>\n <input\n className='ms-quick-order__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='ms-quick-order__content-form-main-quantity'>\n <h2 className='ms-quick-order__content-form-main-quantity-lable' aria-label={ariaLabelQuantity}>\n {ariaLabelQuantity}\n </h2>\n <input\n className='ms-quick-order__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={quickOrderState.quantity}\n placeholder={addQuantityPlaceholderText}\n />\n </div>\n );\n\n const addtoCartNode = (\n <div className='ms-quick-order__content-form-main-addtocart'>\n <Button\n className='ms-quick-order__content-form-main-addtocart-button'\n disabled={disableAddtoCart}\n aria-label={ariaLabelAddtoCart}\n onClick={handleAddToCartClick}\n >\n {ariaLabelAddtoCart}\n </Button>\n </div>\n );\n\n const userMessageNode =\n quickOrderState && quickOrderState.stateMessage ? (\n <Alert color={quickOrderState.stateMessage.statusCssString} isOpen={quickOrderState.stateMessage.isOpen}>\n <span className={quickOrderState.stateMessage.messageGlyph} />\n <span>{quickOrderState.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToCartBtn: addtoCartNode,\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 { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order.\n */\nexport class QuickOrderProduct {\n @observable\n public isSelected: boolean;\n\n public readonly cartLine: CartLine;\n\n public readonly simpleProduct: SimpleProduct;\n\n public constructor(cartLine: CartLine, simpleProduct: SimpleProduct) {\n this.cartLine = cartLine;\n this.simpleProduct = simpleProduct;\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 table header resources.\n */\nexport interface IQuickOrderTableHeaderResources {\n quickOrderProductNumberText: string;\n quickOrderProductText: string;\n quickOrderUnitPriceText: string;\n quickOrderUnitOfMeasureText: string;\n quickOrderQuantityText: string;\n quickOrderTotalText: string;\n quickOrderActionsText: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderTableHeaderResources;\n}\n\n/**\n * Interface for quick order table header component.\n */\nexport interface IQuickOrderTableHeaderComponent extends IComponent<IQuickOrderTableHeaderProps> {}\n\n/**\n * Get the quick order header cells for desktop.\n * @param props -- The quick order table header props.\n * @returns The list of cells for quick order header component in desktop version.\n */\nconst QuickOrderDesktopHeaderCellsComponent: React.FC<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\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.quickOrderProductNumberText}</th>\n <th>{resources.quickOrderProductText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderUnitPriceText}</th>\n <th>{resources.quickOrderUnitOfMeasureText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderQuantityText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderTotalText}</th>\n <th>{resources.quickOrderActionsText}</th>\n </>\n );\n};\n\n/**\n * Get the quick order header cells for mobile.\n * @param props -- The quick order table header props.\n * @returns The quick order header component in desktop version.\n */\nconst QuickOrderMobileHeaderCellsComponent: React.FC<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={classnames(`${props.className}__emptyColumn`)} />\n <th>{resources.quickOrderProductNumberText}</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 QuickOrderTableHeaderComponent: React.FC<IQuickOrderTableHeaderProps> = (props: IQuickOrderTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <QuickOrderDesktopHeaderCellsComponent {...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 { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { CartLine, format, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * Data required to render each quick order row.\n */\nexport interface IQuickOrderTableRowData {\n cartLine: CartLine;\n product: SimpleProduct;\n}\n\n/**\n * Resources for quick order table rows.\n */\nexport interface IQuickOrderTableRowResources {\n quickOrderQuantityMobileText: string;\n quickOrderProductDimensionsSeparator: string;\n quickOrderViewDetailsButtonText: string;\n quickOrderViewDetailsButtonAriaLabel: string;\n quickOrderRemoveItemButtonAriaLabel: string;\n quickOrderInputQuantityAriaLabel: string;\n quickOrderDecrementButtonAriaLabel: string;\n quickOrderIncrementButtonAriaLabel: string;\n}\n\n/**\n * Interface for quick order table props.\n */\nexport interface IQuickOrderTableRowProps extends IComponentProps<IQuickOrderTableRowData> {\n context: ICoreContext;\n className: string;\n\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderTableRowResources;\n}\n\n/**\n * The default image settings for quick order 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 row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderTableRowProductImageComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const fallbackImageUrl = getFallbackImageUrl(props.data.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={props.data.product.Name}\n src={props.data.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\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderExtraActionsPopupComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps): JSX.Element | null => {\n const product: SimpleProduct = props.data.product;\n\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 if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} />\n </div>\n );\n};\n\n/**\n * Renders quick order table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order rows for desktop view.\n */\nexport const QuickOrderDesktopTableRowCellComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n\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 <QuickOrderTableRowProductImageComponent {...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.quickOrderProductDimensionsSeparator)}\n </span>\n </div>\n </td>\n <td className={columnWithNumberClassName}>{cartLine.Price}</td>\n <td>{cartLine.UnitOfMeasureSymbol}</td>\n <td className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order__quantity_${product.RecordId}-${cartLine.LineId ?? ''}`}\n max={10}\n currentCount={cartLine.Quantity}\n inputQuantityAriaLabel={props.resources.quickOrderInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderIncrementButtonAriaLabel}\n key={cartLine.LineId}\n isGiftCard={product.IsGiftCard}\n />\n </td>\n <td className={columnWithNumberClassName}>{cartLine.TotalAmount}</td>\n <td>\n <Button className={`${props.className}__product-remove`} aria-label={props.resources.quickOrderRemoveItemButtonAriaLabel} />\n </td>\n </>\n );\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 rows for mobile view.\n */\nexport const QuickOrderMobileTableRowCellComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const product: SimpleProduct = props.data.product;\n const cartLine: CartLine = props.data.cartLine;\n\n return (\n <>\n <td>\n <QuickOrderTableRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{product.ItemId}</span>\n <span className={`${props.className}__product-quantity`}>\n {format(props.resources.quickOrderQuantityMobileText, cartLine.Quantity)}\n </span>\n </div>\n </td>\n <td>\n <QuickOrderExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\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 QuickOrderTableRowComponent: React.FC<IQuickOrderTableRowProps> = (props: IQuickOrderTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderMobileTableRowCellComponent {...props} />;\n } else {\n headerCells = <QuickOrderDesktopTableRowCellComponent {...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 } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderProduct } from '../quick-order-product';\nimport { IQuickOrderTableHeaderResources, QuickOrderTableHeaderComponent } from './components/quick-order-table-header-component';\nimport { IQuickOrderTableRowResources, QuickOrderTableRowComponent } from './components/quick-order-table-row-component';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderTableData {\n quickOrderProducts: QuickOrderProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderTableResources extends IQuickOrderTableHeaderResources, IQuickOrderTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderTableProps extends IComponentProps<IQuickOrderTableData> {\n context: ICoreContext;\n className: string;\n\n resources: IQuickOrderTableResources;\n isMobileView: boolean;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderTableComponent extends IComponent<IQuickOrderTableProps> {}\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 QuickOrderTableComponent: React.FC<IQuickOrderTableProps> = (props: IQuickOrderTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderProducts = props.data.quickOrderProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\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 <QuickOrderTableHeaderComponent\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 {quickOrderProducts.map((quickOrderProduct, index) => {\n return (\n <QuickOrderTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={quickOrderProduct.simpleProduct.ItemId}\n className={rowClassName}\n resources={props.resources}\n isMobile={isMobile}\n data={{\n cartLine: quickOrderProduct.cartLine,\n product: quickOrderProduct.simpleProduct\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 { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport {\n getProductConfigure,\n IErrorState,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport { CartLine, ProductDimension, ProductDimensionValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getProductAvailabilitiesForSelectedVariant,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IProductInventoryInformation,\n IPromiseQueue,\n ObjectExtensions,\n ProductAvailabilitiesForSelectedVariantInput,\n QueryResultSettingsProxy,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { QuickOrderDrawer, QuickOrderFormComponent, QuickOrderProduct } from './components';\nimport { QuickOrderTableComponent } from './components/quick-order-table/quick-order-table-component';\nimport { IQuickOrderData } from './quick-order.data';\nimport { IQuickOrderProps, IQuickOrderResources } from './quick-order.props.autogenerated';\n\n/**\n * Quick Order View Props Interface properties.\n */\nexport interface IQuickOrderViewProps extends IQuickOrderProps<IQuickOrderData> {\n isB2B?: boolean;\n productText: string;\n isQuickOrderFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n quickOrderForm: INodeProps;\n quickOrderFormProductContent: INodeProps;\n quickOrderFormMsgContent: INodeProps;\n quickOrderProps: IModuleProps;\n quickOrderList?: React.ReactNode;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n}\n\n/**\n * Quick Order State Message Interface properties.\n */\nexport interface IQuickOrderStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * GridSize Interface properties.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Quick Order Interface properties.\n */\nexport interface IQuickOrderState {\n isQuickOrderFormExpanded: boolean;\n isUpdatingDimension?: boolean;\n productAvailableQuantity: IProductInventoryInformation | undefined;\n productResponse: SimpleProduct | undefined;\n productDimensions: ProductDimensionFull[] | undefined;\n productText: string;\n quantity: number;\n stateMessage?: IQuickOrderStateMessage;\n productDimensionErrorState: IErrorState;\n isMobile: boolean;\n products: SimpleProduct[];\n}\n\n/**\n *\n * QuickOrder component.\n * @extends {React.PureComponent<IQuickOrderProps<IQuickOrderData>, IQuickOrderState>}\n */\nclass QuickOrder extends React.PureComponent<IQuickOrderProps<IQuickOrderData>, IQuickOrderState> {\n @observable\n private readonly viewport: GridSize;\n\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 quickOrderFormClass: string;\n\n private readonly quickOrderFormProductContent: string;\n\n private readonly quickOrderFormMsgContent: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(2);\n\n private dimensions: { [id: number]: string } = {};\n\n private readonly cssClassNameConfigure: string = 'ms-quick-order__content-form-main';\n\n // @ts-expect-error -- Existing code.\n private cancellabelDebounce: debounce;\n\n private readonly quickOrderCallbacks: IProductDimensionCallbacks = {\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\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: any) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw 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 public constructor(props: IQuickOrderProps<IQuickOrderData>) {\n super(props);\n this.productTextInput = React.createRef();\n this.quantityInput = React.createRef<HTMLInputElement>();\n this.viewport = props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n productText: '',\n isQuickOrderFormExpanded: false,\n productAvailableQuantity: undefined,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: []\n };\n this._handleInputChange = this._handleInputChange.bind(this);\n this._handleQuantityChange = this._handleQuantityChange.bind(this);\n this.quickOrderFormClass = 'ms-quick-order__content-form';\n this.quickOrderFormProductContent = 'ms-quick-order__content-form-main';\n this.quickOrderFormMsgContent = 'ms-quick-order__content-form-msg';\n }\n\n @computed get isMobile(): boolean {\n return this.viewport === 'xs' || this.viewport === 'sm';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderModuleHeading,\n quickOrderModuleDescription,\n quickOrderAddtobag,\n quickOrderProductQuantityInputLabel,\n quickOrderProductInputLabel,\n quickOrderProductDimensionTypeColor,\n quickOrderProductDimensionTypeConfiguration,\n quickOrderSelectDimensionFormatString,\n quickOrderProductDimensionTypeSize,\n quickOrderProductDimensionTypeStyle,\n quickOrderProductDimensionTypeAmount,\n quickAddQuantityPlaceholderText\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderProductDimensionTypeAmount\n };\n\n const { isQuickOrderFormExpanded, productText, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const moduleClassName: string = 'ms-quick-order';\n\n const viewProps: IQuickOrderViewProps = {\n ...(this.props as IQuickOrderProps<IQuickOrderData>),\n\n quickOrderProps: { className: classnames('ms-quick-order', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order__content' },\n isB2B: customerInfo?.IsB2b,\n drawer: {\n tag: QuickOrderDrawer,\n className: `${moduleClassName}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderFormExpanded },\n moduleHeadingText: quickOrderModuleHeading,\n moduleDescriptionText: quickOrderModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent\n },\n quickOrderForm: {\n className: `${this.quickOrderFormClass} ${isQuickOrderFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderFormProductContent: {\n className: this.quickOrderFormProductContent\n },\n quickOrderFormMsgContent: {\n className: this.quickOrderFormMsgContent\n },\n productText,\n quickOrderList: ArrayExtensions.hasElements(this.state.products) ? this._renderQuickOrderTable('ms-quick-order') : undefined,\n form: QuickOrderFormComponent({\n productTextInput: this.productTextInput,\n quantityTextInput: this.quantityInput,\n disableAddtoCart: !productResponse,\n ariaLabelAddtoCart: quickOrderAddtobag,\n ariaLabelProduct: quickOrderProductInputLabel,\n ariaLabelQuantity: quickOrderProductQuantityInputLabel,\n addQuantityPlaceholderText: quickAddQuantityPlaceholderText,\n maxChars: 50,\n maxQuantity,\n quickOrderState: this.state,\n handleInputChange: this._handleInputChange,\n handleAddToCartClick: this._addItemToCart,\n handleQuantityChange: this._handleQuantityChange\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this.cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderSelectDimensionFormatString,\n productConfigureResources,\n this.quickOrderCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderFormExpanded: this.state.isQuickOrderFormExpanded,\n isMobileView: this.state.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderProducts(): QuickOrderProduct[] {\n const {\n data: {\n cart: { result: cart }\n }\n } = this.props;\n\n const products: SimpleProduct[] = this.state.products;\n\n const quickOrderProducts = cart?.cart.CartLines?.map((cartLine: CartLine) => {\n const quickOrderProduct = products.find(product => product.RecordId === cartLine.ProductId);\n if (ObjectExtensions.isNullOrUndefined(quickOrderProduct)) {\n return undefined;\n }\n\n return new QuickOrderProduct(cartLine, quickOrderProduct);\n });\n\n return ArrayExtensions.validValues(quickOrderProducts);\n }\n\n /**\n * Render Quick Order Table.\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 <QuickOrderTableComponent\n id={tableClassName}\n typeName={this.props.typeName}\n key={tableClassName}\n className={tableClassName}\n data={{ quickOrderProducts: this._initQuickOrderProducts() }}\n context={this.props.context}\n resources={this.props.resources}\n isMobileView={this.state.isMobile}\n />\n );\n }\n\n /**\n * Method to handle input change.\n * @param query - Class name.\n */\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length > 4) {\n this.setState({ productText: query, quantity: 0, productResponse: undefined, productDimensions: [] });\n this.setState({\n stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n }\n });\n const inputQuantityText = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (inputQuantityText) {\n inputQuantityText.value = '0';\n }\n } else {\n return;\n }\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 maxChar = 50;\n if (context) {\n if (!StringExtensions.isNullOrWhitespace(query)) {\n if (query.length > maxChar) {\n return;\n }\n\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 isQuickOrderFormExpanded: true\n });\n })\n .catch(error => {\n this.setState({ productText: '' });\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 }, 0);\n this.setState({ productText: query, isQuickOrderFormExpanded: true });\n } else {\n this.setState({ productText: '', productResponse: undefined, isQuickOrderFormExpanded: true });\n }\n }\n };\n\n /**\n * Method to add product in cart.\n */\n private readonly _addItemToCart = async (): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { quickOrderAddedToCartSuccessMessage, quickOrderAddedToCartFailureMessage } = resources;\n const { productResponse, quantity } = this.state;\n this.setState({\n stateMessage: {\n messageText: '',\n statusCssString: '',\n messageGlyph: '',\n isOpen: false\n }\n });\n\n if (context && productResponse !== undefined && this._validateCart(productResponse, quantity) && cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context.request.app.platform?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n // Get product delivery mode info\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [productResponse.RecordId]\n );\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n const defaultDeliveryOption =\n ArrayExtensions.hasElements(deliveryOptions) && ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions)\n ? deliveryOptions[0].DeliveryOptions[0].Code\n : undefined;\n\n const isOrderQuantityLimitsFeatureEnabled =\n isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailablity();\n }\n const { productAvailableQuantity } = this.state;\n const addProductToCartInput = {\n product: productResponse,\n count: quantity,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code.\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart: defaultDeliveryOption !== undefined && defaultDeliveryOption === emailDeliveryModeCode,\n deliveryMode: defaultDeliveryOption\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.props.telemetry.debug('[quick-order] Cart Updated');\n const inputProductText = this.productTextInput.current instanceof HTMLInputElement && this.productTextInput.current;\n const inputQuantityText = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n if (inputProductText) {\n inputProductText.value = '';\n }\n if (inputQuantityText) {\n inputQuantityText.value = '0';\n }\n // clean dimensions once product is added to cart\n this.dimensions = [];\n this.setState({\n productText: '',\n quantity: 0,\n productResponse: undefined,\n productDimensions: [],\n stateMessage: {\n messageText: quickOrderAddedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n }\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order', quantity);\n const maxQtyLimitReachedMessage = this._getMaxQtyMessage(productAvailableQuantity, quantity);\n\n this.setState({\n stateMessage: {\n messageText: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n this.props.telemetry.debug(\n '[quick-order] Unable to Update Cart Line from the quick order',\n maxQtyLimitReachedMessage\n );\n\n this.setState({\n stateMessage: {\n messageText: maxQtyLimitReachedMessage || quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n } else {\n this.props.telemetry.debug('[quick-order] Unable to Update Cart Line from the quick order');\n\n this.setState({\n stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[quick-order] Error trying to Update Cart Line from the quick order');\n\n this.setState({\n stateMessage: {\n messageText: quickOrderAddedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n });\n }\n };\n\n private _getMaxQtyMessage(productInventoryInfo: IProductInventoryInformation | undefined, currentQuantity: number): string {\n const { context, data } = this.props;\n const { cart } = data;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing code.\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n const addedQuantity = cart.result?.cart.CartLines?.find(item => item.ItemId?.toString() === this.state.productText)?.Quantity || 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- existing code.\n if (\n !productInventoryInfo ||\n !productInventoryInfo.ProductAvailableQuantity.AvailableQuantity ||\n !context.app.config.enableStockCheck\n ) {\n return this._getConcatenatedMaxQtyMessage(addedQuantity.toString(), maxQuantityForLineItem.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, productInventoryInfo.ProductAvailableQuantity.AvailableQuantity);\n\n return this._getConcatenatedMaxQtyMessage(currentQuantity.toString(), minInventory.toString());\n }\n\n /**\n * Method to return concatenated added quantity Message.\n * @param currentQuantity - Current or added Quantity.\n * @param maxQuantity - Max Quantity.\n * @returns - ConcatenatedMaxQtyMessage.\n */\n private readonly _getConcatenatedMaxQtyMessage = (currentQuantity: string, maxQuantity: string): string => {\n const { quickOrderMaxQuantityLimitText, quickOrderAlreadyItemQuantityText } = this.props.resources;\n\n if (currentQuantity !== '0') {\n return (\n quickOrderAlreadyItemQuantityText.replace('{curQuantity}', currentQuantity) +\n quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantity)\n );\n }\n\n return quickOrderMaxQuantityLimitText.replace('{maxQuantity}', maxQuantity);\n };\n\n /**\n * Method to handle quantity change.\n * @param value - Quantity.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n let currentValue = Number.parseInt(value, 10);\n const inputElement = this.quantityInput.current instanceof HTMLInputElement && this.quantityInput.current;\n\n if (isNaN(currentValue)) {\n currentValue = 0;\n }\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (!isNaN(this.state.quantity) && this.state.quantity >= 0 && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, 200)();\n });\n };\n\n private readonly _updateDimensionValue = (\n productDimensionFull: ProductDimensionFull,\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 private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update product dimension.\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 if (!productResponse || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\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 key of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[key]) {\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[key] = 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 const selectedProduct = new Promise<SimpleProduct | null>(async (resolve, reject) => {\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 if (variantProduct) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(variantProduct.RecordId, channelId),\n actionContext\n );\n\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n }\n };\n\n /**\n * Method to update product availablity.\n */\n private readonly _updateAvailablity = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productResponse } = this.state;\n if (!productResponse) {\n return;\n }\n\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(productResponse.RecordId, channelId),\n actionContext\n );\n\n if (newAvailableQuantity && ArrayExtensions.hasElements(newAvailableQuantity)) {\n const productAvailable = newAvailableQuantity.find(\n quantity => quantity.ProductAvailableQuantity.ProductId === productResponse.RecordId\n );\n this.setState({ productAvailableQuantity: productAvailable });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n };\n\n /**\n * Method to get dimension error string.\n * @param dimensionTypeValue - Dimension value.\n * @param resources - Localized error message.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Dimension error string.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderResources,\n isGiftCard?: boolean\n ): string => {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.quickOrderproductDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.quickOrderproductDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.quickOrderproductDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard\n ? resources.quickOrderproductDimensionTypeAmountErrorMessage\n : resources.quickOrderproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Method to validate the cart.\n * @param productResponse - Simple product object.\n * @param quantity - Quantity.\n * @returns Flag after validating cart.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n const missingDimensions = productResponse.Dimensions?.filter((dimension: ProductDimension) => !dimension.DimensionValue?.Value);\n if (missingDimensions && missingDimensions.length > 0) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n if (this.state.productDimensionErrorState.configureErrors) {\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 <= 0) {\n const resources = this.props.resources;\n this.setState({\n stateMessage: {\n messageText: resources.quickOrderWrongQuantityErrorMsg,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n }\n });\n return false;\n }\n return true;\n };\n\n /**\n * Method to get configuration error string.\n * @param result - List of Dimension values.\n * @param isGiftCard - Flag to check giftcard.\n * @returns Error object.\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\nexport default QuickOrder;\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 { IQuickOrderFormViewProps } from './components';\nimport { IQuickOrderViewProps } from './quick-order';\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 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\nconst renderForm = (\n form: IQuickOrderFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMsgContent: 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 {...quickOrderMsgContent}>{form.userMessage}</Node>\n {form.addToCartBtn}\n </Node>\n </Node>\n ) : (\n <Node {...quickOrderForm}>\n <Node {...quickOrderMsgContent}>{form.userMessage}</Node>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToCartBtn}\n </Node>\n </Node>\n );\n};\n\nconst quickOrderView: React.FC<IQuickOrderViewProps> = props => {\n const {\n isB2B,\n quickOrderProps,\n contentProps,\n form,\n quickOrderForm,\n drawer,\n configure,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n quickOrderList,\n isMobileView\n } = props;\n\n return isB2B ? (\n <Module {...quickOrderProps}>\n <Node {...drawer}>\n <Node {...contentProps}>\n {renderForm(\n form as IQuickOrderFormViewProps,\n isMobileView,\n quickOrderForm,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n configure\n )}\n </Node>\n </Node>\n\n {quickOrderList}\n </Module>\n ) : null;\n};\nexport default quickOrderView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitUserReviewInput } from './inputs/submit-user-review-input';\n\n/**\n * This data action allows submitting review to the reviews service.\n * @param input This user review submission text.\n * @param ctx The data action context.\n */\nasync function submitReview(input: SubmitUserReviewInput, ctx: IActionContext): Promise<string> {\n if (!inputIsValid(input)) {\n ctx.trace(`[SubmitUserReview] Failed to submit reviews for product due to bad input ${input}`);\n return '';\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/reviews/product/${input.productId}/user?` +\n `tenantId=${input.tenantId}&` +\n `channelId=${input.channelId}&` +\n `locale=${input.locale}`;\n\n return sendRequest<string>(requestUrl, 'post', input.userReviewData, { headers: { Authorization: `id_token ${input.authorization}` } })\n .then(response => {\n if (response.status !== 200 && response.status !== 201) {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(response.data);\n return '';\n }\n return response.data;\n })\n .catch(error => {\n ctx.trace('[SubmitUserReview] Failed to submit reviews for product');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitUserReview] Failed to submit reviews for product');\n ctx.trace(error);\n return '';\n });\n}\n\nfunction inputIsValid(input: SubmitUserReviewInput): boolean {\n return input && !!input.productId && !!input.tenantId;\n}\n\nexport const submitReviewDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-user-review',\n action: <IAction<string>>submitReview\n});\n\nexport default submitReviewDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IUserReviewData } from './submit-user-review-input-data';\n\n/**\n * SubmitUserReview Input Action.\n */\nexport class SubmitUserReviewInput implements IActionInput {\n /**\n * The Id representing the product to get the ratings for.\n */\n public productId?: string;\n\n /**\n * The ID representing the tenant.\n */\n public tenantId: string;\n\n /**\n * The calling organization's channel id.\n */\n public channelId: string;\n\n /**\n * The locale for which to get the ratings from.\n */\n public locale: string;\n\n /**\n * The user's review data.\n */\n public userReviewData: IUserReviewData;\n\n /**\n * The user's authorization token.\n */\n public authorization: string;\n\n /**\n * The ratings and reviews service endpoint.\n */\n public serviceEndpoint: string;\n\n constructor(\n productId: string | undefined,\n tenantId: string,\n channelId: string,\n locale: string,\n userReviewData: IUserReviewData,\n authorization: string,\n serviceEndpoint: string\n ) {\n this.productId = productId;\n this.tenantId = tenantId;\n this.channelId = channelId;\n this.locale = locale;\n this.userReviewData = userReviewData;\n this.authorization = authorization;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitUserReview';\n\n public getCacheObjectType = () => 'SubmitUserReview';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getRnrAuthEndpointId, getRnrPartnerId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { GetUserReviewInput } from '../actions/inputs/get-user-review-input';\nimport { SubmitUserReviewInput } from '../actions/inputs/submit-user-review-input';\nimport submitUserReview from '../actions/submit-user-review';\n\nexport interface IReviewModalProps {\n userReview?: Review;\n product?: SimpleProduct;\n renderContextId: string;\n resources: IReviewModalResources;\n context: ICoreContext<IGeneric<IAny>>;\n parentId: string;\n parentType: string;\n isOpen: boolean;\n rating: number;\n reviewTitle: string;\n reviewText: string;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onTitleChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onTextChange(event: React.ChangeEvent<HTMLTextAreaElement>): void;\n onRatingChange(value: number): void;\n onReviewComplete?(isSuccess: boolean): void;\n}\n\nexport interface IReviewModalResources {\n selectRatingAriaLabel: string;\n selectRatingLabel: string;\n reviewTitleLabel: string;\n reviewTextLabel: string;\n privacyPolicyTitle: string;\n privacyPolicyTextFormat: string;\n writeReviewModalTitle: string;\n editReviewModalTitle: string;\n submitReviewButtonText: string;\n discardReviewButtonText: string;\n errorMessageText: string;\n reviewTitleAriaLabel?: string;\n reviewAriaLabel?: string;\n}\n\nexport interface IReviewModalViewProps {\n modal: INodeProps;\n modalHeader: React.ReactElement;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n rating: React.ReactElement;\n ratingLabel: React.ReactElement;\n titleInput: React.ReactElement;\n titleLabel: React.ReactElement;\n textInput: React.ReactElement;\n textLabel: React.ReactElement;\n privacyPolicyUrl: React.ReactElement;\n form: INodeProps;\n inputRow: INodeProps;\n error: React.ReactElement;\n}\n\n/**\n * On Click Submit.\n * @param props -Review Modal props.\n * @returns On submit.\n */\nconst onClickSubmit = (props: IReviewModalProps) => () => {\n onSubmit(props);\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const ReviewModal = (props: IReviewModalProps): IReviewModalViewProps => {\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelButtonAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return {\n modal: {\n tag: Modal,\n className: 'ms-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: modalHeaderNode(props),\n modalFooter: { tag: ModalFooter, className: 'ms-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-review-modal-body' },\n cancelButton: (\n <Button className='ms-review-modal-cancel' onClick={props.onModalToggle} {...submitButtonAttribute}>\n {props.resources.discardReviewButtonText}\n </Button>\n ),\n submitButton: (\n <Button\n className='ms-review-modal-submit'\n onClick={onClickSubmit(props)}\n {...cancelButtonAttribute}\n disabled={submitDisabled(props)}\n >\n {props.resources.submitReviewButtonText}\n </Button>\n ),\n rating: ratingsInput(props),\n ratingLabel: ratingsLabel(props),\n titleInput: titleInput(props),\n titleLabel: titleLabel(props),\n textInput: textInput(props),\n textLabel: textLabel(props),\n privacyPolicyUrl: privacyPolicyLink(props),\n form: { tag: 'form', className: 'ms-review-modal-form', autoComplete: 'off' },\n inputRow: { tag: 'div', className: 'ms-review-modal-row', autoComplete: 'off' },\n error: (\n <Alert className='ms-review-modal-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n )\n };\n};\n\nconst modalHeaderNode = (props: IReviewModalProps) => {\n return (\n <ModalHeader toggle={props.onModalToggle} className='ms-review-modal-header'>\n {props.userReview && props.userReview.reviewId ? props.resources.editReviewModalTitle : props.resources.writeReviewModalTitle}\n </ModalHeader>\n );\n};\n\nconst submitDisabled = (props: IReviewModalProps) => {\n return !props.rating || !stripWhiteSpacesFromString(props.reviewText) || !stripWhiteSpacesFromString(props.reviewTitle);\n};\n\nconst ratingsInput = (props: IReviewModalProps) => {\n return (\n <RatingComponent\n readOnly={false}\n avgRating={0}\n ariaLabel={props.resources.selectRatingAriaLabel}\n initialRating={props.rating}\n context={props.context}\n id={props.parentId}\n typeName={props.parentType}\n data={{}}\n key='ratings'\n onChange={props.onRatingChange}\n />\n );\n};\n\nconst ratingsLabel = (props: IReviewModalProps) => {\n return (\n <label className='ms-review-modal-rating-label' key='ratingsLabel'>\n {props.resources.selectRatingLabel}*\n </label>\n );\n};\n\nconst titleInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTitleMaxLength;\n\n return (\n <input\n maxLength={maxLength}\n id={`reviewTitle-${props.renderContextId}`}\n onChange={props.onTitleChange}\n value={props.reviewTitle}\n aria-required='true'\n className='ms-review-modal-title'\n aria-label={props.resources.reviewTitleAriaLabel}\n />\n );\n};\n\nconst titleLabel = (props: IReviewModalProps) => {\n return (\n <label className='ms-review-modal-title-label' htmlFor={`reviewTitle-${props.renderContextId}`}>\n {props.resources.reviewTitleLabel}\n </label>\n );\n};\n\nconst reviewTextWidth: number = 50;\n\nconst textInput = (props: IReviewModalProps) => {\n const maxLength = props.context.app.config.reviewTextMaxLength;\n return (\n <textarea\n maxLength={maxLength}\n className='ms-review-modal-text'\n id={`reviewTextArea-${props.renderContextId}`}\n onChange={props.onTextChange}\n rows={maxLength / reviewTextWidth}\n value={props.reviewText}\n aria-required='true'\n aria-label={props.resources.reviewAriaLabel}\n />\n );\n};\n\nconst textLabel = (props: IReviewModalProps) => {\n return (\n <label htmlFor={`reviewTextArea-${props.renderContextId}`} className='ms-review-modal-text-label'>\n {props.resources.reviewTextLabel}\n </label>\n );\n};\n\nconst privacyPolicyLink = (props: IReviewModalProps) => {\n const policyTextBlocks = props.resources.privacyPolicyTextFormat.split('{0}');\n const isSeparatorAtStart = props.resources.privacyPolicyTextFormat.startsWith('{0}');\n const isSeparatorAtEnd = props.resources.privacyPolicyTextFormat.endsWith('{0}');\n const privacyPolicyUrl = getUrlSync('rnrPrivacyPolicy', props.context.actionContext);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.PrivacyPolicy);\n const privacyPolicyAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n <p className='ms-review-modal-policy'>\n {isSeparatorAtStart ? '' : policyTextBlocks[0]}\n <a href={privacyPolicyUrl} rel='noreferrer' target='_blank' className='msc-link' {...privacyPolicyAttribute}>\n {props.resources.privacyPolicyTitle}\n </a>\n {isSeparatorAtEnd ? '' : isSeparatorAtStart ? policyTextBlocks[0] : policyTextBlocks[1]}\n </p>\n );\n};\n\nconst onSubmit = (props: IReviewModalProps): void => {\n if (props.product) {\n submitReview(\n props.product,\n props.reviewTitle,\n props.reviewText,\n props.rating,\n props.context,\n props.userReview,\n props.onReviewComplete\n );\n }\n};\n\n/**\n * This method strips content of extra white spaces.\n * @param text The text to be stripped of extra white spaces.\n */\nconst stripWhiteSpacesFromString = (text: string): string => {\n return text\n .replace(new RegExp('\\\\r?\\\\n|\\\\r+', 'g'), ' ')\n .replace(new RegExp('\\\\s+', 'g'), ' ')\n .trim();\n};\n\nexport const submitReview = (\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n) => {\n const { request } = context;\n const { user } = request;\n if (user && request) {\n const input = new SubmitUserReviewInput(\n product.RecordId.toString(),\n getRnrPartnerId(context.actionContext),\n request.apiSettings.channelId.toString(),\n request.locale,\n {\n productName: product && product.Name,\n rating,\n reviewText: stripWhiteSpacesFromString(text),\n title: stripWhiteSpacesFromString(title),\n userEmail: user.emailAddress,\n userName: user.name\n },\n request.user.token,\n getRnrAuthEndpointId(context.actionContext)\n );\n\n submitUserReview(input, context.actionContext)\n .then(reviewId => {\n const review = reviewId\n ? {\n rating,\n title: stripWhiteSpacesFromString(title),\n reviewText: stripWhiteSpacesFromString(text),\n submittedDateTime: new Date(),\n helpfulPositive: userReview ? userReview.helpfulPositive : 0,\n helpfulNegative: userReview ? userReview.helpfulNegative : 0,\n reviewId,\n userName: request.user.firstName || request.user.name\n }\n : userReview;\n\n const getReviewInput = new GetUserReviewInput(input.productId!, input.tenantId, input.authorization, input.serviceEndpoint);\n context.actionContext.update(getReviewInput, review);\n\n if (onReviewSubmission) {\n onReviewSubmission(!!reviewId);\n }\n })\n .catch(() => {\n const productId = product.RecordId;\n context.telemetry.error(`Failed to submit review for product with recordId: ${productId}`);\n context.telemetry.debug(`Failed to submit review for product with recordId: ${productId}`);\n if (onReviewSubmission) {\n onReviewSubmission(false);\n }\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 { OrderBy } from '../actions/inputs/get-product-reviews-input';\n\nexport interface IRnrKeyValuePair {\n key: string;\n value: string;\n}\n\nexport interface IRnrOrderByKeyValuePair {\n key: OrderBy;\n value: string;\n}\n\nexport function setFocusOnElement(id: string): void {\n const element = document.getElementById(id);\n if (element) {\n element.focus();\n }\n}\n\nexport const TOGGLE_REVIEW_MODAL_BUTTON_ID: string = 'reviewproductid';\nexport const TOGGLE_EDIT_MODAL_BUTTON_ID: string = 'ms-write-review__edit';\nexport const TOGGLE_EDIT_MODAL_BUTTON_CARD_ID: string = 'ms-reviews-list__edit';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { format, INodeProps, Progress } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component.\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const { ratingsSummary } = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n if (totalRatingsCount === 0) {\n return [];\n }\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount)\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: (\n <span aria-hidden='true' className='ms-ratings-histogram__star'>\n {stars}\n </span>\n ),\n percentage: (\n <span aria-hidden='true' className='ms-ratings-histogram__percentage'>\n {formattedPercent}\n </span>\n ),\n bar: <Progress value={percentage * 100} max={100} ariaLabel={ariaLabel} className='ms-ratings-histogram__bar' />,\n buttonProps: {\n tag: 'button',\n className: 'ms-ratings-histogram__item',\n onClick: () => {\n props.onClick(stars);\n }\n }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (\n <p className='ms-ratings-histogram__average'>\n {props.summary.averageRating}\n {` `}/ 5\n </p>\n );\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return <p className='ms-ratings-histogram__total'>{props.summary.totalRatingsCount}</p>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps<IRatingsHistogramData> {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component<IRatingsHistogramProps<IRatingsHistogramData>>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent<IRatingsHistogramProps<IRatingsHistogramData>> {\n constructor(props: IRatingsHistogramProps<IRatingsHistogramData>) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary\n ? HistogramItems({\n ratingsSummary,\n resources: { ...resources },\n locale: this.props.context.request.locale,\n onClick: this.selectFilterBy\n })\n : [],\n averageRating: ratingsSummary && (\n <RatingComponent\n avgRating={ratingsSummary.averageRating!}\n ratingCount={ratingCount}\n ariaLabel={format(this.props.resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n readOnly\n context={this.props.context}\n hideCount\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n ),\n averageNumber: ratingsSummary && <AverageRatingNumber summary={ratingsSummary} />,\n totalReviews: ratingsSummary && <TotalReviews summary={ratingsSummary} />,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n <Msdyn365.Text\n className='ms-ratings-histogram__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\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 { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps> = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </Module>\n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps}>\n {props.starLabel}\n {props.bar}\n {props.percentage}\n </Node>\n );\n};\n\nexport default RatingsHistogramView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { ReportReviewConcernInput } from './inputs/report-review-concern-input';\n\nasync function reportReviewConcern(input: ReportReviewConcernInput, ctx: IActionContext): Promise<boolean> {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId},locale= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/concerns/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&locale=${input.locale}`;\n\n const requestBody = {\n concernCategory: input.concernCategory\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest<boolean>(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch(error => {\n ctx.trace('[ReportReviewConcernInput] Failed to report a concern');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[ReportReviewConcernInput] Failed to report a concern');\n return false;\n });\n}\n\nfunction inputIsValid(input: ReportReviewConcernInput): boolean {\n return input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const reportReviewConcernDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/report-review-concern',\n action: <IAction<boolean>>reportReviewConcern\n});\n\nexport default reportReviewConcernDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { createObservableDataAction, IAction, IActionContext, sendRequest } from '@msdyn365-commerce/core';\n\nimport { SubmitHelpfulnessVoteInput } from './inputs/submit-helpfulness-vote-input';\n\nasync function submitHelpfulnessVote(input: SubmitHelpfulnessVoteInput, ctx: IActionContext): Promise<boolean> {\n if (!inputIsValid(input)) {\n throw new Error(\n `[SubmitHelpfulnessVote] Invalid input. ReviewId=${input.reviewId},tenantId=${input.tenantId}, locale= ${input.locale},`\n );\n }\n\n const requestUrl =\n `${input.serviceEndpoint}/v2.0/votes/review/${input.reviewId}` + `?tenantId=${input.tenantId}` + `&locale=${input.locale}`;\n\n const requestBody = {\n isHelpful: !!input.isHelpful\n };\n\n const requestHeader = {\n headers: {\n Authorization: `id_token ${input.authToken}`\n }\n };\n\n return sendRequest<boolean>(requestUrl, 'post', requestBody, requestHeader)\n .then(response => {\n return response.status === 200 || response.status === 201;\n })\n .catch(error => {\n ctx.trace('[SubmitHelpfulnessVote] Failed to vote on a review');\n ctx.telemetry.exception(error);\n ctx.telemetry.debug('[SubmitHelpfulnessVote] Failed to vote on a review');\n return false;\n });\n}\n\nfunction inputIsValid(input: SubmitHelpfulnessVoteInput): boolean {\n return input && input.reviewId.length > 0 && input.tenantId.length > 0 && input.locale.length > 0 && input.authToken.length > 0;\n}\n\nexport const submitHelpfulnessVoteDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/ratings-reviews/submit-helpfulness-vote',\n action: <IAction<boolean>>submitHelpfulnessVote\n});\n\nexport default submitHelpfulnessVoteDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\nexport enum ReviewConcernCategory {\n OffensiveContent = '1',\n ReviewResponse = '7',\n SpamAdvertising = '8',\n Profanity = '9'\n}\n\n/**\n * ReportReviewConcern Input Action.\n */\nexport class ReportReviewConcernInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public concernCategory: string;\n\n public authToken: string;\n\n constructor(reviewId: string, tenantId: string, locale: string, concernCategory: string, authToken: string, serviceEndpoint: string) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.concernCategory = concernCategory;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'ReportReviewConcern';\n\n public getCacheObjectType = () => 'ReportReviewConcern';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ILabeledDropdownOption,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IReviewCountResources {\n pageReviewCountText: string;\n}\n\nexport interface IReviewCountProps {\n resources: IReviewCountResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n}\n\nexport const ReviewCount: React.FC<IReviewCountProps> = (props: IReviewCountProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n\n return (\n <span aria-live='polite' className='sr-only'>\n {format(\n resources.pageReviewCountText,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage),\n reviewsCount\n )}\n </span>\n );\n};\n\nexport interface IPageControlResources {\n previousButtonText: string;\n nextButtonText: string;\n pageReviewAriaLabel: string;\n}\n\nexport interface IPageControlsProps {\n resources: IPageControlResources;\n currentPage: number;\n reviewsCount: number;\n reviewsShownOnEachPage: number;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n telemetryContent?: ITelemetryContent;\n updateReviews(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): Promise<void>;\n}\n\nexport const PageControls: React.FC<IPageControlsProps> = (props: IPageControlsProps) => {\n const { currentPage, resources, reviewsCount, reviewsShownOnEachPage } = props;\n const previousPageClick = React.useCallback(() => {\n return _getPreviousPageData(props);\n }, [props]);\n const nextPageClick = React.useCallback(() => {\n return _getNextPageData(props);\n }, [props]);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Next);\n const nextAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Previous;\n const previousAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n <div className='ms-reviews-list__page-controls'>\n {_hasPreviousPage(currentPage) && (\n <button\n onClick={previousPageClick}\n className='ms-reviews-list__previous'\n aria-label={_paginationAriaLabel(\n resources.pageReviewAriaLabel,\n currentPage,\n reviewsCount,\n reviewsShownOnEachPage,\n false\n )}\n {...previousAttribute}\n >\n {resources.previousButtonText}\n </button>\n )}\n {_hasNextPage(currentPage, reviewsCount, reviewsShownOnEachPage) && (\n <button\n onClick={nextPageClick}\n className='ms-reviews-list__next'\n aria-label={_paginationAriaLabel(\n resources.pageReviewAriaLabel,\n currentPage,\n reviewsCount,\n reviewsShownOnEachPage,\n true\n )}\n {...nextAttribute}\n >\n {resources.nextButtonText}\n </button>\n )}\n </div>\n );\n};\n\nconst _hasPreviousPage = (currentPage: number): boolean => {\n return currentPage > 1;\n};\n\nconst _hasNextPage = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number): boolean => {\n return _getPagesCount(reviewsCount, reviewsShownOnEachPage) > currentPage;\n};\n\nconst _getReviewsShown = (reviewsShownOnEachPage: number) => {\n return Math.min(25, reviewsShownOnEachPage);\n};\n\nconst _getPagesCount = (reviewsCount: number, reviewsShownOnEachPage: number): number => {\n return Math.ceil(reviewsCount / _getReviewsShown(reviewsShownOnEachPage));\n};\n\nconst _paginationAriaLabel = (\n pageReviewAriaLabel: string,\n currentPage: number,\n reviewsCount: number,\n reviewsShownOnEachPage: number,\n isNextPage: boolean,\n page?: number\n): string => {\n const pageModifier = isNextPage ? 1 : -1;\n return format(\n pageReviewAriaLabel,\n _getReviewStartNumber(currentPage, reviewsShownOnEachPage, currentPage + pageModifier),\n _getReviewEndNumber(currentPage, reviewsCount, reviewsShownOnEachPage, currentPage + pageModifier),\n reviewsCount\n );\n};\n\nconst _getReviewStartNumber = (currentPage: number, reviewsShownOnEachPage: number, page?: number): number => {\n return ((page || currentPage) - 1) * _getReviewsShown(reviewsShownOnEachPage) + 1;\n};\n\nconst _getReviewEndNumber = (currentPage: number, reviewsCount: number, reviewsShownOnEachPage: number, page?: number): number => {\n const pageUsed = page || currentPage;\n const pageReviewCount = pageUsed * _getReviewsShown(reviewsShownOnEachPage);\n return pageReviewCount < reviewsCount ? pageReviewCount : reviewsCount;\n};\n\nconst _getPreviousPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewStartNumber(props.currentPage, props.reviewsShownOnEachPage) - 1 - _getReviewsShown(props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage - 1,\n false\n );\n};\n\nconst _getNextPageData = async (props: IPageControlsProps) => {\n await props.updateReviews(\n _getReviewEndNumber(props.currentPage, props.reviewsCount, props.reviewsShownOnEachPage),\n props.selectedSortByOption,\n props.selectedFilterByOption,\n props.currentPage + 1,\n 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 { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n Alert,\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ReviewConcernCategory } from '../../../actions/inputs/report-review-concern-input';\nimport { IRnrKeyValuePair } from '../../../common/rnrInterface';\n\nexport interface IReportReviewModalProps {\n resources: IReportReviewModalResources;\n context: ICoreContext<IGeneric<IAny>>;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n reportedKey: string;\n hasError: boolean;\n telemetryContent?: ITelemetryContent;\n onModalToggle(): void;\n onRadioChange(event: React.ChangeEvent<HTMLInputElement>): void;\n reportReview(): void;\n}\n\nexport interface IReportReviewModalResources {\n reportConcernText: string;\n feedbackThankYouText: string;\n reportModalMessage: string;\n reportSubmittedMessage: string;\n reportSpamText: string;\n offensiveContentText: string;\n profanityContentText: string;\n okReportReviewText: string;\n cancelReportReviewText: string;\n reportReviewButtonText: string;\n errorMessageText: string;\n}\n\nexport interface IReportReviewModalViewProps {\n modal: INodeProps;\n modalHeader: INodeProps;\n modalFooter: INodeProps;\n modalBody: INodeProps;\n header: React.ReactElement;\n headerSubmitted: React.ReactElement;\n cancelButton: React.ReactElement;\n submitButton: React.ReactElement;\n succesfulButton: React.ReactElement;\n reportMessage: React.ReactElement;\n reportSubmittedMessage: React.ReactElement;\n radioButtons: React.ReactElement;\n error: React.ReactElement;\n}\n\nlet reportConcernDropdownOptions: IRnrKeyValuePair[];\n\n/**\n * CartLineItems component.\n */\n\nexport const ReportReviewModal = (props: IReportReviewModalProps): IReportReviewModalViewProps => {\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.SubmitReview);\n const submitReviewAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.SuccessButton;\n const successAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n payLoad.contentAction.etext = TelemetryConstant.Cancel;\n const cancelAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n reportConcernDropdownOptions = [\n { key: ReviewConcernCategory.SpamAdvertising, value: props.resources.reportSpamText },\n { key: ReviewConcernCategory.OffensiveContent, value: props.resources.offensiveContentText },\n { key: ReviewConcernCategory.Profanity, value: props.resources.profanityContentText }\n ];\n\n return {\n modal: {\n tag: Modal,\n className: 'ms-report-review-modal msc-modal-input-required',\n toggle: props.onModalToggle,\n applicationNode: 'renderPage',\n isOpen: props.isOpen,\n returnFocusRef: props.returnRef\n },\n modalHeader: { tag: ModalHeader, toggle: props.onModalToggle, className: 'ms-report-review-modal-header' },\n modalFooter: { tag: ModalFooter, className: 'ms-report-review-modal-footer' },\n modalBody: { tag: ModalBody, className: 'ms-report-review-modal-body' },\n header: <p className='ms-reviews-list__report-header'>{props.resources.reportConcernText}</p>,\n headerSubmitted: <p className='ms-reviews-list__report-header'>{props.resources.feedbackThankYouText}</p>,\n cancelButton: (\n <button className='msc-btn ms-reviews-list__cancel' onClick={props.onModalToggle} {...cancelAttribute}>\n {props.resources.cancelReportReviewText}\n </button>\n ),\n submitButton: (\n <button className='msc-btn ms-reviews-list__submit' onClick={props.reportReview} {...submitReviewAttribute}>\n {' '}\n {props.resources.reportReviewButtonText || 'Report'}\n </button>\n ),\n succesfulButton: (\n <button className='msc-btn ms-reviews-list__success' onClick={props.onModalToggle} {...successAttribute}>\n {props.resources.okReportReviewText}\n </button>\n ),\n reportMessage: <p className='ms-reviews-list__report-message'>{props.resources.reportModalMessage}</p>,\n reportSubmittedMessage: <p className='ms-reviews-list__report-message'>{props.resources.reportSubmittedMessage}</p>,\n radioButtons: radioPairs(props),\n error: (\n <Alert className='ms-reviews-list__report-error' isOpen={props.hasError} color='danger'>\n {props.resources.errorMessageText}\n </Alert>\n )\n };\n};\n\nconst radioPairs = (props: IReportReviewModalProps) => {\n const pairs = [];\n for (const option of reportConcernDropdownOptions) {\n const inputId = `report-review-${option.key}`;\n const checked = option.key === props.reportedKey;\n pairs.push(\n <div className='ms-report-review-modal-pair' key={option.key}>\n <input\n className='msc-radio-input'\n type='radio'\n name='report-error'\n id={inputId}\n data-key={option.key}\n value={option.value}\n checked={checked}\n aria-checked={checked}\n onChange={props.onRadioChange}\n />\n <label className='msc-radio-label' htmlFor={inputId}>\n {option.value}\n </label>\n </div>\n );\n }\n\n return <fieldset>{pairs}</fieldset>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { Button, format, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { TOGGLE_EDIT_MODAL_BUTTON_CARD_ID } from '../../../common/rnrInterface';\n\nexport interface IReviewCardResources {\n wasReviewHelpfulText: string;\n yesButtonText: string;\n noButtonText: string;\n editReviewCardText: string;\n reportedText: string;\n reportConcernText: string;\n reviewRatingNarratorText: string;\n}\n\nexport interface IReviewCardProps {\n review: Review;\n resources: IReviewCardResources;\n context: ICoreContext<IGeneric<IAny>>;\n isUserReview?: boolean;\n parentId: string;\n parentType: string;\n reportedReviews: string[];\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n reportedReviewId: string;\n votedReviews: { reviewId: string; approved: boolean }[];\n toggleWriteReviewModal?(): void;\n toggleReportReviewModal(reviewId: string): void;\n updateReviewHelpfulness(reviewId: string, isHelpful: boolean): void;\n}\n\nexport interface IReviewCardViewProps {\n cardProps: INodeProps;\n name: React.ReactElement;\n rating: React.ReactElement;\n date: React.ReactElement;\n reviewTitle: React.ReactElement;\n reviewText: React.ReactElement;\n ratingHelpfulLabel?: React.ReactElement;\n like?: React.ReactElement;\n dislike?: React.ReactElement;\n edit: React.ReactNode;\n report: React.ReactNode;\n responseName: React.ReactNode;\n responseDate: React.ReactNode;\n responseText: React.ReactNode;\n cardBodyProps: INodeProps;\n responseProps: INodeProps;\n reviewProps: INodeProps;\n controlsProps: INodeProps;\n headerProps: INodeProps;\n}\n\n/**\n * Review card component.\n */\n\nexport const ReviewCard = (props: IReviewCardProps): IReviewCardViewProps => {\n const className = props.isUserReview ? 'ms-reviews-list__card ms-reviews-list__user-review' : 'ms-reviews-list__card';\n return {\n cardProps: { className, key: props.review.reviewId },\n name: <p className='ms-reviews-list__name'>{props.review.userName}</p>,\n rating: rating(props),\n date: <p className='ms-reviews-list__date'>{renderDate(props, props.review.submittedDateTime)}</p>,\n reviewTitle: <h4 className='ms-reviews-list__title'>{props.review.title}</h4>,\n reviewText: <p className='ms-reviews-list__text'>{props.review.reviewText}</p>,\n ratingHelpfulLabel: props.isUserReview ? (\n undefined\n ) : (\n <p className='ms-reviews-list__helpful'>{props.resources.wasReviewHelpfulText}</p>\n ),\n like: props.isUserReview ? undefined : voteHelpfulButton(props, true),\n dislike: props.isUserReview ? undefined : voteHelpfulButton(props, false),\n edit: editButton(props),\n report: reportToggle(props),\n responseName: props.review.userResponse ? (\n <p className='ms-reviews-list__response-name'>{props.review.userResponse.responderName}</p>\n ) : (\n undefined\n ),\n responseText: props.review.userResponse ? (\n <p className='ms-reviews-list__response-text'>{props.review.userResponse.responseText}</p>\n ) : (\n undefined\n ),\n responseDate: props.review.userResponse ? (\n <p className='ms-reviews-list__response-date'>{renderDate(props, props.review.userResponse.submittedDateTime)}</p>\n ) : (\n undefined\n ),\n cardBodyProps: { className: 'ms-reviews-list__card-body' },\n responseProps: { className: 'ms-reviews-list__response' },\n reviewProps: { className: 'ms-reviews-list__review' },\n controlsProps: { className: 'ms-reviews-list__card-controls' },\n headerProps: { className: 'ms-reviews-list__card-header' }\n };\n};\n\nconst rating = (props: IReviewCardProps) => {\n return (\n <RatingComponent\n readOnly\n avgRating={props.review.rating}\n ariaLabel={format(props.resources.reviewRatingNarratorText || '', props.review.rating, '5')}\n context={props.context}\n className='ms-reviews-list__rating'\n id={props.parentId}\n typeName={props.parentType}\n data={{}}\n />\n );\n};\n\nconst isVotedFor = (props: IReviewCardProps, isHelpful: boolean): boolean => {\n for (let i = 0; i < props.votedReviews.length; i++) {\n if (props.votedReviews[i].reviewId === props.review.reviewId) {\n return props.votedReviews[i].approved === isHelpful;\n }\n }\n\n return false;\n};\n\nconst voteHelpfulButton = (props: IReviewCardProps, isHelpful: boolean) => {\n const isVoted = isVotedFor(props, isHelpful);\n const isDisabled = props.isUserReview || isVoted ? 'disabled' : '';\n let className = isHelpful ? 'ms-reviews-list__like' : 'ms-reviews-list__dislike';\n className = `${className} ${isDisabled}`;\n const label = isHelpful ? props.resources.yesButtonText : props.resources.noButtonText;\n let voteCount = (isHelpful ? props.review.helpfulPositive : props.review.helpfulNegative) || 0;\n voteCount = isVoted ? voteCount + 1 : voteCount;\n const title = `(${voteCount})`;\n const user = props.context.request.user;\n const onClickMethod = () => {\n props.updateReviewHelpfulness(props.review.reviewId!, isHelpful);\n };\n const onClick = isDisabled ? undefined : onClickMethod;\n\n if (user.isAuthenticated) {\n return (\n <Button aria-label={label} className={className} title={title} onClick={onClick}>\n {title}\n </Button>\n );\n }\n return (\n <Button href={user.signInUrl} aria-label={label} className={className} title={title} tag='a'>\n {title}\n </Button>\n );\n};\n\nconst editButton = (props: IReviewCardProps) => {\n if (props.isUserReview) {\n return (\n <Button id={TOGGLE_EDIT_MODAL_BUTTON_CARD_ID} className='ms-reviews-list__edit' onClick={props.toggleWriteReviewModal}>\n {props.resources.editReviewCardText}\n </Button>\n );\n }\n\n return undefined;\n};\n\nconst renderDate = (props: IReviewCardProps, date?: Date): string | Date => {\n if (!date) {\n return '';\n }\n\n try {\n return new Intl.DateTimeFormat(props.context.request.locale, { month: 'long', day: 'numeric', year: 'numeric' }).format(\n new Date(date)\n );\n } catch {\n return date;\n }\n};\n\n/**\n * On Click Handler.\n * @param props -Review card props.\n * @returns Report review modal.\n */\nconst onClick = (props: IReviewCardProps) => () => {\n props.toggleReportReviewModal(props.review.reviewId!);\n};\n\nconst reportToggle = (props: IReviewCardProps) => {\n const user = props.context.request.user;\n if (props.isUserReview) {\n return undefined;\n } else if (!user.isAuthenticated) {\n return (\n <Button href={user.signInUrl} className='ms-reviews-list__report' tag='a'>\n {' '}\n {props.resources.reportConcernText}\n </Button>\n );\n }\n\n if (props.reportedReviews.includes(props.review.reviewId!)) {\n return <p className='ms-reviews-list__reported'>{props.resources.reportedText}</p>;\n }\n\n const ref = props.review.reviewId === props.reportedReviewId ? props.returnRef : undefined;\n\n return (\n <Button className='ms-reviews-list__report' onClick={onClick(props)} innerRef={ref}>\n {props.resources.reportConcernText}\n </Button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionInput } from '@msdyn365-commerce/core';\n\n/**\n * SubmitHelpfulnessVote Input Action.\n */\nexport class SubmitHelpfulnessVoteInput implements IActionInput {\n public reviewId: string;\n\n public tenantId: string;\n\n public locale: string;\n\n public serviceEndpoint: string;\n\n public isHelpful: boolean;\n\n public authToken: string;\n\n constructor(reviewId: string, tenantId: string, locale: string, isHelpful: boolean, authToken: string, serviceEndpoint: string) {\n this.reviewId = reviewId;\n this.tenantId = tenantId;\n this.locale = locale;\n this.isHelpful = isHelpful;\n this.authToken = authToken;\n this.serviceEndpoint = serviceEndpoint;\n }\n\n public getCacheKey = () => 'SubmitHelpfulnessVote';\n\n public getCacheObjectType = () => 'SubmitHelpfulnessVote';\n\n public dataCacheType = (): CacheType => 'none';\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n getRnrAuthEndpointId,\n getRnrEndpointId,\n getRnrPartnerId,\n getSelectedProductIdFromActionInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n LabeledDropdown\n} from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { reportReviewConcern, submitHelpfulnessVote } from '../..';\nimport { getReviewsForGivenProduct } from '../../actions/get-product-reviews';\nimport { GetProductReviewsInput } from '../../actions/inputs/get-product-reviews-input';\nimport { ReportReviewConcernInput, ReviewConcernCategory } from '../../actions/inputs/report-review-concern-input';\nimport { SubmitHelpfulnessVoteInput } from '../../actions/inputs/submit-helpfulness-vote-input';\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { IRnrKeyValuePair, IRnrOrderByKeyValuePair } from '../../common/rnrInterface';\nimport { PageControls, ReviewCount } from './components/components';\nimport { IReportReviewModalViewProps, ReportReviewModal } from './components/report-review-modal';\nimport { IReviewCardViewProps, ReviewCard } from './components/review-card';\nimport { IReviewsListData } from './reviews-list.data';\nimport { IReviewsListProps } from './reviews-list.props.autogenerated';\n\nexport interface IReviewsListState {\n skipItems: number;\n listOfReviews: Review[];\n currentPage: number;\n reviewsCount: number;\n showSpinner: boolean;\n isFilterApplied: boolean;\n selectedSortByOption: ILabeledDropdownOption;\n selectedFilterByOption: ILabeledDropdownOption;\n userReviewRating: number;\n userReviewTitle: string;\n userReviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n isReportModalOpen: boolean;\n hasReportError: boolean;\n reportingReviewId: string;\n reportedKey: string;\n reported: boolean;\n reportedReviews: string[];\n votedReviews: { reviewId: string; approved: boolean }[];\n}\n\nexport interface IReviewsListCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): void;\n updateReviewHelpfulnessVote(reviewId: string, isHelpful: boolean): void;\n toggleReportModal(reviewId: string): void;\n reportReview(reviewId: string, reportedKey: string): void;\n updateSortByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateFilterByDropdown(notification: ILabeledDropdownOnChangeNotification): void;\n updateReviews(\n skipItems: number,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ): void;\n}\n\nexport interface IReviewsListViewProps extends IReviewsListProps<IReviewsListData> {\n state: IReviewsListState;\n className: string;\n callbacks: IReviewsListCallbacks;\n moduleProps: IModuleProps;\n reviewModal: IReviewModalViewProps;\n reportReviewModal: IReportReviewModalViewProps;\n sortByDropdown: React.ReactNode;\n filterByDropdown: React.ReactNode;\n averageRating: React.ReactNode;\n reviewCount: React.ReactElement;\n refineReviewsProps: INodeProps;\n reviewsListProps: INodeProps;\n reviewCards: IReviewCardViewProps[];\n userReview?: IReviewCardViewProps;\n pageControls: React.ReactNode;\n noReviewsMessage: React.ReactElement;\n noReviewsWithFilterMessage: React.ReactElement;\n heading: React.ReactNode;\n sortByOptions: IRnrOrderByKeyValuePair[];\n filterByOptions: IRnrOrderByKeyValuePair[];\n}\n\n/**\n *\n * ReviewsList component.\n * @extends {React.Component<IReviewsListProps<IReviewsListData>, IReviewsListState>}\n */\n@observer\nclass ReviewsList extends React.Component<IReviewsListProps<IReviewsListData>, IReviewsListState> {\n public sortByDropdownOptions: IRnrOrderByKeyValuePair[] = [\n { key: 'MostHelpful', value: this.props.resources.mostHelpfulSortOptionText },\n { key: 'MostRecent', value: this.props.resources.mostRecentSortOptionText },\n { key: 'HighestRating', value: this.props.resources.highestRatedSortOptionText },\n { key: 'LowestRating', value: this.props.resources.lowestRatedSortOptionText }\n ];\n\n public filterByDropdownOptions: IRnrKeyValuePair[] = [\n { key: '1;2;3;4;5', value: this.props.resources.allRatinsFilterByOptionText },\n { key: '5', value: this.props.resources.fiveStarFilterByOptionText },\n { key: '4', value: this.props.resources.fourStarFilterByOptionText },\n { key: '3', value: this.props.resources.threeStarFilterByOptionText },\n { key: '2', value: this.props.resources.twoStarFilterByOptionText },\n { key: '1', value: this.props.resources.oneStarFilterByOptionText }\n ];\n\n private readonly _userReviewModalToggle: React.RefObject<HTMLButtonElement>;\n\n private readonly _userReportModalToggle: React.RefObject<HTMLButtonElement>;\n\n private readonly telemetryContent?: ITelemetryContent;\n private readonly reviewsListCallbacks: IReviewsListCallbacks = {\n updateReviewTitle: (title: string): void => {\n this.setState({ userReviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ userReviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ userReviewRating: rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview,\n // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n // @ts-expect-error\n updateReviewHelpfulnessVote: this.updateReviewHelpfulnessVote,\n toggleReportModal: (reviewId: string): void => {\n this.state.isReportModalOpen ? this._onReportModalOpen(reviewId) : this._onReportModalClose();\n },\n // @ts-expect-error\n reportReview: this._reportReviewCallback,\n // @ts-expect-error\n updateFilterByDropdown: this.updateFilterByDropdown,\n // @ts-expect-error\n updateSortByDropdown: this.updateSortByDropdown,\n // @ts-expect-error\n updateReviews: this.updateReviews\n };\n constructor(props: IReviewsListProps<IReviewsListData>) {\n super(props);\n const {\n userReview: { result: userReview }\n } = this.props.data;\n\n this.state = {\n skipItems: 0,\n reviewsCount: 0,\n listOfReviews: [],\n currentPage: 1,\n showSpinner: false,\n isFilterApplied: false,\n selectedSortByOption: this.sortByDropdownOptions[0],\n selectedFilterByOption: this.filterByDropdownOptions[0],\n userReviewRating: userReview ? userReview.rating : 0,\n userReviewText: userReview ? userReview.reviewText : '',\n userReviewTitle: userReview ? userReview.title : '',\n isReviewModalOpen: false,\n hasReviewError: false,\n isReportModalOpen: false,\n hasReportError: false,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising,\n reportingReviewId: '',\n reportedReviews: [],\n votedReviews: []\n };\n\n this._userReviewModalToggle = React.createRef<HTMLButtonElement>();\n this._userReportModalToggle = React.createRef<HTMLButtonElement>();\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public shouldComponentUpdate(nextProps: IReviewsListProps<IReviewsListData>, nextState: IReviewsListState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n public componentDidMount = async () => {\n this.props.data.reviewsList.then(reviewsList => {\n if (\n reviewsList &&\n reviewsList.pagingInfo &&\n reviewsList.pagingInfo.totalItems &&\n reviewsList.items &&\n reviewsList.items.length > 0\n ) {\n this.setState({\n listOfReviews: reviewsList.items,\n reviewsCount: reviewsList.pagingInfo.totalItems\n });\n }\n });\n await this.updateReviews(0, this.state.selectedSortByOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n\n reaction(\n () => this.props.data.ratingsReviewsState.result && this.props.data.ratingsReviewsState.result.filterKey,\n async (filterKey: string | undefined) => {\n const filterKeyValue = Number(filterKey);\n const dropdownItemsCount = this.filterByDropdownOptions.length;\n if (filterKey && !isNaN(filterKeyValue) && filterKeyValue < dropdownItemsCount) {\n const filterByOption = this.filterByDropdownOptions.find((option: IRnrKeyValuePair) => option.key === filterKey);\n if (!filterByOption) {\n this.props.telemetry.warning(`[reviews-list] cannot find filter with key ${filterKey}`);\n } else {\n await this.updateReviews(0, this.state.selectedSortByOption, filterByOption, 1, true);\n const selectedIndex = dropdownItemsCount - filterKeyValue;\n this.setState({\n selectedFilterByOption: this.filterByDropdownOptions[selectedIndex]\n });\n }\n }\n }\n );\n };\n public render(): JSX.Element | null {\n const { className, heading, reviewsShownOnEachPage } = this.props.config;\n const { currentPage, reviewsCount, selectedFilterByOption, selectedSortByOption } = this.state;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const resources = this.props.resources;\n const completeClass = classname('ms-reviews-list', className);\n const viewProps: IReviewsListViewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n callbacks: this.reviewsListCallbacks,\n reviewModal: this._userReviewModal(),\n reportReviewModal: this._reportReviewModal(),\n filterByDropdown: (\n <LabeledDropdown\n labelText={resources.filterByDropdownText}\n dropdownId='reviewsListFilterBy'\n dropdownOptions={this.filterByDropdownOptions}\n selectedOption={selectedFilterByOption}\n onSelectOption={this.updateFilterByDropdown}\n controlledByParent\n />\n ),\n sortByDropdown: (\n <LabeledDropdown\n labelText={resources.sortByDropdownText}\n dropdownId='reviewsListSortBy'\n dropdownOptions={this.sortByDropdownOptions}\n selectedOption={selectedSortByOption}\n onSelectOption={this.updateSortByDropdown}\n />\n ),\n averageRating: ratingsSummary && (\n <RatingComponent\n avgRating={ratingsSummary.averageRating || 0}\n readOnly\n ariaLabel={format(resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n ratingCount={`${ratingsSummary.reviewsCount}`}\n data={{}}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n />\n ),\n reviewCount: (\n <ReviewCount\n resources={{ ...this.props.resources }}\n currentPage={currentPage}\n reviewsCount={reviewsCount}\n reviewsShownOnEachPage={reviewsShownOnEachPage}\n />\n ),\n refineReviewsProps: { className: 'ms-reviews-list__refiners' },\n reviewsListProps: { className: 'ms-reviews-list__reviews' },\n reviewCards: this._reviewCards(this.state.listOfReviews),\n userReview: this._userReview(),\n pageControls: (\n <PageControls\n resources={{ ...this.props.resources }}\n currentPage={currentPage}\n reviewsShownOnEachPage={reviewsShownOnEachPage}\n selectedSortByOption={selectedSortByOption}\n selectedFilterByOption={selectedFilterByOption}\n updateReviews={this.updateReviews}\n reviewsCount={reviewsCount}\n telemetryContent={this.telemetryContent}\n />\n ),\n noReviewsMessage: (\n <span className='ms-reviews-list__empty-message' aria-live='polite'>\n {resources.noReviewsMessage}\n </span>\n ),\n noReviewsWithFilterMessage: (\n <span className='ms-reviews-list__filter-message' aria-live='polite'>\n {resources.noReviewsWithSelectedFilterMessage}\n </span>\n ),\n heading: heading && heading.text && (\n <Msdyn365.Text\n className='ms-reviews-list__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n sortByOptions: this.sortByDropdownOptions,\n filterByOptions: this.filterByDropdownOptions\n } as IReviewsListViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n private readonly _userReview = () => {\n const userReview = this.props.data.userReview.result;\n\n return userReview && this._reviewCard(userReview, true);\n };\n\n private readonly _reviewCards = (reviewList: Review[]) => {\n const userReview = this.props.data.userReview.result;\n const reviewElements: IReviewCardViewProps[] = [];\n\n for (const review of reviewList) {\n if (!review.isTakenDown && review.isPublished && userReview ? review.reviewId !== userReview.reviewId : true) {\n reviewElements.push(this._reviewCard(review, false));\n }\n }\n return reviewElements;\n };\n\n private readonly _reviewCard = (review: Review, userReview: boolean): IReviewCardViewProps => {\n return ReviewCard({\n review,\n resources: { ...this.props.resources },\n context: this.props.context,\n isUserReview: userReview,\n parentId: this.props.id,\n parentType: this.props.typeName,\n reportedReviews: this.state.reportedReviews,\n returnRef: this._userReportModalToggle,\n reportedReviewId: this.state.reportingReviewId,\n toggleWriteReviewModal: this._toggleReviewModal,\n toggleReportReviewModal: this._onReportModalOpen,\n updateReviewHelpfulness: this.updateReviewHelpfulnessVote,\n votedReviews: this.state.votedReviews\n });\n };\n\n private readonly _userReviewModal = (): IReviewModalViewProps => {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.userReviewRating,\n reviewTitle: this.state.userReviewTitle,\n reviewText: this.state.userReviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this._onReviewComplete,\n renderContextId: 'writeReview-list',\n returnRef: this._userReviewModalToggle,\n hasError: this.state.hasReviewError\n });\n };\n\n private readonly _onTitleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n this.reviewsListCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>): void => {\n this.reviewsListCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.reviewsListCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({\n isReviewModalOpen: true,\n userReviewText: userReview!.reviewText,\n userReviewTitle: userReview!.title,\n userReviewRating: userReview!.rating\n });\n }\n };\n\n private readonly _onReviewComplete = (isSuccess: boolean): void => {\n if (isSuccess) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n };\n\n private readonly _reportReviewModal = () => {\n return ReportReviewModal({\n resources: { ...this.props.resources },\n context: this.props.context,\n isOpen: this.state.isReportModalOpen,\n returnRef: this._userReportModalToggle,\n reportedKey: this.state.reportedKey,\n onModalToggle: this._onReportModalClose,\n onRadioChange: this._onRadioChange,\n reportReview: this._reportReview,\n hasError: this.state.hasReportError,\n telemetryContent: this.telemetryContent\n });\n };\n\n private readonly _onReportModalOpen = (reviewId: string) => {\n this.setState({\n isReportModalOpen: true,\n reportingReviewId: reviewId,\n reported: false,\n reportedKey: ReviewConcernCategory.SpamAdvertising\n });\n };\n\n private readonly _onReportModalClose = () => {\n this.setState({ isReportModalOpen: false, hasReportError: false });\n };\n\n private readonly _onRadioChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({ reportedKey: event.currentTarget.getAttribute('data-key') || '' });\n };\n\n private readonly _reportReviewCallback = (reviewId: string, reportedKey: string) => {\n reportReviewConcern(\n new ReportReviewConcernInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n reportedKey,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n )\n .then((_value: boolean) => {\n const reportedReview = this.state.reportedReviews;\n reportedReview.push(reviewId);\n this.setState({ reported: true, reportedReviews: reportedReview, hasReportError: false });\n })\n .catch((error: boolean) => {\n this.setState({ hasReportError: true });\n });\n };\n\n private readonly _reportReview = () => {\n this._reportReviewCallback(this.state.reportingReviewId, this.state.reportedKey);\n };\n\n private readonly updateSortByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, notification.selectedOption, this.state.selectedFilterByOption, 1, this.state.isFilterApplied);\n };\n\n private readonly updateFilterByDropdown = async (notification: ILabeledDropdownOnChangeNotification) => {\n await this.updateReviews(0, this.state.selectedSortByOption, notification.selectedOption, 1, true);\n };\n\n private readonly updateReviews = async (\n skipItems: number | 0,\n selectedSortByOption: ILabeledDropdownOption,\n selectedFilterByOption: ILabeledDropdownOption,\n currentPage: number,\n isFilterApplied: boolean\n ) => {\n const productId = getSelectedProductIdFromActionInput(this.props.context.actionContext);\n if (productId === undefined) {\n return;\n }\n const result = await getReviewsForGivenProduct(\n // Task #211227597 Remove this hardcoded values.\n new GetProductReviewsInput(\n productId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n getRnrEndpointId(this.props.context.actionContext),\n selectedSortByOption.key,\n selectedFilterByOption.key,\n skipItems < 0 ? 0 : skipItems,\n this.props.config.reviewsShownOnEachPage\n ),\n this.props.context.actionContext\n );\n if (result && result.items && result.pagingInfo && result.pagingInfo.totalItems !== undefined) {\n this.setState({\n currentPage,\n listOfReviews: result.items,\n selectedSortByOption,\n selectedFilterByOption,\n reviewsCount: result.pagingInfo.totalItems,\n isFilterApplied\n });\n }\n };\n\n private readonly _updateVoteUi = (reviewId: string, isHelpful: boolean): void => {\n let alreadyExists = false;\n let list = this.state.votedReviews.map(review => {\n if (review.reviewId === reviewId) {\n review.approved = isHelpful;\n alreadyExists = true;\n }\n return review;\n });\n\n if (!alreadyExists) {\n list = list.concat({ reviewId, approved: isHelpful });\n }\n\n this.setState({ votedReviews: list });\n };\n\n private readonly updateReviewHelpfulnessVote = (reviewId: string, isHelpful: boolean): void => {\n submitHelpfulnessVote(\n new SubmitHelpfulnessVoteInput(\n reviewId,\n getRnrPartnerId(this.props.context.actionContext),\n this.props.context.request.locale,\n isHelpful,\n this.getUserToken(this.props.context.request),\n getRnrAuthEndpointId(this.props.context.actionContext)\n ),\n this.props.context.actionContext\n )\n .then(() => {\n this._updateVoteUi(reviewId, isHelpful);\n })\n .catch((error: Error) => {\n throw new Error('[submitHelpfulnessVote]Error executing action');\n });\n };\n\n private readonly getUserToken = (context: Msdyn365.IRequestContext): string => {\n return context && context.user && context.user.token;\n };\n}\n\nexport default ReviewsList;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IReportReviewModalViewProps } from './components/report-review-modal';\nimport { IReviewCardViewProps } from './components/review-card';\nimport { IReviewsListState, IReviewsListViewProps } from './reviews-list';\n\nconst ReviewsListview: React.FC<IReviewsListViewProps> = props => {\n const {\n averageRating,\n filterByDropdown,\n heading,\n moduleProps,\n noReviewsMessage,\n noReviewsWithFilterMessage,\n pageControls,\n refineReviewsProps,\n reportReviewModal,\n reviewsListProps,\n reviewCards,\n reviewCount,\n reviewModal,\n sortByDropdown,\n state,\n userReview\n } = props;\n\n if (!userReview && reviewCards.length === 0 && !state.isFilterApplied) {\n return <Module {...moduleProps}>{noReviewsMessage}</Module>;\n }\n\n return (\n <Module {...moduleProps}>\n {heading}\n {averageRating}\n {reviewCount}\n <Node {...refineReviewsProps}>\n {sortByDropdown}\n {filterByDropdown}\n </Node>\n <Node {...reviewsListProps}>\n {userReview && buildReviewCard(userReview)}\n {reviewCards.map(review => {\n return buildReviewCard(review);\n })}\n </Node>\n {reviewCards.length === 0 && state.isFilterApplied && noReviewsWithFilterMessage}\n {pageControls}\n {createReviewModal(reviewModal, moduleProps)}\n {createReportModal(reportReviewModal, state)}\n </Module>\n );\n};\n\nconst buildReviewCard = (props: IReviewCardViewProps) => {\n return (\n <Node {...props.cardProps}>\n <Node {...props.headerProps}>\n {props.rating}\n {props.name}\n </Node>\n <Node {...props.cardBodyProps}>\n <Node {...props.reviewProps}>\n {props.reviewTitle}\n {props.date}\n {props.reviewText}\n </Node>\n <Node {...props.responseProps}>\n {props.responseName}\n {props.responseDate}\n {props.responseText}\n </Node>\n <Node {...props.controlsProps}>\n {props.ratingHelpfulLabel}\n {props.like}\n {props.dislike}\n {props.edit}\n {props.report}\n </Node>\n </Node>\n </Node>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nconst createReportModal = (props: IReportReviewModalViewProps, state: IReviewsListState): JSX.Element => {\n return (\n <Node {...props.modal}>\n <Node {...props.modalHeader}>{state.reported ? props.headerSubmitted : props.header}</Node>\n <Node {...props.modalBody}>\n {state.reported ? props.reportSubmittedMessage : [props.reportMessage, props.radioButtons, props.error]}\n </Node>\n <Node {...props.modalFooter}>{state.reported ? props.succesfulButton : [props.submitButton, props.cancelButton]}</Node>\n </Node>\n );\n};\n\nexport default ReviewsListview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport const SignInMessage: React.FC<{ text: string }> = (props: { text: string }) => {\n return <p className='ms-write-review__sign-in'>{props.text}</p>;\n};\n\nexport const SignInButton: React.FC<{ text: string; href: string; ariaLabel: string; telemetryContent?: ITelemetryContent }> = (props: {\n text: string;\n href: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n}) => {\n const { text, href, ariaLabel, telemetryContent } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <a href={href} className='ms-write-review__sign-in-btn msc-btn' aria-label={ariaLabel} {...attributes}>\n {text}\n </a>\n );\n};\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, telemetryContent, id } = props;\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.WriteReview);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button id={id} className='ms-write-review__toggle msc-btn' aria-label={ariaLabel} onClick={onClick} ref={innerRef} {...attributes}>\n {text}\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Review } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { IReviewModalViewProps, ReviewModal, submitReview } from '../../common/review-modal';\nimport { TOGGLE_REVIEW_MODAL_BUTTON_ID } from '../../common/rnrInterface';\nimport { ModalToggle, SignInButton, SignInMessage } from './components/components';\nimport { IWriteReviewData } from './write-review.data';\nimport { IWriteReviewProps } from './write-review.props.autogenerated';\n\nexport interface IWriteReviewCallbacks {\n toggleModal(): void;\n updateReviewTitle(title: string): void;\n updateReviewText(text: string): void;\n updateRating(rating: number): void;\n onReviewSubmitted(isSuccessful: boolean): void;\n submitReview(\n product: SimpleProduct,\n title: string,\n text: string,\n rating: number,\n context: Msdyn365.ICoreContext,\n userReview?: Review,\n onReviewSubmission?: (isSuccessful: boolean) => void\n ): void;\n}\n\nexport interface IWriteReviewState {\n rating: number;\n reviewTitle: string;\n reviewText: string;\n isReviewModalOpen: boolean;\n hasReviewError: boolean;\n}\n\nexport interface IWriteReviewViewProps extends IWriteReviewProps<IWriteReviewData> {\n state: IWriteReviewState;\n className: string;\n callbacks: IWriteReviewCallbacks;\n signInMessage: React.ReactNode;\n signInButton: React.ReactNode;\n modalToggle: React.ReactNode;\n reviewModal: IReviewModalViewProps;\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n}\n\n/**\n * This module is enables user's to leave ratings and reviews on a specific product\n * WriteReview module.\n * @extends {React.PureComponent<IWriteReviewProps<IWriteReviewData>>}\n */\nclass WriteReview extends React.PureComponent<IWriteReviewProps<IWriteReviewData>, IWriteReviewState> {\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement> | undefined;\n\n private readonly telemetryContent: ITelemetryContent;\n private readonly writeReviewCallbacks: IWriteReviewCallbacks = {\n // @ts-expect-error\n toggleModal: this._toggleReviewModal,\n updateReviewTitle: (title: string): void => {\n this.setState({ reviewTitle: title });\n },\n updateReviewText: (text: string): void => {\n this.setState({ reviewText: text });\n },\n updateRating: (rating: number): void => {\n this.setState({ rating });\n },\n onReviewSubmitted: (isSuccessful: boolean): void => {\n if (isSuccessful) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else {\n this.setState({ hasReviewError: true });\n }\n },\n submitReview\n };\n public constructor(props: IWriteReviewProps<IWriteReviewData>) {\n super(props);\n const {\n userReview: { result: userReview }\n } = this.props.data;\n this._toggleReviewModal = this._toggleReviewModal.bind(this);\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\n const rating = userReview ? userReview.rating : 0;\n const reviewTitle = userReview ? userReview.title : '';\n const reviewText = userReview ? userReview.reviewText : '';\n\n this.state = {\n isReviewModalOpen: false,\n rating,\n reviewTitle,\n reviewText,\n hasReviewError: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n product: { result: product },\n userReview: { result: userReview }\n } = this.props.data;\n\n const userInfo = this.props.context && this.props.context.request && this.props.context.request.user;\n const completeClass = classnames('ms-write-review', 'msc-modal-input-required', className);\n const viewProps = {\n ...this.props,\n state: this.state,\n className: completeClass,\n moduleProps: {\n moduleProps: this.props,\n className: completeClass,\n id: null\n },\n callbacks: this.writeReviewCallbacks,\n signInMessage: <SignInMessage text={resources.signInMessage} />,\n signInButton: (\n <SignInButton\n text={resources.signInLabel}\n ariaLabel={resources.signInAriaLabel}\n href={userInfo.signInUrl!}\n telemetryContent={this.telemetryContent}\n />\n ),\n modalToggle: product && (\n <ModalToggle\n text={userReview ? resources.editReviewButtonText : resources.reviewButtonLabel}\n ariaLabel={resources.reviewButtonLabel}\n innerRef={this._modalToggleRef}\n onClick={this._toggleReviewModal}\n id={TOGGLE_REVIEW_MODAL_BUTTON_ID}\n telemetryContent={this.telemetryContent}\n />\n ),\n reviewModal: this._buildUserReviewModal(),\n heading: heading && heading.text && (\n <Msdyn365.Text\n className='ms-write-review__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n )\n } as IWriteReviewViewProps;\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n private readonly _onTitleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {\n this.writeReviewCallbacks.updateReviewTitle(event.target.value);\n };\n\n private readonly _onTextChange = (event: React.ChangeEvent<HTMLTextAreaElement>): void => {\n this.writeReviewCallbacks.updateReviewText(event.target.value);\n };\n\n private readonly _onRatingChange = (value: number): void => {\n this.writeReviewCallbacks.updateRating(value);\n };\n\n private readonly _toggleReviewModal = (): void => {\n const userReview = this.props.data.userReview.result;\n if (this.state.isReviewModalOpen) {\n this.setState({ isReviewModalOpen: false, hasReviewError: false });\n } else if (userReview) {\n this.setState({\n isReviewModalOpen: true,\n reviewText: userReview.reviewText,\n reviewTitle: userReview.title,\n rating: userReview.rating\n });\n } else {\n this.setState({\n isReviewModalOpen: true,\n reviewText: '',\n reviewTitle: '',\n rating: 0\n });\n }\n };\n\n /**\n * This method builds the user review modal.\n * @param config The module config.\n */\n private _buildUserReviewModal(): IReviewModalViewProps {\n return ReviewModal({\n userReview: this.props.data.userReview.result,\n product: this.props.data.product.result,\n resources: { ...this.props.resources },\n context: this.props.context,\n parentId: this.props.id,\n parentType: this.props.typeName,\n isOpen: this.state.isReviewModalOpen,\n rating: this.state.rating,\n reviewTitle: this.state.reviewTitle,\n reviewText: this.state.reviewText,\n onModalToggle: this._toggleReviewModal,\n onTitleChange: this._onTitleChange,\n onTextChange: this._onTextChange,\n onRatingChange: this._onRatingChange,\n onReviewComplete: this.writeReviewCallbacks.onReviewSubmitted,\n renderContextId: 'writeReview',\n returnRef: this._modalToggleRef,\n hasError: this.state.hasReviewError,\n telemetryContent: this.telemetryContent\n });\n }\n}\n\nexport default WriteReview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IReviewModalViewProps } from '../../common/review-modal';\nimport { IWriteReviewViewProps } from './write-review';\n\nconst WriteReviewView: React.FC<IWriteReviewViewProps> = props => {\n const { heading, signInMessage, signInButton, modalToggle, reviewModal, moduleProps } = props;\n const isAuthenticated = props.context.request.user.isAuthenticated;\n return (\n <Module {...moduleProps}>\n {heading}\n {!isAuthenticated ? (\n <>\n {signInMessage}\n {signInButton}\n </>\n ) : (\n <>\n {modalToggle}\n {createReviewModal(reviewModal, moduleProps)}\n </>\n )}\n </Module>\n );\n};\n\nconst createReviewModal = (props: IReviewModalViewProps, moduleProps: IModuleProps): JSX.Element => {\n return (\n <Module {...props.modal} {...moduleProps}>\n {props.modalHeader}\n <Node {...props.modalBody}>\n <Node {...props.form}>\n <Node {...props.inputRow}>\n {props.rating}\n {props.ratingLabel}\n </Node>\n <Node {...props.inputRow}>\n {props.titleLabel}\n {props.titleInput}\n </Node>\n <Node {...props.inputRow}>\n {props.textLabel}\n {props.textInput}\n </Node>\n {props.privacyPolicyUrl}\n {props.error}\n </Node>\n </Node>\n <Node {...props.modalFooter}>\n {props.submitButton}\n {props.cancelButton}\n </Node>\n </Module>\n );\n};\n\nexport default WriteReviewView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner),\n value: selectedRefiner\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly<IChoiceSummaryProps>) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.value.LeftValueBoundString} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n id={item.key}\n {...attribute}\n >\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString ||\n item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString}\n <span\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && (\n <a\n href={this.props.urlBuilder({}, true)}\n className='msc-choice-summary__clear-all'\n {...clearAllAttributes}\n onClick={this._onClick}\n >\n {clearAllText}\n </a>\n )}\n </div>\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n if (refinerHierarchy && refinerHierarchy.find) {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(r => r.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {` `}\n {text}\n {` `}\n </h5>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <div className='ms-feature-search-result__item'>\n <a\n href={productUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n {...attribute}\n aria-label={product.Name}\n >\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string,\n fallbackImage?: string,\n context?: IRequestContext\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (\n <a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}{' '}\n </a>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\n );\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButton}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n ))}\n </ul>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return [\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </form>\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\n />\n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n <li\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\n return null;\n }\n\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n <div className={className}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\n {...role}\n aria-label={productRefinerHierarchy.KeyName}\n >\n {listItems}\n </ul>\n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `not-selected-${index}`;\n return (\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (\n <span>\n {` `}\n {separator}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC<ITitle> = ({ text, className }) => (\n <span className={className}>\n {` `}\n {text}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport { format, ProductPrice, ProductRefinerValue, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps<ISearchResultContainerData> {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent<ISearchResultContainerProps<ISearchResultContainerData>>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps<ISearchResultContainerData>,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement>;\n\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public constructor(props: ISearchResultContainerProps<ISearchResultContainerData>, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: []\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise<void> {\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n <FeatureSearchResultItem\n product={searchProduct}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n telemetryContent={this.telemetryContent}\n recommendation={this.props.context.request.query?.recommendation}\n />\n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n <ModalToggle\n text={resources.modalTitle}\n ariaLabel={resources.modalTitle}\n innerRef={this._modalToggleRef}\n onClick={this._toggleModal}\n id='search-result-modal'\n />\n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && <ErrorMessage text={errorText} />,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal({\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = listPageState?.currentPageNumber\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(n => n.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { SocialMedia, SocialMediaComponent } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IModuleProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISocialShareItemConfig, ISocialShareItemProps, socialMedia } from './social-share-item.props.autogenerated';\n\nexport interface ISocialShareItemViewProps extends ISocialShareItemProps<ISocialShareItemConfig> {\n SocialShareItemElement: React.ReactNode | null;\n SocialShareItem: IModuleProps;\n}\n\n/**\n *\n * SocialShareItem component.\n * @extends {React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>>}\n */\nclass SocialShareItem extends React.PureComponent<ISocialShareItemProps<ISocialShareItemConfig>> {\n constructor(props: ISocialShareItemProps<ISocialShareItemConfig>) {\n super(props);\n\n this._getSocialShareItem = this._getSocialShareItem.bind(this);\n }\n\n public render(): JSX.Element | null {\n const viewprops = {\n ...this.props,\n SocialShareItem: {\n moduleProps: this.props,\n className: 'ms-social-share-item'\n },\n SocialShareItemElement: this._getSocialShareItem()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n private _getSocialShareItem(): React.ReactNode | null {\n const src = this.props.config.icon;\n if (MsDyn365.isBrowser) {\n switch (this.props.config.socialMedia) {\n case socialMedia.facebook:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Facebook}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_facebook`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.twitter:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Twitter}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_twitter`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.pinterest:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Pinterest}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_pinterest`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.linkedin:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Linkedin}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_linkedin`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n case socialMedia.mail:\n return (\n <SocialMediaComponent\n socialMedia={SocialMedia.Mail}\n postUrl={document.URL}\n context={this.context}\n id={`${this.props.id}_mail`}\n typeName={this.props.typeName}\n data={{}}\n src={src}\n />\n );\n default:\n return null;\n }\n }\n return null;\n }\n}\n\nexport default SocialShareItem;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { ISocialShareItemViewProps } from './social-share-item';\n\nexport const SocialShareItemView: React.FC<ISocialShareItemViewProps> = props => {\n const { SocialShareItem, SocialShareItemElement } = props;\n\n if (!SocialShareItemElement) {\n props.context.telemetry.error('Social media is not valid, module wont render');\n return null;\n }\n return <Module {...SocialShareItem}>{SocialShareItemElement}</Module>;\n};\n\nexport default SocialShareItemView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAdditionalContentData, ILinksData } from '../video-player.props.autogenerated';\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Component props.\n */\nexport interface IVideoPlayerAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content view props.\n */\nexport interface IVideoPlayerAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n additionalContentItems?: IVideoPlayerAdditionalContentItemViewProps;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Item view props.\n */\nexport interface IVideoPlayerAdditionalContentItemViewProps {\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentItemContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Video Player Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='ms-video-player__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Video Player Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='ms-video-player__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalParagraphChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Video Player Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IVideoPlayerAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'ms-video-player__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.openInNewTab,\n role: 'link'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Video Player additonal content item props.\n * @param props - Video Player Additional content component props.\n * @returns IVideoPlayerAdditionalContentItemViewProps.\n */\nconst getAdditionalContentItems = (\n item: IAdditionalContentData,\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentItemViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentItemContainer: { className: 'ms-video-player__details__additional-content__container' },\n additionalContentItemLinks: { className: 'ms-video-player__details__additional-content__cta' }\n };\n};\n\n/**\n * VideoPlayerAdditionalContent component.\n * @param props - Video Player Additional content component props.\n * @returns Video Player Additional content view props.\n */\nexport const videoPlayerAdditionalContent = (\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n const reactNodes: IVideoPlayerAdditionalContentItemViewProps = getAdditionalContentItems(additionalContent, props);\n return {\n additionalContentNode: { className: 'ms-video-player__details__additional-content' },\n additionalContentItems: reactNodes\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerData, IPlayerOptions, IPlayerResources, IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, videoPlayerAdditionalContent } from './components/additional-content';\nimport { ILinksData, IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IVideoPlayerAdditionalContentViewProps;\n handleText?(): void;\n handleParagraph?(): void;\n handleAdditionalText?(): void;\n handleAdditionalParagraph?(): void;\n handleLink?(): void;\n handleAdditionalLink?(): void;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent<IVideoPlayerProps<IVideoPlayerData>>}\n */\nclass VideoPlayer extends React.PureComponent<IVideoPlayerProps<IVideoPlayerConfig>> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps<IVideoPlayerConfig>) {\n super(props);\n this.isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const options = {\n ...this.props.config,\n isMobileDevice: this.isMobileDevice\n };\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options as IPlayerOptions, metaData: videoMetaData };\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n\n player: (\n <MsDyn365.Video className='' editProps={{ key: this.props.config.video, requestContext: this.props.context.request }}>\n <Player\n playerData={videoPlayerData}\n playerResources={playerResources}\n telemetryContent={this.telemetryContent}\n isEditor={this.props.context.request.params.isEditor}\n />\n </MsDyn365.Video>\n ),\n title: this._getVideoDetailsHeading(),\n text: this._getVideoDetailsParagraph(),\n links: this._getVideoDetailsLinks(),\n detailsContainer: { className: 'ms-video-player__details' },\n detailsContainerCTA: { className: 'ms-video-player__details__cta' },\n additionalContent: videoPlayerAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleText: this.handleTextChange,\n handleParagraph: this.handleParagraphChange,\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleLink: this.handleLinkTextChange,\n handleAdditionalLink: this.handleAdditionalTextChange\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handle paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handle additional text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * Handle additional link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle additional paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * Get video details links.\n * @returns - React node.\n */\n private _getVideoDetailsLinks(): React.ReactNode[] | undefined {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n\n return links?.map((linkData: ILinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'ms-video-player__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n }\n\n private _getVideoDetailsHeading(): React.ReactNode | undefined {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='ms-video-player__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='ms-video-player__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n}\n\nexport default VideoPlayer;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps } from './components/additional-content';\nimport { IVideoPlayerViewProps } from './video-player';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IVideoPlayerAdditionalContentViewProps) => {\n if (additionalContent.additionalContentItems) {\n return (\n <Node {...additionalContent.additionalContentNode}>\n <>\n {additionalContent.additionalContentItems.heading}\n <Node {...additionalContent.additionalContentItems.additionalContentItemContainer}>\n {additionalContent.additionalContentItems.text}\n <Node {...additionalContent.additionalContentItems.additionalContentItemLinks}>\n {additionalContent.additionalContentItems.links}\n </Node>\n </Node>\n </>\n </Node>\n );\n }\n\n return null;\n};\n\nconst VideoPlayerView: React.FC<IVideoPlayerViewProps> = props => {\n return (\n <div id={props.id} className='ms-video-player' {...props.renderModuleAttributes(props)}>\n {props.player}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </div>\n );\n};\n\nexport default VideoPlayerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\n <div key={key} className={className}>\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\n </div>\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 { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getFallbackImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext<IGeneric<IAny>>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps) => {\n const { productUrl, telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n !StringExtensions.isNullOrWhitespace(productUrl) && (\n <a href={productUrl} className='ms-wishlist-items__product-link' {...productAttributes} aria-label={_renderAriaLabel(input)}>\n {productName}\n </a>\n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n <Button\n className='ms-wishlist-items__product-add-button'\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n onClick={addItemAction}\n disabled={!(isServiceItem || isInStock)}\n >\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n </Button>\n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-wishlistitems__product-unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const {\n product,\n productUrl,\n price,\n context,\n imageSettings,\n wishlistState,\n itemKey,\n handlers,\n inventoryInformationLabel,\n enableImageProductLink,\n inventoryLabelClassName\n } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n\n return {\n key: `${RecordId}-item`,\n productImage: PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\n productLink: renderProductLink(input),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\n productStatusMessage: wishlistState &&\n wishlistState.isOpen &&\n wishlistState.productId === RecordId &&\n wishlistState.itemKey === itemKey && (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\n <span>{wishlistState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n};\n\nconst _renderProductImage = (\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className='ms-wishlist-items__product-image'\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-wishlist-items__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\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n <WishlistItemDimension\n key={`${product.RecordId}-dimensions-${index}`}\n className='msc-price ms-wishlist-items__product-dimension'\n dimensionType={type}\n dimensionValue={dimension.DimensionValue.Value}\n />\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 classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className='ms-wishlist-items__message-waiting'>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n getProductUrlSync,\n IProductInventoryInformation,\n QueryResultSettingsProxy\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps<IWishlistItemsData> {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState> {\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: IWishlistItemsProps<IWishlistItemsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({});\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps<IWishlistItemsData>, nextState: IWishlistItemActionMessageState): 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 | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n // StatusMessage: <Waiting className={ waitingClass || 'ms-wishlist-items__message-loading'} />\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addToCartButtonText,\n outOfStockText,\n removeButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount\n } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n\n return WishlistItem(currentProductProps)!;\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n <MsDyn365.Text\n className='ms-wishlist-items__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform\n ?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]\n );\n\n const isOrderQuantityLimitsFeatureEnabled =\n isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n const addProductToCartInput = {\n product,\n quantity: 1,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\n : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart:\n ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity =\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\n .replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(\n product: FullProduct,\n productInventoryCollection: IProductInventoryInformation[] | undefined\n ): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (\n productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\n ) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (\n !wishlists.result ||\n wishlists.result.length === 0 ||\n !wishlists.result[0].CommerceListLines ||\n wishlists.result[0].CommerceListLines.length === 0\n ) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n };\n}\n\nexport default WishlistItems;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior } from '@msdyn365-commerce/components';\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\nimport { ICartIconViewProps, ICartViewProps, IFlyoutCartLineItemViewProps } from '@msdyn365-commerce-modules/cart';\nimport { Button, getPayloadObject, INodeProps, KeyCodes, Modal, Node, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { ICartIconProps as ICartIconExtensionProps } from '../definition-extensions/cart-icon.ext.props.autogenerated';\n\n/**\n * ICartIconViewState: Interface for Cart Icon View State.\n */\ninterface ICartIconViewState {\n isModalOpen: boolean;\n}\n\n/**\n * Render Cart lines.\n * @param cartLines - Flyout cart line view props.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\nconst renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n const cartLineIndex = index;\n return (\n <Node {...props.miniCartItemWrapper} key={cartLineIndex}>\n <Node className={classnames(cartLine.storeLocation ? 'msc-cart-line__set-net-price' : '')}>{cartLine.cartline}</Node>\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\n/**\n * Initiate total price.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\nconst renderTotalPrice = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\n const cart = props.data.cart.result ?? undefined;\n const price = cart && !cart.hasInvoiceLine && (cart.cart.TotalAmount || undefined);\n const totalPrice = price\n ? props.context.cultureFormatter.formatCurrency(price)\n : props.context.cultureFormatter.formatCurrency(props.resources.emptyPrice);\n return (\n <div className='ms-cart-icon__subTotalText'>\n <span className='ms-cart-icon__subTotalPriceText'>\n {props.resources.totalPriceFormatString}\n <span className='ms-cart-icon__subTotalPrice'>{totalPrice}</span>\n </span>\n </div>\n );\n};\n\n/**\n *\n * CartIconView component.\n * @extends {React.PureComponent<ICartIconViewProps>}\n */\nexport class CartIconView extends React.PureComponent<\n ICartViewProps & ICartIconViewProps & ICartIconExtensionProps<{}>,\n ICartIconViewState\n> {\n private isAutoDisplayTriggered: boolean;\n\n private readonly cartIconRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n public constructor(props: ICartViewProps & ICartIconViewState & ICartIconViewProps & ICartIconExtensionProps<{}>) {\n super(props);\n this.isAutoDisplayTriggered = false;\n this.state = {\n isModalOpen: false\n };\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n window.addEventListener('keydown', this._escFunction, false);\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('keydown', this._escFunction, false);\n }\n }\n\n /**\n * Render Cart Item count.\n * @returns JSX Element.\n */\n public render(): JSX.Element | null {\n const cart = this.props.data.cart.result ?? undefined;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n if (shouldShowMiniCart) {\n if (!this.isAutoDisplayTriggered) {\n // First time trigger auto mini cart.\n this.setState({ isModalOpen: true });\n this.isAutoDisplayTriggered = true;\n } else if (!this.state.isModalOpen) {\n // If modal is closed, reset the flag.\n this.isAutoDisplayTriggered = false;\n }\n }\n return (\n <Node {...this.props.miniCartWrapper} {...this.props.renderModuleAttributes(this.props)}>\n <button onClick={this._openModal} className='ms-cart-icon-wrapper msc-btn' ref={this.cartIconRef}>\n {this.props.cartIcon}\n </button>\n <Node {...this._modalContainer()}>\n <Node className='ms-cart-icon__header msc-modal__header'>\n {this.props.flyoutTitle}\n {this._renderCartItemCount(this.props)}\n {this._renderCartCloseIcon()}\n </Node>\n <Node className='ms-cart-icon__body msc-modal__body'>\n {this.props.data.cart.result?.isEmpty ? this.props.slots.emptyCart : null}\n <Node {...this.props.CartlinesWrapper}>{renderCartlines(this.props.cartlines, this.props)}</Node>\n </Node>\n <Node className='ms-cart-icon__footer msc-modal__footer'>\n {this.props.slots.promoContentItem}\n {renderTotalPrice(this.props)}\n <p className='ms-cart-icon__subtotal-message'>{this.props.resources.subTotalMessage}</p>\n {this.props.checkoutAsSignInUserButton}\n {this.props.checkoutAsGuestButton}\n {this.props.data.cart.result?.isEmpty ? null : this.props.goToCartButton}\n <Node className='ms-cart-icon__btn-section'>\n {this.props.data.cart.result?.isEmpty ? (\n <Button\n className='ms-cart-icon__btn-backtoshopping'\n href={getUrlSync('home', this.props.context.actionContext)}\n >\n {this.props.resources.continueShoppingButtonTitle}\n </Button>\n ) : null}\n </Node>\n </Node>\n </Node>\n </Node>\n );\n }\n\n /**\n * Initiate modal container.\n * @returns Inode props.\n */\n private readonly _modalContainer = (): INodeProps => {\n return {\n tag: Modal,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__minicartmodal-container',\n wrapClassName: 'ms-cart-icon__minicartmodal',\n isOpen: this.state.isModalOpen,\n toggle: this.closeModal\n };\n };\n\n /**\n * Initiate open modal.\n */\n private readonly _openModal = (): void => {\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'cart-icon', '');\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'cart-icon');\n this.setState({\n isModalOpen: true\n });\n };\n\n /**\n * Initiate close modal.\n */\n private readonly closeModal = (): void => {\n this.cartIconRef.current?.focus();\n this.setState({\n isModalOpen: false\n });\n };\n\n /**\n * Initiate cart close Icon.\n * @returns JSX Element.\n */\n private readonly _renderCartCloseIcon = (): JSX.Element | null => {\n return <Button className='ms-cart-icon__btn-close' aria-label='Close' onClick={this.closeModal} />;\n };\n\n /**\n * Render Cart Item count.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\n private readonly _renderCartItemCount = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\n const defaultCartItemCount: number = 0;\n\n const cartItemlength = props.data.cart.result ? props.data.cart.result.totalItemsInCart : defaultCartItemCount;\n const cartItemCount = `${cartItemlength} ${props.resources.items}`;\n\n return <Node className='ms-cart-icon__count'>{cartItemCount}</Node>;\n };\n\n /**\n * Handle escape click to close modal.\n * @param event - On press of any key.\n */\n private readonly _escFunction = (event: KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Escape && this.state.isModalOpen) {\n this.closeModal();\n }\n };\n}\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { IHistogramItemViewProps, IRatingsHistogramData, IRatingsHistogramViewProps } from '@msdyn365-commerce-modules/ratings-reviews';\nimport { format, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IRatingsHistogramProps, IRatingsHistogramResources } from '../definition-extensions/ratings-histogram.ext.props.autogenerated';\n\n/**\n * Histogram item.\n * @param props - Histogram Item ViewProps.\n * @returns Histogram Item node.\n */\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps}>\n {props.starLabel}\n {props.bar}\n </Node>\n );\n};\n\n/**\n * Average ratings.\n * @param data - Props data.\n * @param context - Histogram Item ViewProps.\n * @param typeName - Histogram Item ViewProps.\n * @param componentId - Histogram Item ViewProps.\n * @param resources - Module resource strings.\n * @returns Average ratings.\n */\nconst averageRating = (\n data: IRatingsHistogramData,\n context: ICoreContext,\n typeName: string,\n componentId: string,\n resources: IRatingsHistogramResources\n) => {\n const defaultAverageRating: number = 0;\n const reviewsCount = data.ratingsSummary.result?.reviewsCount ?? defaultAverageRating;\n const reviewsCountString = resources.numberOfReviewsString\n ? format(resources.numberOfReviewsString, reviewsCount)\n : `${reviewsCount} reviews`;\n\n return (\n <div className='ms-ratings-histogram__ratings'>\n <div className='ms-ratings-histogram__ratings__heading'>{data.ratingsSummary.result?.averageRating}</div>\n <div>\n <RatingComponent\n context={context}\n id={componentId}\n typeName={typeName}\n avgRating={data.ratingsSummary.result?.averageRating ?? defaultAverageRating}\n readOnly\n ariaLabel={format(resources.averageRatingAriaLabel, data.ratingsSummary.result?.averageRating, '5')}\n data={{}}\n />\n </div>\n <div className='ms-ratings-histogram__ratings__reviews'>{reviewsCountString}</div>\n </div>\n );\n};\n\n/**\n * Histogram view.\n * @param props - Ratings HistogramV iewProps.\n * @returns Histogram view module.\n */\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps & IRatingsHistogramProps<{}>> = props => {\n const { heading, histogramItems, histogramProps, moduleProps, data, resources } = props;\n const context = props.context;\n const typeName = props.typeName;\n const moduleId = props.id;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <div className='ms-ratings-histogram__container'>\n {averageRating(data, context, typeName, moduleId, resources)}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </div>\n </Module>\n );\n};\n\nexport default RatingsHistogramView;\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","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","signInLinkText","signInUrl","signInLinkAriaText","onTelemetryClick","signOutLinkText","signOutUrl","signOutLinkAriaText","innerRef","map","cta","index","contentAction","etext","editableLink","role","additionalProperties","onTextChange","setState","e","keyCode","KeyCodes","computed","renderCustomerName","_renderReactFragment","items","slot","navigate","setNavigate","useState","changeBackground","scrollY","Node","_renderDesktopAccountBlock","Collapse","renderForMobile","accountClassName","Drawer","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","_renderMobileAccountBlock","_renderCollapseMenu","PromoBannerCloseButton","_ref","closeButtonAriaLabel","label","onClose","PromoBannerLinks","links","editableLinks","_mapEditableLinks","linkdata","forEach","push","PromoBannerText","text","onEdit","PromoBanner","animating","isVisible","activeIndex","handleTextChange","bannerMessages","_next","nextIndex","_isLastItem","_goToIndex","_previous","_isFirstItem","_onDismiss","dismissEnabled","interval","hideFlipper","autoplay","closeButtonLabel","onDismiss","handleLinks","handleText","promoBannerProps","PromoBannerTextProps","PromoBannerLinksProps","contentProps","CarouselProps","Carousel","next","previous","onIndicatorsClickHandler","hideIndicator","closeButton","modal","setModal","slides","Module","alt","src","width","height","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","rangeStart","RightValueBoundString","rangeEnd","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","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","filter","choice","parent","hierarchy","RecordId","_getKeyForRefinerValue","clearAllText","classNames","choiceAriaLabel","closeAriaLabel","clearAllAttributes","item","attribute","urlBuilder","choiceFormat","choiceRangeValueFormat","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","warning","replace","_formatPrice","UnitText","LeftValueBoundLocalizedString","amount","currency","trace","cultureFormatter","formatCurrency","Number","selected","textContent","trim","ErrorMessage","FeatureSearchResultItem","product","recommendation","productName","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","apiSettings","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","imageUrl","altText","img","imageProps","fallBackSrc","Image","renderProductPlacementImage","PrimaryImageUrl","Link","ModalToggle","ref","modalNode","autoFocus","applicationNode","returnFocusRef","returnRef","onModalToggle","zIndex","modalHeaderNode","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","getInventoryLabel","ArrayExtensions","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","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","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","productCountAriaLabel","singleProductCountAriaLabel","children","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","_renderRating","productText","productCount","Count","refineMenuItemAriaLabel","format","_getRefinerUrl","tabIndex","_renderSwatch","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","dimensionType","toLocaleLowerCase","hasColor","StringExtensions","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","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","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","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","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","device","Type","_updateViewport","productPrices","pending","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","Text","_this$props$context$a3","_this$props$context$a4","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","_this$props$context$r7","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","Content","NewTitle","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","_getViewport","variant","VariantType","observable","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","_props$context$action","renderRating","ratingId","totalRatings","_totalRatings$toStrin","numberRatings","rating","roundedRating","toFixed","getRatingAriaLabel","ActiveProductComponent","savingsText","imgData","cropFocalRegion","basePrice","adjustedPrice","price","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","renderPrice","Price","description","Description","AverageRating","TotalRatings","assembleNode","_item$links","headingNode","renderHeading","additionalContentHeading","handleAdditionalTextChange","paragraphNode","subtext","renderParagraph","additionalContentParagraphText","linksNode","ctaLink","renderLinks","isOpenInNewTab","handleAdditionalLinkTextChange","additionalContentNode","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","RegExp","exec","rValue","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","fillStyle","body","parentElement","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","buttonText","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","animate","_this$_canvas$current5","_this$_canvas$current6","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","_this$props$imageMapp2","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","_this$_canvas$current7","_this$_canvas$current8","clearRect","drawCircle","_this$_canvas$current9","_this$_canvas$current10","viewPort","doubleMultiplier","strokeStyle","arc","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","_this$_canvas$current11","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","click","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","productSearchResult","shape","join","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","style","shouldRender","_requestContext$gridS","imageData","useMap","name","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","_product$PrimaryImage","areaId","primaryImageUrl","updateClientWidth","viewport","renderImageMapper","_this$props$config$ac","activePoints","configProduct","_product$Name","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","xPosition","yPosition","activePoint","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","type","open","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","baseImageUrl","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$","_area$center","getDefaultImageSettings","productImageSettingsWidth","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","produtCardHight","_area$center$2","_area$center2","xl","keyDown","enterKey","nodeName","escKey","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","linkId","willOpenInNewTab","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","split","decrementOne","_handleOutsideClick","_this$_productCardDiv","contains","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","activePointContainer","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","_this$props$config$ad","activeImageView","top","left","BulkPurchase","_toggleCollapse","hasDimensionsInProps","productDimensions","hasDimensionsInData","container","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","isMobileDevice","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","_this$props$data$orde","_this$props$data$cust","ProductDimensionsMatrix","dimensions","orderTemplates","customerInformation","BulkPurchaseViewComponent","CarouselModule","_handleDismissCarousel","cookies","set","dismissCarousel","closeNow","_onExiting","_onExited","newIndex","carouselContainer","closeAnimation","handleDismissCarousel","handleOnExited","handleOnExiting","retrieveItems","renderModuleAttributes","pause","pauseOnHover","ride","transitionType","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","directionTextNext","keyboard","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","cartState","appliedPromo","addPromoCode","promoCode","status","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_onSubmitHandler","_applyPromotionHandler","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","onSubmit","disabled","_removePromotion","code","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","CartLines","discountAmount","line","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","removePromotionHandler","promoCodTotalDiscount","reduce","coupon","Code","appliedPromoCodeHeadingText","removePromoAriaLabelFormat","removePromoText","isCollapseOpen","promoCodeHeadingText","ProductCollection","handleHeadingChange","validProducts","DimensionSwatchDisplayTypes","initProductState","productCollectionProducts","productCollection","_getProduct","_this$state$productsD","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","ProductContainer","productComponent","_product$MasterProduc","_getSeeAllButton","headingLabel","seeAllLink","seeAllButtonText","shouldDisplaySeeAllButton","recommendationListId","isCarousel","layout","headingComponent","updatedProducts","getProductData","ObjectExtensions","productCollectionViewProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","ProductCollectionContainer","GridComponentProps","seeAllButton","_renderCarousel","_renderProduct","_renderGrid","gridContainer","bannerText","bannerAriaLabel","promoBannerTextProps","promoBannerLinksProps","promoBannerText","carouselProps","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","closeNotificationLabel","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","_generateDrawerButtonInnerMarkup","isCollapseState","drawerButtonTextClass","toggleButtonClassName","headingDrawerClass","descriptionDrawerClass","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","location","glyphClass","QuickOrderGridFormComponent","productTextInput","quantityTextInput","quickOrderGridState","maxChars","maxQuantity","isAddtoListDisabled","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleInputChange","handleAddProductListClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","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","quickOrderGridProductDimensionsSeparator","renderProductPrice","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","Error","getDropdownName","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_quickOrderGridRowCallbacks","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","token","ProductListsDataActions","callerContext","reload","_updateStatusState","quickOrderGridDeleteProductListFailedText","_handleInputChange","productResponse","_cancellabelDebounce","cancel","isQuickOrderGridFormExpanded","_debounce","getScanResult","GetScanResultInput","channelId","results","Product","ProductDimensionFull","exception","_handleQuantityChange","currentValue","inputElement","_quantityInput","HTMLInputElement","setAttribute","_this$state$productRe","ProductDimensionType","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeAmount","productDimensionTypeStyle","hasProductDimensions","dimensionsToUpdate","console","log","productDimensionErrorState","otherError","clearOtherErrorState","dimensionKey","configureErrors","errorState","mappedDimensions","_this$_updateDimensio","DimensionTypeValue","_updateDimensionValue","ExtensionProperties","selectedProduct","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","createProductList","_productTextInput","_quickOrderGridFormClass","_quickOrderGridFormProductContent","_quickOrderGridFormMsgContent","customerInfo","quickOrderGridModuleHeading","quickOrderGridModuleDescription","quickOrderGridAddtogrid","quickOrderGridProductQuantityInputLabel","quickOrderGridProductInputLabel","quickOrderGridProductDimensionTypeColor","quickOrderGridProductDimensionTypeConfiguration","quickOrderGridSelectDimensionFormatString","quickOrderGridProductDimensionTypeSize","quickOrderGridProductDimensionTypeStyle","quickOrderGridProductDimensionTypeAmount","quickOrderGridModulePageHeading","productConfigureResources","selectDimensionFormatString","header","Heading","quickOrderGridProps","isB2bCustomer","IsB2b","actions","drawer","bulkPurchase","_renderBulkPurchase","quickOrderGridForm","quickOrderGridFormProductContent","quickOrderGridFormMsgContent","form","configure","getProductConfigure","_renderListContainer","orderActions","_renderQuickOrderGridActions","quickOrderGridDeleteButtonText","addProductListToBag","QuickOrderGridActionsView","isBulkPurchaseEnabled","bulkPurchaseSlots","containerClass","_renderQuickOrderTable","_initQuickOrderGridProducts","quickOrderGridProduct","tableClassName","renderConfigureDropdown","dropdown","containerProps","labelContainerProps","errors","select","renderConfigure","dropdowns","renderForm","quickOrderForm","quickOrderProductContent","quickOrderMessageContent","QuickOrderDrawer","_toggle","isManuallyToggled","drawerGlyphClass","animateGlyph","drawerOpenGlyph","drawerCloseGlyph","collapseState","QuickOrderFormComponent","quickOrderState","disableAddtoCart","addQuantityPlaceholderText","handleAddToCartClick","addToCartBtn","QuickOrderProduct","cartLine","simpleProduct","QuickOrderDesktopHeaderCellsComponent","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","QuickOrderTableRowProductImageComponent","_props$data$product$P","QuickOrderExtraActionsPopupComponent","QuickOrderDesktopTableRowCellComponent","_cartLine$LineId","quickOrderProductDimensionsSeparator","UnitOfMeasureSymbol","quickOrderInputQuantityAriaLabel","quickOrderDecrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","TotalAmount","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","quickOrderProducts","QuickOrder","waitTime","dimensionUpdateQueue","cssClassNameConfigure","quickOrderCallbacks","inputQuantityText","quantityInput","cancellabelDebounce","isQuickOrderFormExpanded","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_this$props$data$feat2","isOrderQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","isOrderQuantityLimitsFeatureEnabledInSiteSettings","deliveryOptions","getDeliveryOptionsAsync","queryResultSettings","QueryResultSettingsProxy","emailDeliveryModeCode","channel","EmailDeliveryModeCode","defaultDeliveryOption","DeliveryOptions","isOrderQuantityLimitsFeatureEnabled","productAvailableQuantity","_updateAvailablity","addProductToCartInput","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","deliveryMode","addProductToCart","inputProductText","maxQtyLimitReachedMessage","_getMaxQtyMessage","_result$errorDetails","errorDetails","LocalizedMessage","_getConcatenatedMaxQtyMessage","currentQuantity","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","reject","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","quickOrderWrongQuantityErrorMsg","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","quickOrderProps","isB2B","quickOrderList","_initQuickOrderProducts","_cart$cart$CartLines","productInventoryInfo","_cart$result","_cart$result$cart$Car","_cart$result$cart$Car2","maxQuantityForLineItem","maxQuantityForCartLineItem","addedQuantity","_item$ItemId","minInventory","quickOrderMsgContent","createObservableDataAction","action","ctx","tenantId","inputIsValid","requestUrl","serviceEndpoint","sendRequest","userReviewData","headers","Authorization","authorization","response","SubmitUserReviewInput","getCacheKey","getCacheObjectType","dataCacheType","onClickSubmit","ReviewModal","submitButtonAttribute","cancelButtonAttribute","cancelButton","discardReviewButtonText","submitButton","submitDisabled","submitReviewButtonText","ratingsInput","ratingLabel","ratingsLabel","titleInput","titleLabel","textInput","textLabel","privacyPolicyUrl","privacyPolicyLink","autoComplete","inputRow","hasError","errorMessageText","userReview","reviewId","editReviewModalTitle","writeReviewModalTitle","stripWhiteSpacesFromString","reviewText","reviewTitle","selectRatingAriaLabel","initialRating","parentType","onRatingChange","selectRatingLabel","reviewTitleMaxLength","renderContextId","onTitleChange","reviewTitleAriaLabel","htmlFor","reviewTitleLabel","reviewTextMaxLength","rows","reviewAriaLabel","reviewTextLabel","policyTextBlocks","privacyPolicyTextFormat","isSeparatorAtStart","startsWith","isSeparatorAtEnd","endsWith","privacyPolicyAttribute","rel","privacyPolicyTitle","submitReview","onReviewComplete","onReviewSubmission","getRnrPartnerId","userEmail","emailAddress","userName","getRnrAuthEndpointId","submitUserReview","review","submittedDateTime","Date","helpfulPositive","helpfulNegative","firstName","getReviewInput","GetUserReviewInput","TOGGLE_REVIEW_MODAL_BUTTON_ID","TOGGLE_EDIT_MODAL_BUTTON_CARD_ID","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","Intl","NumberFormat","barItemAriaLabel","starLabel","bar","Progress","buttonProps","AverageRatingNumber","summary","averageRating","TotalReviews","RatingsHistogram","selectFilterBy","completeClass","classname","histogramItems","averageRatingAriaLabel","averageNumber","totalReviews","ratingsSummaryProps","histogramProps","filterKey","createRatingsReviewsStateInput","histogramItem","authToken","requestBody","concernCategory","requestHeader","isHelpful","ReviewConcernCategory","ReportReviewConcernInput","ReviewCount","currentPage","reviewsCount","reviewsShownOnEachPage","pageReviewCountText","_getReviewStartNumber","_getReviewEndNumber","PageControls","previousPageClick","_getPreviousPageData","nextPageClick","_getNextPageData","nextAttribute","previousAttribute","_hasPreviousPage","_paginationAriaLabel","pageReviewAriaLabel","previousButtonText","_hasNextPage","nextButtonText","_getPagesCount","_getReviewsShown","ceil","isNextPage","page","pageModifier","pageReviewCount","updateReviews","selectedFilterByOption","reportConcernDropdownOptions","radioPairs","pairs","inputId","checked","reportedKey","onRadioChange","reviewRatingNarratorText","voteHelpfulButton","isVoted","isVotedFor","i","votedReviews","approved","isUserReview","yesButtonText","noButtonText","voteCount","onClickMethod","updateReviewHelpfulness","editButton","toggleWriteReviewModal","editReviewCardText","renderDate","date","DateTimeFormat","month","day","year","_unused","toggleReportReviewModal","reportToggle","reportConcernText","reportedReviews","reportedText","reportedReviewId","SubmitHelpfulnessVoteInput","ReviewsList","mostHelpfulSortOptionText","mostRecentSortOptionText","highestRatedSortOptionText","lowestRatedSortOptionText","filterByDropdownOptions","allRatinsFilterByOptionText","fiveStarFilterByOptionText","fourStarFilterByOptionText","threeStarFilterByOptionText","twoStarFilterByOptionText","oneStarFilterByOptionText","reviewsListCallbacks","updateReviewTitle","userReviewTitle","updateReviewText","userReviewText","updateRating","userReviewRating","onReviewSubmitted","isSuccessful","isReviewModalOpen","hasReviewError","toggleModal","_toggleReviewModal","updateReviewHelpfulnessVote","toggleReportModal","isReportModalOpen","_onReportModalOpen","_onReportModalClose","reportReview","_reportReviewCallback","updateFilterByDropdown","updateSortByDropdown","reviewsList","pagingInfo","listOfReviews","isFilterApplied","ratingsReviewsState","filterKeyValue","dropdownItemsCount","filterByOption","selectedIndex","_userReview","_reviewCard","_reviewCards","reviewList","reviewElements","isTakenDown","isPublished","cardProps","ratingHelpfulLabel","wasReviewHelpfulText","like","dislike","edit","report","responseName","userResponse","responderName","responseText","responseDate","cardBodyProps","responseProps","reviewProps","controlsProps","headerProps","ReviewCard","_userReportModalToggle","reportingReviewId","_userReviewModal","_onTitleChange","_onTextChange","_onRatingChange","_onReviewComplete","_userReviewModalToggle","isSuccess","_reportReviewModal","submitReviewAttribute","successAttribute","cancelAttribute","SpamAdvertising","reportSpamText","OffensiveContent","offensiveContentText","Profanity","profanityContentText","headerSubmitted","feedbackThankYouText","cancelReportReviewText","reportReviewButtonText","succesfulButton","okReportReviewText","reportMessage","reportModalMessage","reportSubmittedMessage","radioButtons","ReportReviewModal","_onRadioChange","_reportReview","hasReportError","reported","reportReviewConcern","getUserToken","_value","reportedReview","skipItems","getSelectedProductIdFromActionInput","getReviewsForGivenProduct","GetProductReviewsInput","getRnrEndpointId","_updateVoteUi","alreadyExists","concat","submitHelpfulnessVote","showSpinner","reviewModal","reportReviewModal","filterByDropdown","filterByDropdownText","controlledByParent","sortByDropdown","sortByDropdownText","reviewCount","refineReviewsProps","reviewsListProps","reviewCards","pageControls","noReviewsMessage","noReviewsWithFilterMessage","noReviewsWithSelectedFilterMessage","filterByOptions","buildReviewCard","createReviewModal","createReportModal","SignInMessage","SignInButton","WriteReview","writeReviewCallbacks","userInfo","signInMessage","signInButton","signInLabel","signInAriaLabel","editReviewButtonText","reviewButtonLabel","_buildUserReviewModal","refinerValues","filterValue","r","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasContentSwatch","_props$context$reques","_props$context$reques2","isListPageStateUpdated","_updateListPageState","_this$props$config$it","_this$props$config$it2","inventoryAwareSortableAttributeId","_this$props$data$refi","n","_this$props$slots","_this$props$slots$qui","_this$props$data$prod4","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","_this$props$data$list6","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$config","newListPageState","recordId","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","SocialShareItem","_getSocialShareItem","viewprops","SocialShareItemElement","icon","socialMedia","SocialMediaComponent","SocialMedia","postUrl","URL","SocialShareItemView","getAdditionalContentItems","additionalContentItemContainer","videoPlayerAdditionalContent","additionalContentItems","VideoPlayer","options","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","_video$_links","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","isEditor","params","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainerCTA","handleParagraph","handleLink","handleAdditionalLink","WishlistItemDimension","WishListItemActions","onAddToCart","_renderAriaLabel","formattedPrice","CurrencyCode","productDimension","renderProductLink","productAttributes","renderInventoryInformationLabel","inventoryInformationLabel","inventoryLabelClassName","inventoryCssName","WishlistItemAddToCartButtonComponent","isInStock","isServiceItem","ItemTypeValue","ReleasedProductType","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","unitOfMeasure","unitOfMeasureDisplayType","_renderProductImage","_renderPrice","_renderProductDimensions","WishlistItemsStatusMessage","errorType","WishlistItems","_renderHeading","productAvailability","addedToCartSuccessMessage","addedToCartFailureMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","_await$cart$cart","_await$cart$cart$Cart","_await$cart$cart$Cart2","curQuantity","_getInventoryValueMessage","_result$errorDetails2","_removeItemFromWishlist","wishlists","userToken","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","commerceList","castCommerceList","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","_isProductInStock","productResult","IsProductAvailable","CommerceListLines","foundWishlistItem","commerceListLine","emptyWishlistText","wishlistErrorGettingWishlist","errorProps","statusMessage","emptyViewProps","Products","ProductDimensions","_renderProductList","addToCartButtonText","removeButtonText","enableImageProductLink","wishlistState","productImage","productLink","productPrice","productUnitOfMeasure","entireProductLink","productAriaLabel","addToCartButton","inventoryInformation","removeButton","productStatusMessage","WishlistItem","getProductUrlSync","maxQuantityLimitText","productInventoryCollection","_renderItem","CartIconView","cartIconRef","_modalContainer","hideArrow","isModalOpen","closeModal","_openModal","_this$cartIconRef$cur","_renderCartCloseIcon","_renderCartItemCount","cartItemCount","totalItemsInCart","_escFunction","isAutoDisplayTriggered","_this$props$data$cart","_this$props$data$cart2","_this$props$data$cart3","_this$props$data$cart4","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","miniCartWrapper","flyoutTitle","isEmpty","emptyCart","CartlinesWrapper","cartLines","cartlines","cartLineIndex","miniCartItemWrapper","storeLocation","cartline","remove","promoContentItem","_props$data$cart$resu","hasInvoiceLine","totalPrice","emptyPrice","totalPriceFormatString","renderTotalPrice","subTotalMessage","checkoutAsSignInUserButton","checkoutAsGuestButton","goToCartButton","continueShoppingButtonTitle","renderCartlines","componentId","_data$ratingsSummary$","_data$ratingsSummary$2","_data$ratingsSummary$3","_data$ratingsSummary$4","_data$ratingsSummary$5","_data$ratingsSummary$6","reviewsCountString","numberOfReviewsString"],"sourceRoot":""}