{"version":3,"file":"static/js/8.3bba87b2864469e242d1.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/dyn-header/components/dyn-header-preferred-store.tsx?bfb8","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-header/components/logo.tsx?bd90","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-header/components/nav-icon.tsx?7e4f","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-header/dyn-header.tsx?f215","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-header/dyn-header.view.tsx?3864","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-product-collection/dyn-product-collection.props.autogenerated.ts?0fed","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-product-collection/dyn-product-collection.tsx?0c96","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-product-collection/dyn-product-collection.view.tsx?2e04","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/choice-summary.tsx?9f2c","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/error-message.tsx?54ee","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/feature-search-result-item.tsx?f682","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/link.tsx?6d2f","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/modal.tsx?4323","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/product-search-result-items.tsx?e74d","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/separator.tsx?9de4","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/title.tsx?74cb","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/price.component.tsx?0b0c","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/product.component.tsx?9251","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/range-refine-item.tsx?8177","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/refine-item.tsx?d763","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/refine-submenu.tsx?ed1f","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/utilities.ts?cac3","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/dyn-search-result-container.props.autogenerated.ts?f855","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/dyn-search-result-container.tsx?4f67","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/dyn-search-result-container.view.tsx?16d8","webpack://Msdyn365.Commerce.Online/./src/modules/quotation/components/add-order-template-to-cart.component.tsx?9a91","webpack://Msdyn365.Commerce.Online/./src/themes/dyn-tebutheme/views/components/product.component.tsx?781a","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/header/components/header-preferred-store.tsx?ee9c","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/logo.tsx?f27e","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/nav-icon.tsx?2475","webpack://Msdyn365.Commerce.Online/./src/modules/header/header.tsx?e91a","webpack://Msdyn365.Commerce.Online/./src/modules/header/header.view.tsx?cf0f","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/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/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/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/range-refine-item-input.tsx?09aa","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"],"sourcesContent":["/*--------------------------------------------------------------\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\n/* eslint-disable no-duplicate-imports */\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IDynHeaderData } from '../dyn-header.data';\r\nimport { IDynHeaderProps } from '../dyn-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 private readonly modalCloseButtonRef: React.RefObject = React.createRef();\r\n\r\n /**\r\n * Handle click on the store selector.\r\n * @returns : Promise void.\r\n */\r\n public handleClick = () => {\r\n return this._findPreferredStoreOnClick(this.props);\r\n };\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n slots,\r\n resources\r\n } = this.props;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\r\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\r\n const storeName =\r\n storeSelectorStateManager?.preferredStore && storeSelectorStateManager.preferredStore.StoreName\r\n ? storeSelectorStateManager.preferredStore.StoreName\r\n : resources.headerPreferredStoreText;\r\n\r\n return (\r\n
\r\n \r\n {storeName}\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 _findPreferredStoreOnClick(props: IDynHeaderProps): Promise {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n modules\r\n } = props;\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n await storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorId,\r\n showMapViewLink: true,\r\n parentElementRef: this.modalCloseButtonRef,\r\n onLocationSelected: orgUnitLocation => {\r\n return Promise.resolve();\r\n }\r\n })\r\n .catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to set preferred store');\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default HeaderPreferredStore;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n typeName?: string;\r\n}\r\n\r\nexport interface ILinkData {\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n linkText?: string;\r\n}\r\n\r\n/**\r\n *\r\n * Logo component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class Logo extends React.PureComponent {\r\n private readonly 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\r\n public render(): JSX.Element {\r\n return
{this._renderLogo(this.props)}
;\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 this._renderImage(config);\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default Logo;\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\n/* eslint-disable no-duplicate-imports */\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IDynHeaderResources } from '../dyn-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: IDynHeaderResources;\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.PureComponent {\r\n private readonly 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","/*--------------------------------------------------------------\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\n/* eslint-disable no-duplicate-imports */\r\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n KeyCodes,\r\n Modal,\r\n ModalBody,\r\n ModalHeader,\r\n onTelemetryClick,\r\n Popover,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { IDynHeaderData } from './dyn-header.data';\r\nimport { IDynHeaderProps, IDynHeaderResources, IMyAccountLinksData } from './dyn-header.props.autogenerated';\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n hasSigninerror?: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends IDynHeaderProps, 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 catalogSearch: 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\n@observer\r\nclass Header extends React.PureComponent, IHeaderState> {\r\n private readonly popOverRef: React.RefObject;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private cart: ICartState | undefined;\r\n\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 public constructor(props: IDynHeaderProps) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false,\r\n hasSigninerror: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n reaction(\r\n () => this.props.data.cart.result,\r\n () => {\r\n this.cart = this.props.data.cart.result;\r\n }\r\n );\r\n\r\n const {\r\n context: {\r\n request: { user }\r\n },\r\n resources: { signUpCustomerNotFoundTitle, signUpMultipleCustomerFoundTitle, closeNotificationLabel }\r\n } = this.props;\r\n\r\n const signinNotificationError = this._getSigninNotification(user, signUpMultipleCustomerFoundTitle, signUpCustomerNotFoundTitle);\r\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\r\n // For signup show simple error notification.\r\n NotificationsManager.instance().addNotification(new ErrorNotification(signinNotificationError, closeNotificationLabel));\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation, wishlists },\r\n context: {\r\n request: { user }\r\n },\r\n context,\r\n resources: { cartLabel, cartQtyLabel }\r\n } = this.props;\r\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\r\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\r\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\r\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('menuBar');\r\n const searchSlot = this._getSlot('search');\r\n const catalogSearchSlot = this._getSlot('catalogSearch');\r\n let wishlistCount = 0;\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n if (wishlists !== undefined) {\r\n if (\r\n !wishlists.result ||\r\n !ArrayExtensions.hasElements(wishlists.result) ||\r\n !wishlists.result[0].CommerceListLines ||\r\n !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)\r\n ) {\r\n wishlistCount = 0;\r\n } else {\r\n wishlistCount = wishlists.result[0].CommerceListLines.length;\r\n }\r\n }\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as IDynHeaderProps),\r\n ...this.state,\r\n logo: (\r\n \r\n ),\r\n wishListIconDesktop: (\r\n \r\n ),\r\n wishListIconMobile: (\r\n \r\n ),\r\n cartIcon: ArrayExtensions.hasElements(cartIconSlot) ? (\r\n cartIconSlot[0]\r\n ) : (\r\n \r\n ),\r\n navIcon: (\r\n \r\n ),\r\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\r\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\r\n catalogSearch: ArrayExtensions.hasElements(catalogSearchSlot) ? catalogSearchSlot : [],\r\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\r\n className: headerClassName,\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ms-header__topbar')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: 'ms-header__modal',\r\n toggle: this._toggleNavbar\r\n },\r\n MobileMenuHeader: ,\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:\r\n customer && this.displayName\r\n ? {\r\n tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover\r\n }\r\n : undefined,\r\n signInLink: this._getSigninButton(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: ArrayExtensions.hasElements(preferredStoreSlot) && \r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Handle link text change.\r\n * @param linkIndex - Link Index.\r\n * @returns : Void.\r\n */\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\r\n if (this.props.config.myAccountLinks?.[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\r\n }\r\n };\r\n\r\n /**\r\n * Get the slot.\r\n * @param slotName - Name of the slot.\r\n * @returns The slot.\r\n */\r\n private _getSlot(slotName: string): React.ReactNode[] | null {\r\n const { slots } = this.props;\r\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\r\n }\r\n\r\n /**\r\n * Renders the sign in button.\r\n * @param customer - Customer object.\r\n * @param user - Request context user.\r\n * @param resources - Resources.\r\n * @returns React Node.\r\n */\r\n private _getSigninButton(\r\n customer: Customer | undefined,\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n resources: IDynHeaderResources\r\n ): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n !customer && (\r\n \r\n \r\n {resources.signInLinkText}\r\n \r\n \r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Renders the sign out button.\r\n * @param customer - Customer object.\r\n * @param user - Request context user.\r\n * @param resources - Resources.\r\n * @returns React Node.\r\n */\r\n private _getSignOutButton(\r\n customer: Customer | undefined,\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n resources: IDynHeaderResources\r\n ): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return (\r\n customer &&\r\n this.displayName && (\r\n \r\n \r\n {resources.signOutLinkText}\r\n \r\n \r\n )\r\n );\r\n }\r\n\r\n private _getSigninNotification(\r\n user: MsDyn365.IRequestContextUser | undefined,\r\n signUpMultipleCustomerFoundTitle: string,\r\n signUpCustomerNotFoundTitle: string\r\n ): string | undefined {\r\n const { signUpCustomerNotFound, signUpMultipleCustomerFound } = this.props.config;\r\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\r\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\r\n\r\n if (user?.retailServerErrorCode === notFoundError) {\r\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\r\n } else if (user?.retailServerErrorCode === multipleAccountError) {\r\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\r\n }\r\n return undefined;\r\n }\r\n\r\n private _getAccountInfoDropdownButton(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 (\r\n customer &&\r\n this.displayName && (\r\n \r\n {this.displayName}\r\n \r\n )\r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if (!customer || !this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'link',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n \r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(event: KeyboardEvent): void {\r\n if (event.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n }\r\n }\r\n}\r\n\r\nexport default Header;\r\n","// /*--------------------------------------------------------------\r\n// * Copyright (c) Microsoft Corporation. All rights reserved.\r\n// * See License.txt in the project root for license information.\r\n// *--------------------------------------------------------------*/\r\n\r\n// /* eslint-disable no-duplicate-imports */\r\n// import { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\n// import * as React from 'react';\r\n\r\n// import { IHeaderViewProps } from './dyn-header';\r\n\r\n// const headerView: React.FC = props => {\r\n// const {\r\n// HeaderTag,\r\n// HeaderContainer,\r\n// HeaderTopBarContainer,\r\n// MobileMenuContainer,\r\n// MobileMenuBodyContainer,\r\n// MobileMenuLinksContainer,\r\n// Divider\r\n// } = props;\r\n// return (\r\n// \r\n// \r\n// \r\n// {props.navIcon}\r\n// {props.logo}\r\n// {_renderReactFragment(props.catalogSearch)}\r\n// {_renderReactFragment(props.search)}\r\n// {props.preferredStore}\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// {props.MobileMenuHeader}\r\n// {_renderReactFragment(props.menuBar)}\r\n// \r\n// {props.accountLinks ? props.accountLinks.map(link => link) : false}\r\n// {props.siteOptions}\r\n// {props.wishListIconMobile}\r\n// {props.signInLink}\r\n// {props.signOutLink}\r\n// \r\n// \r\n// \r\n// {_renderReactFragment(props.menuBar)}\r\n// \r\n// \r\n// );\r\n// };\r\n\r\n// function _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 {signInLink};\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\n// function _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n// return (\r\n// <>\r\n// {items && items.length > 0\r\n// ? items.map((slot: React.ReactNode, index: number) => {\r\n// return {slot};\r\n// })\r\n// : null}\r\n// \r\n// );\r\n// }\r\n\r\n// export default headerView;\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\n/* eslint-disable no-duplicate-imports */\r\nimport { AsyncResult } from '@msdyn365-commerce/core';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport { IHeaderViewProps } from './dyn-header';\r\nimport { Collapse, Drawer, Module, Node, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nconst headerView: React.FC = props => {\r\n const { HeaderTag, HeaderContainer, HeaderTopBarContainer, Divider, context, config } = props;\r\n const TopHeaderContainer: INodeProps = {\r\n className: classnames('header__top', 'row', 'justify-content-between', 'align-items-center')\r\n };\r\n //const contactURL = `${context.request.url.requestUrl.protocol}//${context.request.url.requestUrl.host}${context.request.sitePath??''}/contact`;\r\n const contactURL = `${context.actionContext.requestContext.sitePath ?? ''}/contact`;\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n
\r\n Customer Service: {config.customerServicePhone ?? ''}\r\n
\r\n \r\n \r\n Contact us\r\n \r\n
\r\n
\r\n
{props.preferredStore}
\r\n
{_renderReactFragment(props.siteOptions)}
\r\n
{_renderAccountBlock(props, false)}
\r\n
{props.wishListIconDesktop}
\r\n
\r\n \r\n
\r\n
\r\n \r\n {props.cartIcon}\r\n
\r\n
\r\n
\r\n \r\n {props.logo}\r\n
\r\n {_renderReactFragment(props.catalogSearch)}\r\n {_renderReactFragment(props.search)}\r\n
\r\n
\r\n {props.wishListIconDesktop}\r\n {props.cartIcon}\r\n
\r\n {props.navIcon}\r\n
\r\n {_renderCollapseMenu(props)}\r\n {_renderReactFragment(props.menuBar)}\r\n
\r\n
\r\n );\r\n};\r\n\r\nfunction _renderCollapseMenu(props: IHeaderViewProps): JSX.Element | null {\r\n const { Divider, MobileMenuLinksContainer, mobileMenuCollapsed, context } = props;\r\n const contactURL = `${context.actionContext.requestContext.sitePath ?? ''}/contact`;\r\n return (\r\n \r\n \r\n {_renderReactFragment(props.catalogSearch)}\r\n {_renderReactFragment(props.search)}\r\n {_renderMobileAccountBlock(props, true)}\r\n {props.wishListIconMobile}\r\n \r\n \r\n Contact us\r\n \r\n {props.siteOptions}\r\n \r\n \r\n {_renderReactFragment(props.menuBar)}\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 <>{customer ? customer.FirstName || customer.Name : ''};\r\n};\r\n\r\nfunction _renderMobileAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): JSX.Element | null {\r\n const { AccountInfoDropdownParentContainer, signOutLink, signInLink, data, accountLinks } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames(\r\n 'ms-header__drawer',\r\n AccountInfoDropdownParentContainer.className,\r\n renderForMobile ? 'account-mobile' : 'account-desktop'\r\n );\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 _renderAccountBlock(props: IHeaderViewProps, renderForMobile: boolean): 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 const accountClassName = classnames(\r\n AccountInfoDropdownParentContainer.className,\r\n renderForMobile ? 'account-mobile' : 'account-desktop'\r\n );\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\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\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n <>\r\n {items && items.length > 0\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return {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\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDynProductCollection 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 layout {\r\n list = 'list',\r\n carousel = 'carousel',\r\n grid = 'grid'\r\n}\r\n\r\nexport interface IDynProductCollectionConfig extends Msdyn365.IModuleConfig {\r\n productCollection: Msdyn365.IProductList;\r\n heading?: IHeadingData;\r\n layout?: layout;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n clientRender?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n shouldDisplaySeeAllButton?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport interface IDynProductCollectionResources {\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingCountAriaLabel: string;\r\n ratingCountAriaLabelSingleUser: string;\r\n seeAllButtonText: string;\r\n}\r\n\r\nexport const enum HeadingTag {\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 IHeadingData {\r\n text: string;\r\n tag?: HeadingTag;\r\n}\r\n\r\nexport interface IDynProductCollectionProps extends Msdyn365.IModule {\r\n resources: IDynProductCollectionResources;\r\n config: IDynProductCollectionConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { TebuProductComponent } from '../dyn-search-result-container/components'; // DYN : product component for list display\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n DimensionSwatchDisplayTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n ObjectExtensions,\r\n PriceForProductSearchResultInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getTelemetryObject,\r\n IComponentNodeProps,\r\n IModuleProps,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n ITelemetryContent,\r\n NodeTag,\r\n SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IDynProductCollectionData } from './dyn-product-collection.data';\r\nimport { IDynProductCollectionProps, layout } from './dyn-product-collection.props.autogenerated';\r\n\r\nexport interface IProductCollectionViewProps extends IDynProductCollectionProps {\r\n heading?: React.ReactNode;\r\n ProductCollectionContainer: IModuleProps;\r\n ListComponentProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n GridComponentProps: INodeProps;\r\n products: IProductComponentViewProps[];\r\n isCarousel: boolean;\r\n isList: boolean;\r\n productPrices?: ProductPrice[];\r\n seeAllButton?: React.ReactNode;\r\n}\r\n\r\nexport interface IProductComponentViewProps {\r\n ProductContainer: INodeProps;\r\n productComponent: React.ReactNode;\r\n}\r\nexport interface IProductComponentState {\r\n products: ProductSearchResult[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * ProductCollection component.\r\n */\r\nclass ProductCollection extends React.PureComponent, IProductComponentState> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n constructor(props: IDynProductCollectionProps) {\r\n super(props);\r\n this.productPrices = [];\r\n this.state = {\r\n products: this.props.config.productCollection.products || []\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\r\n await this._getActivePrice();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { heading, className, shouldDisplaySeeAllButton } = this.props.config;\r\n const { resources } = this.props;\r\n const recommendation = this.props.config.productCollection.recommendationListId;\r\n\r\n // Initialize state in case if the products were not found during initial module render\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\r\n this.initProductState(this.props.config.productCollection);\r\n\r\n const products = this.state.products;\r\n const isList = this.props.config.layout === layout.list;\r\n const isCarousel = this.props.config.layout === layout.carousel;\r\n const headingLabel = heading ? heading.text : '';\r\n const headingComponent = heading && (\r\n \r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\r\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\r\n const getProductData = this._getProduct(item, index, isList);\r\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\r\n });\r\n\r\n const productCollectionViewProps = {\r\n ...this.props,\r\n heading: headingComponent,\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: '',\r\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\r\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\r\n parentId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n } as IComponentNodeProps,\r\n ProductCollectionContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-product-collection', className)\r\n },\r\n GridComponentProps: {\r\n tag: 'ul' as NodeTag,\r\n className: 'ms-product-collection__items'\r\n },\r\n ListComponentProps: {\r\n tag: 'ul' as NodeTag,\r\n className: 'ms-product-collection-list__items'\r\n },\r\n isCarousel,\r\n isList,\r\n\r\n products:\r\n ArrayExtensions.hasElements(updatedProducts) &&\r\n updatedProducts.filter(item => {\r\n return item !== undefined;\r\n }),\r\n productPrices: this.productPrices,\r\n seeAllButton:\r\n recommendation && shouldDisplaySeeAllButton && ArrayExtensions.hasElements(updatedProducts)\r\n ? this._getSeeAllButton(recommendation, headingLabel)\r\n : undefined\r\n };\r\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\r\n }\r\n\r\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @param products - Products.\r\n * @returns Promise.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise => {\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 const validProducts = ArrayExtensions.validValues(products);\r\n if (\r\n ArrayExtensions.hasElements(validProducts) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\r\n ) {\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(\r\n validProducts,\r\n this.props.context as ICoreContext,\r\n DimensionSwatchDisplayTypes.productCard\r\n ),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Helper method to initialize products state.\r\n * @param productCollection - List of products.\r\n */\r\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\r\n let products = this.state.products;\r\n const productCollectionProducts = productCollection.products;\r\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\r\n products = productCollectionProducts;\r\n this.setState({ products });\r\n } else if (\r\n ArrayExtensions.hasElements(products) &&\r\n ArrayExtensions.hasElements(productCollectionProducts) &&\r\n !ArrayExtensions.equals(products, productCollectionProducts)\r\n ) {\r\n products = productCollectionProducts;\r\n this.setState({ products });\r\n } else if (productCollectionProducts === undefined && ArrayExtensions.hasElements(this.state.products)) {\r\n products = [];\r\n this.setState({ products: products });\r\n }\r\n\r\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\r\n await this._getProductsDimensionsAvailabilities(products);\r\n }\r\n };\r\n\r\n // DYN :\r\n private checkHidePrice(product: ProductSearchResult): boolean {\r\n if (!ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return false;\r\n }\r\n const erpMarketStatusAttribute = product.AttributeValues.find(attribute => attribute.Name === 'ERP_MarketStatus');\r\n if (erpMarketStatusAttribute && erpMarketStatusAttribute.TextValue === 'Hide price') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private readonly _getProduct = (product: ProductSearchResult, index: number, isList: boolean): IProductComponentViewProps | null => {\r\n if (!product || !product.Name) {\r\n this.props.telemetry.trace('[product-collection] Product or product name is null');\r\n return null;\r\n }\r\n const telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const resources = this.props.resources;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const quickviewSlot =\r\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\r\n const productComparisonButtonSlot = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\r\n ? this.props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n const reviewCount = 1;\r\n const reviewTotalRatings = Number(product.TotalRatings);\r\n const reviewCountAriaLabelValue =\r\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\r\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return {\r\n ProductContainer: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-product-collection__item',\r\n role: 'listitem',\r\n key: index\r\n },\r\n productComponent: isList ? ( // DYN : added TebuProductComponent for list display\r\n \r\n ) : (\r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\r\n )}\r\n />\r\n )\r\n };\r\n };\r\n\r\n /**\r\n * Get the active price for products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.state.products;\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n if (Msdyn365.msdyn365Commerce.isBrowser) {\r\n await this._getProductsDimensionsAvailabilities(products);\r\n }\r\n\r\n this.setState({ products });\r\n };\r\n\r\n /**\r\n * Get the see all button.\r\n * @param recommendation - Recommendation.\r\n * @param headingLabel - Heading label.\r\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\r\n */\r\n private readonly _getSeeAllButton = (recommendation: string, headingLabel: string): React.ReactNode => {\r\n const catalogId = getCatalogId(this.props.context.request);\r\n const seeAllLink = `/search?recommendation=${recommendation}&title=${headingLabel}&catalogid=${catalogId}`;\r\n return (\r\n \r\n {this.props.resources.seeAllButtonText}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default ProductCollection;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './dyn-product-collection';\r\n\r\nconst ProductCollectionView: React.FC = props => {\r\n const {\r\n heading,\r\n ProductCollectionContainer,\r\n products,\r\n SingleSlideCarouselComponentProps,\r\n ListComponentProps,\r\n GridComponentProps,\r\n isCarousel,\r\n isList,\r\n seeAllButton\r\n } = props;\r\n\r\n if (products) {\r\n return (\r\n \r\n {heading}\r\n {seeAllButton}\r\n {isList\r\n ? _renderList(ListComponentProps, products)\r\n : isCarousel\r\n ? _renderCarousel(SingleSlideCarouselComponentProps, products)\r\n : _renderGrid(GridComponentProps, products)}\r\n \r\n );\r\n }\r\n props.context.telemetry.error('Product collection content is empty, module wont render.');\r\n return null;\r\n};\r\n\r\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\nconst _renderList = (listContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\r\n const { ProductContainer, productComponent } = product;\r\n\r\n return {productComponent};\r\n};\r\n\r\nexport default ProductCollectionView;\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\n/* eslint-disable no-duplicate-imports */\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 { 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 const { selectedChoices } = this.props;\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 } = 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 && {label}}\r\n
    \r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\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 \r\n {clearAllText}\r\n \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 (hierarchy: IProductRefinerHierarchy) =>\r\n !!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(\r\n selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key\r\n );\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\n/* eslint-disable no-duplicate-imports */\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
{text}
\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\n/* eslint-disable no-duplicate-imports */\r\nimport { ICoreContext, IGridSettings, IImageSettings, IRequestContext } from '@msdyn365-commerce/core'; //Image, IImageData\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 { IDynSearchResultContainerResources } from '../dyn-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: IDynSearchResultContainerResources;\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 =\r\n 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,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n \r\n
\r\n

{heading}

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n altText?: string,\r\n fallbackImage?: string,\r\n context?: IRequestContext\r\n): JSX.Element | null {\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\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return

{title}

;\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\n/* eslint-disable no-duplicate-imports */\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 {' '}\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\n/* eslint-disable no-duplicate-imports */\r\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } 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 \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 {props.resources.modalTitle};\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\n/* eslint-disable no-duplicate-imports */\r\nimport { TebuProductComponent } from './product.component'; //'@msdyn365-commerce/components';\r\nimport { IPriceComponentResources } from './price.component'; //'@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 { IDynSearchResultContainerResources } from '../dyn-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IDynSearchResultContainerResources;\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}\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\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\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\nfunction checkHidePrice(product: ProductSearchResult): boolean {\r\n if (!ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return false;\r\n }\r\n const erpMarketStatusAttribute = product.AttributeValues.find(attribute => attribute.Name === 'ERP_MarketStatus');\r\n if (erpMarketStatusAttribute && erpMarketStatusAttribute.TextValue === 'Hide price') {\r\n return true;\r\n }\r\n return false;\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}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\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\n/* eslint-disable no-duplicate-imports */\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 }) => {separator} ;\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\n/* eslint-disable no-duplicate-imports */\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 }) => {text} ;\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 { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n//import { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductPrice, AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n//import Button from 'reactstrap/lib/Button';\r\n\r\n/**\r\n * Interface for price component resources.\r\n * @param {string} priceRangeSeparator - The price range separator.\r\n */\r\nexport interface IPriceComponentResources {\r\n priceRangeSeparator?: string;\r\n}\r\n\r\n/**\r\n * Interface for price component props.\r\n * @param {boolean} isPriceMinMaxEnabled - Whether the price range feature is enabled or not.\r\n * @param {IPriceComponentResources} priceResources - The price range resources.\r\n */\r\nexport interface ITebuPriceModel3ComponentProps extends IComponentProps<{ price: ProductPrice }> {\r\n className?: string;\r\n savingsText?: string;\r\n freePriceText?: React.ReactNode;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n productAttributes?: AttributeValue[];\r\n toggleForm?: any;\r\n hidePrice?: boolean;\r\n productEnquiryLink?: string;\r\n}\r\nexport interface ITebuPriceModel3Component extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst Price: React.FC = (props: ITebuPriceModel3ComponentProps) => {\r\n // CustomerContextualPrice could be 0\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n\r\n // Verrue pour cacher les prix sur certains canaux\r\n if (\r\n props.context.request.sitePath === '/dk-sek' ||\r\n props.context.request.sitePath === '/dk-nok' ||\r\n props.context.request.sitePath === '/dk-eur'\r\n ) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\r\n \r\n );\r\n};\r\n\r\nconst showStrikethroughPricing = (props: ITebuPriceModel3ComponentProps) => {\r\n const originalPrice = getOriginalPrice(props);\r\n\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getOriginalPrice = (props: ITebuPriceModel3ComponentProps) => {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\n\r\nconst formatCurrency = (\r\n props: ITebuPriceModel3ComponentProps,\r\n price: number | undefined,\r\n shouldUseFreePriceText: boolean | undefined,\r\n enableMarketingForm?: boolean\r\n): React.ReactNode | undefined => {\r\n if (price === undefined) {\r\n //return undefined;\r\n return <>;\r\n }\r\n\r\n if (props.hidePrice) {\r\n return (\r\n \r\n Price Enquiry\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {props.context.cultureFormatter.formatCurrency(price)}\r\n \r\n );\r\n};\r\n\r\nconst renderCurrentPrice = (props: ITebuPriceModel3ComponentProps): JSX.Element | undefined => {\r\n const initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice, true);\r\n const maxVariantPrice = formatCurrency(props, props.data.price.MaxVariantPrice, false);\r\n const minVariantPrice = formatCurrency(props, props.data.price.MinVariantPrice, false);\r\n if (props.hidePrice) {\r\n return
{initialPrice}
;\r\n }\r\n if (props.isPriceMinMaxEnabled && maxVariantPrice !== minVariantPrice && maxVariantPrice && minVariantPrice) {\r\n return (\r\n \r\n \r\n {minVariantPrice}\r\n \r\n \r\n {props.priceResources?.priceRangeSeparator}\r\n \r\n \r\n {maxVariantPrice}\r\n \r\n \r\n );\r\n }\r\n\r\n return
From: {initialPrice}
;\r\n};\r\n\r\nconst renderCurrentPriceWithOriginalPrice = (props: ITebuPriceModel3ComponentProps): JSX.Element | null => {\r\n const originalPrice = getOriginalPrice(props);\r\n const initialPrice = formatCurrency(props, originalPrice, true);\r\n\r\n return (\r\n <>\r\n {props.hidePrice ? (\r\n \r\n ) : (\r\n <>\r\n \r\n {' '}\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n \r\n \r\n \r\n {props.savingsText && {props.savingsText}}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const TebuPriceModel3Component: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n ITebuPriceModel3Component\r\n>('TebuPriceModel3', { component: Price, ...PriceComponentActions });\r\n\r\nexport default TebuPriceModel3Component;\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 IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageProps,\r\n IImageSettings,\r\n IRequestContext,\r\n msdyn365Commerce\r\n} from '@msdyn365-commerce/core'; // Image, IImageData,\r\nimport { AttributeSwatch, AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionTypes,\r\n generateImageUrl,\r\n getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { TebuPriceModel3Component } from './price.component';\r\nimport { IPriceComponentResources, ISwatchItem, RatingComponent, ProductComponentSwatchComponent } from '@msdyn365-commerce/components';\r\n\r\nexport interface ITebuProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n hidePrice?: boolean;\r\n}\r\n\r\nexport interface ITebuProductComponent extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\ndeclare global {\r\n interface Window {\r\n jQuery?: any;\r\n }\r\n}\r\n\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n hidePrice\r\n}) => {\r\n const product = data.product;\r\n\r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\r\n );\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls)\r\n ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\r\n : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n ): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState();\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback(\r\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [context, productPageUrl]\r\n );\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n
\r\n {unitOfMeasure}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {inventoryAvailabilityLabel}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches =\r\n item.Swatches?.map(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault\r\n };\r\n }) ?? [];\r\n if (\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) &&\r\n dimensionType === DimensionTypes.color\r\n ) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string\r\n ): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\r\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\r\n }`;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n requestContext?: IRequestContext\r\n ): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // const image: IImageData = {\r\n // src: imageUrl,\r\n // altText: altText ? altText : '',\r\n // fallBackSrc: fallbackImageUrl\r\n // };\r\n const imageProps: IImageProps = { gridSettings };\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return ; //;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price. */\r\n function renderPrice(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n maxVariantPrice?: number,\r\n minVariantPrice?: number,\r\n savingsPriceResourceText?: string,\r\n freePriceResourceText?: string,\r\n originalPriceResourceText?: string,\r\n currentPriceResourceText?: string,\r\n hidePrice?: boolean\r\n ): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n ): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return

{description}

;\r\n }\r\n\r\n function getErpExternalItemId(attributeValues?: AttributeValue[]): string | undefined {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute =>\r\n attribute.Name === 'External Item Id' ||\r\n attribute.Name === 'ERP_ExternalItemID' ||\r\n attribute.KeyName === 'ERPExternalItemID'\r\n );\r\n if (externalItemIdAttribute && externalItemIdAttribute.TextValue !== '') {\r\n return externalItemIdAttribute.TextValue;\r\n }\r\n return '';\r\n }\r\n\r\n function getErpSize(attributeValues?: AttributeValue[]): string | undefined {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute => attribute.Name === 'ERP_Sizes' || attribute.KeyName === 'ERPSizes'\r\n );\r\n if (externalItemIdAttribute && externalItemIdAttribute.TextValue !== '') {\r\n return externalItemIdAttribute.TextValue;\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param Name - Product Name.\r\n * @returns The product Name external item id component.\r\n */\r\n function renderErpExternalItemId(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n const attribute = getErpExternalItemId(attributeValues);\r\n if (attribute) {\r\n return (\r\n
\r\n {'Ref: '}\r\n {attribute}\r\n
\r\n );\r\n } else {\r\n return <>;\r\n }\r\n }\r\n\r\n function renderErpSize(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n const attribute = getErpSize(attributeValues);\r\n if (attribute) {\r\n return (\r\n
\r\n Sizes: \r\n {attribute}\r\n
\r\n );\r\n } else {\r\n return <>;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param Name - Product Name.\r\n * @returns The product Name external item id component.\r\n */\r\n function renderName(name?: string, attributeValues?: AttributeValue[]): JSX.Element | null {\r\n /*const attribute = getExternalItemId(attributeValues);\r\n if (attribute) {\r\n return (\r\n

\r\n {name}-{getExternalItemId(attributeValues)}\r\n

\r\n );\r\n } else {\r\n */\r\n return

{name}

;\r\n //}\r\n }\r\n\r\n React.useEffect(() => {\r\n const recordId = product.RecordId;\r\n const catalogNumber =\r\n product.AttributeValues?.find(attribute => attribute.Name === 'ERP_Bioz_BadgeRepresentative')?.TextValue ?? '';\r\n const catalogNumberFormatted = catalogNumber.replace(/[ .]/g, '_');\r\n\r\n if (!catalogNumberFormatted) {\r\n return;\r\n } // Exit if there's no catalog number formatted\r\n\r\n // Append styles\r\n appendStyles();\r\n\r\n let isJQueryLoaded = typeof window.jQuery !== 'undefined';\r\n const scriptJQueryExisting = getScriptBySrc('https://cdn.bioz.com/assets/jquery-2.2.4.js');\r\n const scriptJQueryNew = !scriptJQueryExisting\r\n ? appendResource('script', null, 'https://cdn.bioz.com/assets/jquery-2.2.4.js')\r\n : null;\r\n\r\n if (isJQueryLoaded) {\r\n loadAfterJQuery();\r\n } else if (scriptJQueryExisting) {\r\n scriptJQueryExisting.addEventListener('load', () => {\r\n isJQueryLoaded = true;\r\n loadAfterJQuery();\r\n });\r\n } else if (scriptJQueryNew) {\r\n scriptJQueryNew.addEventListener('load', loadAfterJQuery);\r\n }\r\n\r\n function loadAfterJQuery() {\r\n // Load other scripts after jQuery\r\n appendOtherScripts();\r\n\r\n // Load script2 and append inlineBioz after script2 loads\r\n const script2 = document.createElement('script');\r\n script2.src = 'https://cdn.bioz.com/assets/v_widget-2.5.tebubio.js';\r\n script2.addEventListener('load', () => {\r\n const inlineBioz = createInlineBiozScript(recordId, catalogNumberFormatted);\r\n document.body.appendChild(inlineBioz);\r\n });\r\n document.head.appendChild(script2);\r\n }\r\n\r\n // Cleanup on component unmount\r\n return () => {\r\n const resources: (HTMLElement | null)[] = [\r\n getScriptBySrc('https://cdn.bioz.com/assets/jquery-2.2.4.js') as HTMLElement,\r\n getScriptBySrc('https://cdn.bioz.com/assets/bioz-w-api-2.5.min.js') as HTMLElement,\r\n getScriptBySrc('https://cdn.bioz.com/assets/tooltipster.js') as HTMLElement,\r\n getScriptBySrc('https://cdn.bioz.com/assets/v_widget-2.5.tebubio.js') as HTMLElement,\r\n document.querySelector(`script:contains(\"var _type = 'commercial';\")`) as HTMLElement\r\n ].filter(Boolean) as HTMLElement[]; // filter out any null values and assert the resulting type\r\n\r\n cleanupResources(resources);\r\n };\r\n }, [product]);\r\n\r\n function appendStyles(): void {\r\n // CSS Links\r\n appendResource('link', 'stylesheet', 'https://cdn.bioz.com/assets/font-awesome-reg.css');\r\n appendResource('link', 'stylesheet', 'https://cdn.bioz.com/assets/tooltipster.css');\r\n appendResource('link', 'stylesheet', 'https://cdn.bioz.com/assets/tooltipster-theme2.css');\r\n appendResource('link', 'stylesheet', 'https://cdn.bioz.com/assets/v_widget-2.5.css');\r\n }\r\n\r\n function appendOtherScripts(): void {\r\n // Load other scripts (script1, script3, and inline script)\r\n appendResource('script', null, 'https://cdn.bioz.com/assets/bioz-w-api-2.5.min.js');\r\n appendResource('script', null, 'https://cdn.bioz.com/assets/tooltipster.js');\r\n\r\n const inlineScript = document.createElement('script');\r\n inlineScript.innerHTML = `\r\n var _type = \"commercial\";\r\n var _company = \"19338\";\r\n var _vendor = \"tebu-bio sa\";\r\n var _vendor_partner_color = \"#0F37AF\";\r\n var _form_url = \"https://back-badge-8.bioz.com\";\r\n var _key = \"\";\r\n var _form_mobile = false;\r\n `;\r\n document.body.appendChild(inlineScript);\r\n }\r\n\r\n function appendResource(type: 'link' | 'script', rel: string | null, hrefOrSrc: string): HTMLElement | null {\r\n if (isResourceAlreadyAdded(type, hrefOrSrc)) {\r\n return null;\r\n }\r\n\r\n const element = document.createElement(type);\r\n\r\n if (type === 'link') {\r\n (element as HTMLLinkElement).rel = rel as string;\r\n (element as HTMLLinkElement).href = hrefOrSrc;\r\n document.head.appendChild(element);\r\n } else if (type === 'script') {\r\n (element as HTMLScriptElement).src = hrefOrSrc;\r\n document.head.appendChild(element);\r\n } else {\r\n return null; // Make sure to return null for any other conditions\r\n }\r\n\r\n return element;\r\n }\r\n\r\n function createInlineBiozScript(recordId: number, catalogNumberFormatted: string): HTMLScriptElement {\r\n const inlineBioz = document.createElement('script');\r\n inlineBioz.innerHTML = `\r\n var widget_micro_obj_${recordId} = new v_widget_obj(\"s\", 2);\r\n widget_micro_obj_${recordId}.request_catalog_number_widget_data_internal(\"${catalogNumberFormatted}\", \"${catalogNumberFormatted}-${recordId}\");\r\n `;\r\n return inlineBioz;\r\n }\r\n\r\n function cleanupResources(resources: (HTMLElement | null)[]): void {\r\n resources.forEach(resource => {\r\n if (resource && document.body.contains(resource)) {\r\n document.body.removeChild(resource);\r\n } else if (resource && document.head.contains(resource)) {\r\n document.head.removeChild(resource);\r\n }\r\n });\r\n }\r\n\r\n function getScriptBySrc(src: string): HTMLScriptElement | null {\r\n return document.querySelector(`script[src=\"${src}\"]`);\r\n }\r\n\r\n function isResourceAlreadyAdded(type: 'link' | 'script', srcOrHref: string): boolean {\r\n if (type === 'link') {\r\n return !!document.querySelector(`link[href=\"${srcOrHref}\"]`);\r\n } else if (type === 'script') {\r\n return !!document.querySelector(`script[src=\"${srcOrHref}\"]`);\r\n }\r\n return false;\r\n }\r\n\r\n const catalogNumber = product.AttributeValues?.find(attribute => attribute.Name === 'ERP_Bioz_BadgeRepresentative')?.TextValue ?? '';\r\n const catalogNumberFormatted = catalogNumber?.replace(/[ .]/g, '_');\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n
\r\n

{renderName(product.Name, product.AttributeValues)}

\r\n
\r\n \r\n {catalogNumberFormatted ? (\r\n
\r\n
\r\n
\r\n \r\n Powered by Bioz\r\n \r\n
\r\n
\r\n ) : (\r\n ''\r\n )}\r\n
\r\n {renderErpExternalItemId(product.AttributeValues)}\r\n {renderErpSize(product.AttributeValues)}\r\n {renderProductDimensions(product.AttributeValues)}\r\n
\r\n
\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n product.MaxVariantPrice,\r\n product.MinVariantPrice,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n hidePrice\r\n )}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n \r\n
Product detail
\r\n \r\n
\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n \r\n );\r\n};\r\n\r\nexport const TebuProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n ITebuProductComponent\r\n>('TebuProduct', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default TebuProductComponent;\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\n/* eslint-disable no-duplicate-imports */\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(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\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 =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n 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(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\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, 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(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\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(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\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 =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n 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(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\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 = (\r\n 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\r\n ): 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 ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\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 )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \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 {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = 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 {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = 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(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): 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 // Dyn : récupération correctif MS V9.41.18\r\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n return amount || '';\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 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\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } 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 { 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 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\r\n /** The telemetry content */\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 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, 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 index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\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(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\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 }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n return (\r\n
  • \r\n \r\n {this._renderSwatch()}\r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n \r\n \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 _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 =\r\n hasValidSwatch && checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\r\n const swatchItems = shouldDisplayAsSwatch\r\n ? [\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 ]\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 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 this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n private _renderRating(\r\n productRefinerValue: ProductRefinerValue,\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean,\r\n context: ICoreContext,\r\n index?: number,\r\n telemetryContent?: ITelemetryContent\r\n ): 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(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\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 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 * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\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\r\n /** The telemetry content */\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, 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 } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : 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 \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\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 />\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 (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\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 {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\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\n/* eslint-disable no-duplicate-imports */\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 * 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 * 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 * 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 (\r\n dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer\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 */\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((refinementCriterion: ProductRefinerValue) =>\r\n 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(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): 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:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\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:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n 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 (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\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) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\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\r\n): 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\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDynSearchResultContainer 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 none = 'none',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IDynSearchResultContainerConfig 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}\r\n\r\nexport interface IDynSearchResultContainerResources {\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 modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n}\r\n\r\nexport interface IDynSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IDynSearchResultContainerResources;\r\n config: IDynSearchResultContainerConfig;\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\n/* eslint-disable no-duplicate-imports */\r\nimport { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { getCartFromCustomer } from '@msdyn365-commerce/global-state';\r\nimport {\r\n format,\r\n ProductPrice,\r\n ProductRefinerValue,\r\n ProjectionDomain,\r\n SortColumn,\r\n TextValueTranslation\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination\r\n} 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\n// import {\r\n// buildListPageUrl,\r\n// getCollectionProducts,\r\n// getCollectionRefinersAction,\r\n// getCurrentUrl,\r\n// GetFullProductsByCollectionInput,\r\n// parseQueryParam,\r\n// RefinersByCollectionInput,\r\n// sortOptions\r\n// } from './actions';\r\n\r\nimport getCollectionProducts, { GetFullProductsByCollectionInput } from './actions/get-full-products-by-collection';\r\nimport { sortOptions } from './actions/get-mapped-search-configuration';\r\nimport getCollectionRefinersAction, { RefinersByCollectionInput } from './actions/get-refiners-for-collection';\r\nimport { getCurrentUrl, buildListPageUrl, parseQueryParam } from './actions/url-utils';\r\n\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IDynSearchResultContainerData } from './dyn-search-result-container.data';\r\nimport { expandRefinersCount, IDynSearchResultContainerProps } from './dyn-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IDynSearchResultContainerProps {\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}\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}\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<\r\n IDynSearchResultContainerProps,\r\n 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;\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 productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: IDynSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport =\r\n 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 { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = 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(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n\r\n // Initalization of list page\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 listPageState.currentPageNumber =\r\n (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 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 return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber,\r\n listPageState.sortingCritera &&\r\n listPageState.sortingCritera.Columns &&\r\n listPageState.sortingCritera.Columns.length\r\n ];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\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 || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n\r\n this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n !!(\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes\r\n ),\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale\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 if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\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(\r\n listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n 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\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel\r\n );\r\n\r\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext)\r\n .then(refiners => {\r\n this.setState({ refiners });\r\n })\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 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 componentDidMount(): void {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\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 { imageSettings, className } = 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 const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0\r\n ? this._getSortingDropDown()\r\n : 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:\r\n 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 FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct:\r\n this.props.data.listPageState.result &&\r\n this.props.data.listPageState.result.featureProduct !== null &&\r\n this.props.data.listPageState.result.featureProduct !== undefined\r\n ? featureComponent\r\n : null,\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private readonly _getActivePrice = async (): Promise => {\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n const cart = await getCartFromCustomer(this.props.context.actionContext);\r\n const affliations = cart?.AffiliationLines;\r\n\r\n await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n affliations,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(\r\n activePrice.BasePrice || 0,\r\n activePrice.TradeAgreementPrice || 0,\r\n activePrice.AdjustedPrice || 0\r\n );\r\n }\r\n return prod;\r\n });\r\n this.props.data.listPageState.then(listPageState => {\r\n listPageState.activeProducts = products;\r\n });\r\n })\r\n .catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n '[get Affiliation based price on search result container ]Error executing action'\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\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 =\r\n (data.category.result &&\r\n 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 =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : 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 private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\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 private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdwonOptions = this.sortByDropdownOptions;\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 dropdwonOptions = this.sortByDropdownOptions.filter(dropdownOption => dropdownOption.key !== 'AverageRating-Desc');\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={dropdwonOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\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 const skipCount =\r\n listPageState && listPageState.currentPageNumber !== null\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (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\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n //debugger;\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 =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n });\r\n\r\n const sortedValidRefiners = validRefiners?.map((refiner: IProductRefinerHierarchy) => {\r\n const sortedRefiner: IProductRefinerHierarchy = {\r\n ...refiner,\r\n Values: refiner.Values.filter(refiner => {\r\n return refiner.LeftValueBoundString?.toLowerCase() !== 'not specified';\r\n }).sort((a, b) => ((a.LeftValueBoundString?.toLowerCase() ?? '') > (b.LeftValueBoundString?.toLowerCase() ?? '') ? 1 : -1))\r\n };\r\n return sortedRefiner;\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 =\r\n validRefiners &&\r\n sortedValidRefiners &&\r\n sortedValidRefiners.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 />\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 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 selectedChoices={selectedRefiners}\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 />\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 );\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 />\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 const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\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 private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find(mappedSearchConfig => {\r\n return (\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\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 ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || []\r\n );\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(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\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 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 }, 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 const { context } = this.props;\r\n\r\n // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'lg';\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 // Dyn : Added none\r\n case expandRefinersCount.none:\r\n this.expandrefinerCount = 0;\r\n break;\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'>{paginationPreviousText}</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'>{paginationNextText}</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 * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './dyn-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage,\r\n FeatureSearchContainer,\r\n similarLookProduct\r\n } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n const img_tetiere = [\r\n 'https://images-eu-prod.cms.commerce.dynamics.com/cms/api/gxltbxxkkq/imageFileData/ME2XB?ver=478b',\r\n 'https://images-eu-prod.cms.commerce.dynamics.com/cms/api/gxltbxxkkq/imageFileData/ME2Xp?ver=46cc',\r\n 'https://images-eu-prod.cms.commerce.dynamics.com/cms/api/gxltbxxkkq/imageFileData/ME5LW?ver=e936'\r\n ];\r\n //const color_tetiere = ['orange', 'purple', 'green'];\r\n //const index = Math.floor(Math.random() * 3);\r\n const class_tetiere = 'ms-content-block tetiere product-tetiere tetiere-orange'; // + color_tetiere[0];\r\n\r\n if (isMobile) {\r\n return (\r\n <React.Fragment>\r\n {renderTetiere(categoryHierarchy, img_tetiere[0], class_tetiere)}\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n </React.Fragment>\r\n );\r\n }\r\n return (\r\n <React.Fragment>\r\n {renderTetiere(categoryHierarchy, img_tetiere[0], class_tetiere)}\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>{categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}</Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n <div className='searchResultTitle_header'>\r\n <div className='searchResultTitle_wrapper'>\r\n <Node {...TitleViewProps.TitleContainer}>\r\n <h2>\r\n {TitleViewProps && renderTitle(TitleViewProps)} {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </h2>\r\n </Node>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </div>\r\n {choiceSummary}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</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 </React.Fragment>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): 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 <div className='refinerSectionTitle'>Filters</div>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</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 <Node {...SortingContainer}>{sortByDropDown}</Node>;\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 } = props;\r\n if (title) {\r\n return (\r\n <React.Fragment>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </React.Fragment>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title } = props;\r\n if (title) {\r\n return (\r\n <React.Fragment>\r\n <span className='searchResultCount'>({title.titleCount})</span>\r\n </React.Fragment>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTetiere = (props: ICategoryHierarchyViewProps, img_tetiere: string, class_tetiere: string): JSX.Element | null => {\r\n const { categoryHierarchyList } = props;\r\n\r\n return categoryHierarchyList ? (\r\n <React.Fragment>\r\n <div className='default-container default-container fluid'>\r\n <div className='row'>\r\n <div className='col-12'>\r\n <div className={class_tetiere} data-m-t='content-block'>\r\n <div className='ms-content-block__image'>\r\n <picture>\r\n <img\r\n alt='Products banner'\r\n src={img_tetiere}\r\n width='1600'\r\n height='315'\r\n className='msc-main_image msc_image'\r\n />\r\n </picture>\r\n </div>\r\n <div className='banner__bg bg-orange-gradient-top'></div>\r\n <div className='ms-content-block__details'>\r\n <div className='ms-content-block__text'>\r\n <h1>{categoryHierarchyList[categoryHierarchyList.length - 1]}</h1>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </React.Fragment>\r\n ) : (\r\n <Node className='tetiere'></Node>\r\n );\r\n};\r\n\r\nexport default SearchResultContainerView;\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 { FullProduct } from '@msdyn365-commerce/commerce-entities';\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { addOrderTemplateToCartAction, AddOrderTemplateToCartInput, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n IPopupProductsProps,\r\n ITelemetryContent,\r\n PopupProducts,\r\n TelemetryConstant,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport { ILinesAddedToCartDialogResources, LinesAddedToCartDialog } from '@msdyn365-commerce/components'; //' ../lines-added-to-cart-dialog/lines-added-to-cart-dialog.component';\r\nimport { AttributeValue, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nexport interface IAddOrderTemplateToCartComponentData {\r\n orderTemplate: OrderTemplate;\r\n}\r\n\r\nexport interface IAddOrderTemplateToCartComponentProps extends IComponentProps<IAddOrderTemplateToCartComponentData> {\r\n className?: string;\r\n parentElementRef?: React.RefObject<Button>;\r\n addToCartText: string;\r\n telemetryContent?: ITelemetryContent;\r\n dialogStrings: {\r\n closeWindowButtonText: string;\r\n addToCartFailureMessage: string;\r\n addToCartSuccessMessage: string;\r\n addToCartProcessMessage: string;\r\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\r\n };\r\n}\r\n\r\nexport declare type IAddToCartActionFailureReason = 'EMPTYINPUT' | 'MISSINGDIMENSION' | 'OUTOFSTOCK' | 'CARTACTIONFAILED'; // Rename to used method\r\n\r\nexport interface IAddOrderTemplateToCartComponent extends IComponent<IAddOrderTemplateToCartComponentProps> {\r\n onClick(): (event: React.MouseEvent<HTMLElement>, props: IAddOrderTemplateToCartComponentProps) => void;\r\n}\r\n\r\nconst onClick = async (\r\n _event: React.MouseEvent<HTMLElement>,\r\n props: IAddOrderTemplateToCartComponentProps,\r\n setUploadStatus: (uploadStatus: addOrderTemplateToCartStatus) => void,\r\n openModal: (opened: boolean) => void,\r\n setLinesAddedToCartDialogOpen: (opened: boolean) => void,\r\n setAddedLinesCount: (value: number) => void\r\n): Promise<void> => {\r\n openModal(true);\r\n setUploadStatus('LOADING');\r\n\r\n const { context } = props;\r\n const addOrderTemplateToCartInput = new AddOrderTemplateToCartInput(props.data.orderTemplate.productList.Id);\r\n const addedCartLines = await addOrderTemplateToCartAction(addOrderTemplateToCartInput, context.actionContext);\r\n setAddedLinesCount(addedCartLines.length);\r\n openModal(false);\r\n setTimeout(() => {\r\n setLinesAddedToCartDialogOpen(true);\r\n }, 500);\r\n};\r\n\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\nexport type addOrderTemplateToCartStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'WAITING';\r\n\r\nconst _getModalText = (status: addOrderTemplateToCartStatus, props: IAddOrderTemplateToCartComponentProps) => {\r\n const { dialogStrings } = props;\r\n const { addToCartFailureMessage, addToCartSuccessMessage, addToCartProcessMessage } = dialogStrings;\r\n\r\n if (status === 'LOADING') {\r\n return `${addToCartProcessMessage}...`;\r\n }\r\n\r\n if (status === 'SUCCESS') {\r\n return addToCartSuccessMessage;\r\n }\r\n\r\n if (status === 'FAILED') {\r\n return addToCartFailureMessage;\r\n }\r\n\r\n return '';\r\n};\r\n\r\nlet buttonEventReference: HTMLButtonElement | undefined;\r\n\r\nexport interface IModalWarningResources {\r\n modalWarningHeader?: string;\r\n modalWarningMessage?: string;\r\n modalWarningAcceptance?: string;\r\n modalWarningOK?: string;\r\n modalWarningCancel?: string;\r\n}\r\nexport interface IModalWarningProps {\r\n buttonLabel: string;\r\n className: string;\r\n applicationNode: string;\r\n isOpen: boolean;\r\n onWarningSubmit(event: React.MouseEvent<HTMLElement>): void;\r\n warningClose(): void;\r\n modalWarningResources?: IModalWarningResources;\r\n}\r\n\r\nexport interface IModalWarningState {\r\n warningAccepted: boolean;\r\n}\r\n\r\nexport class ModalWarning extends React.PureComponent<IModalWarningProps, IModalWarningState> {\r\n public modalWarningBtn: React.RefObject<any>;\r\n\r\n constructor(props: IModalWarningProps) {\r\n super(props);\r\n this.state = {\r\n warningAccepted: false\r\n };\r\n\r\n this.toggle = this.toggle.bind(this);\r\n this.accept = this.accept.bind(this);\r\n this.onWarningChecked = this.onWarningChecked.bind(this);\r\n this.modalWarningBtn = React.createRef();\r\n }\r\n\r\n public toggle(): void {\r\n this.setState({\r\n warningAccepted: false\r\n });\r\n this.props.warningClose();\r\n }\r\n\r\n public accept(event: React.MouseEvent<HTMLElement>): void {\r\n this.setState({\r\n warningAccepted: false\r\n });\r\n this.props.warningClose();\r\n this.props.onWarningSubmit(event);\r\n }\r\n\r\n public onWarningChecked(): void {\r\n this.setState({\r\n warningAccepted: !this.state.warningAccepted\r\n });\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <Modal\r\n autoFocus\r\n fade={false}\r\n applicationNode='rsg-root'\r\n returnFocusRef={this.modalWarningBtn}\r\n isOpen={this.props.isOpen}\r\n toggle={this.toggle}\r\n className={this.props.className}\r\n horizontalPosition='right'\r\n verticalPosition='top'\r\n >\r\n <ModalHeader toggle={this.toggle}>\r\n <h2>{this.props.modalWarningResources?.modalWarningHeader ?? 'Quotation process warning'}</h2>\r\n </ModalHeader>\r\n <ModalBody>\r\n <div className='warningText'>\r\n {this.props.modalWarningResources?.modalWarningMessage ??\r\n 'To ensure that your quote contains only selected items, please empty your basket before converting list to bag.'}\r\n </div>\r\n <div className='warningCheckbox'>\r\n <label className='checkbox-container'>\r\n <input\r\n aria-label=''\r\n className='checkbox-input'\r\n type='checkbox'\r\n checked={this.state.warningAccepted}\r\n aria-checked={this.state.warningAccepted}\r\n //onChange={this.onWarningChecked}\r\n onClick={this.onWarningChecked}\r\n />\r\n {this.props.modalWarningResources?.modalWarningCancel ?? 'I understand'}\r\n </label>\r\n </div>\r\n </ModalBody>\r\n <ModalFooter>\r\n <button className='cta-quotation-warning-ok' disabled={!this.state.warningAccepted} onClick={this.accept}>\r\n {this.props.modalWarningResources?.modalWarningOK ?? 'OK'}\r\n </button>{' '}\r\n <button className='cta-quotation-warning-cancel' onClick={this.toggle}>\r\n {this.props.modalWarningResources?.modalWarningCancel ?? 'Cancel'}\r\n </button>\r\n </ModalFooter>\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nexport interface IModalWarningPropsFromLineAction {\r\n buttonLabel: string;\r\n className: string;\r\n applicationNode: string;\r\n isOpen: boolean;\r\n onWarningSubmit(product: SimpleProduct, quantity: number, itemKey: string, productSpecification: AttributeValue[]): void;\r\n warningClose(): void;\r\n productFromLineAction: SimpleProduct;\r\n quantityFromLineAction: number;\r\n itemKeyFromLineAction: string;\r\n productSpecificationFromLineAction: AttributeValue[];\r\n modalWarningResources?: IModalWarningResources;\r\n}\r\n\r\nexport class ModalWarningFromLineAction extends React.PureComponent<IModalWarningPropsFromLineAction, IModalWarningState> {\r\n public modalWarningBtn: React.RefObject<any>;\r\n\r\n constructor(props: IModalWarningPropsFromLineAction) {\r\n super(props);\r\n this.state = {\r\n warningAccepted: false\r\n };\r\n\r\n this.toggle = this.toggle.bind(this);\r\n this.accept = this.accept.bind(this);\r\n this.onWarningChecked = this.onWarningChecked.bind(this);\r\n this.modalWarningBtn = React.createRef();\r\n }\r\n\r\n public toggle(): void {\r\n this.setState({\r\n warningAccepted: false\r\n });\r\n this.props.warningClose();\r\n }\r\n\r\n public accept(): void {\r\n this.setState({\r\n warningAccepted: false\r\n });\r\n this.props.warningClose();\r\n this.props.onWarningSubmit(\r\n this.props.productFromLineAction,\r\n this.props.quantityFromLineAction,\r\n this.props.itemKeyFromLineAction,\r\n this.props.productSpecificationFromLineAction\r\n );\r\n }\r\n\r\n public onWarningChecked(): void {\r\n this.setState({\r\n warningAccepted: !this.state.warningAccepted\r\n });\r\n }\r\n\r\n public render(): JSX.Element {\r\n return (\r\n <Modal\r\n autoFocus\r\n fade={false}\r\n applicationNode='rsg-root'\r\n returnFocusRef={this.modalWarningBtn}\r\n isOpen={this.props.isOpen}\r\n toggle={this.toggle}\r\n className={this.props.className}\r\n horizontalPosition='right'\r\n verticalPosition='top'\r\n >\r\n <ModalHeader toggle={this.toggle}>\r\n <h2>{this.props.modalWarningResources?.modalWarningHeader ?? 'Quotation process warning'}</h2>\r\n </ModalHeader>\r\n <ModalBody>\r\n <div className='warningText'>\r\n {this.props.modalWarningResources?.modalWarningMessage ??\r\n 'To ensure that your quote contains only selected items, please empty your basket before converting list to bag.'}\r\n </div>\r\n <div className='warningCheckbox'>\r\n <label className='checkbox-container'>\r\n <input\r\n aria-label=''\r\n className='checkbox-input'\r\n type='checkbox'\r\n checked={this.state.warningAccepted}\r\n aria-checked={this.state.warningAccepted}\r\n //onChange={this.onWarningChecked}\r\n onClick={this.onWarningChecked}\r\n />\r\n I understand\r\n </label>\r\n </div>\r\n </ModalBody>\r\n <ModalFooter>\r\n <button className='cta-quotation-warning-ok' disabled={!this.state.warningAccepted} onClick={this.accept}>\r\n {this.props.modalWarningResources?.modalWarningOK ?? 'OK'}\r\n </button>{' '}\r\n <button className='cta-quotation-warning-cancel' onClick={this.toggle}>\r\n {this.props.modalWarningResources?.modalWarningCancel ?? 'Cancel'}\r\n </button>\r\n </ModalFooter>\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nconst AddOrderTemplate: React.FC<IAddOrderTemplateToCartComponentProps> = (props: IAddOrderTemplateToCartComponentProps) => {\r\n const [uploadStatus, setUploadStatus] = useState<addOrderTemplateToCartStatus>('WAITING');\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [addedLinesCount, setAddedLinesCount] = useState(0);\r\n const [linesAddedToCartDialogOpen, setLinesAddedToCartDialogOpen] = useState(false);\r\n const [modalWarningOpen, setModalWarningOpen] = useState(false);\r\n\r\n const onClickHandler = async (event: React.MouseEvent<HTMLElement>) => {\r\n buttonEventReference = event.target as HTMLButtonElement;\r\n await AddToCartComponentActions.onClick(\r\n event,\r\n props,\r\n setUploadStatus,\r\n setModalOpen,\r\n setLinesAddedToCartDialogOpen,\r\n setAddedLinesCount\r\n );\r\n };\r\n\r\n const warningHandler = () => {\r\n //debugger;\r\n setModalWarningOpen(true);\r\n };\r\n\r\n const warningClose = () => {\r\n setModalWarningOpen(false);\r\n };\r\n\r\n const closeLinesAddedToCartDialog = () => {\r\n setLinesAddedToCartDialogOpen(false);\r\n buttonEventReference?.focus();\r\n };\r\n\r\n const modalText = _getModalText(uploadStatus, props);\r\n const processStatusClass = uploadStatus.toLowerCase();\r\n const dialogStrings = { closeWindowButtonText: props.dialogStrings.closeWindowButtonText };\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.AddOrderTemplateToCart);\r\n const addOrderTemplateAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n\r\n const popupProps: IPopupProductsProps = {\r\n dialogStrings,\r\n className: 'msc-add-order-template-to-cart',\r\n processStatusClass,\r\n text: modalText,\r\n modalOpen,\r\n setModalOpen\r\n };\r\n\r\n const renderModalPopup = <PopupProducts {...popupProps} />;\r\n\r\n const products = props.data.orderTemplate.orderTemplateLines\r\n .map(line => line.fullProduct)\r\n .filter(fullProduct => fullProduct) as FullProduct[];\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n <button\r\n className={classnames(\r\n 'msc-add-order-template-to-cart msc-btn',\r\n props.className,\r\n props.data.orderTemplate.totalLines === 0 ? 'disabled' : ''\r\n )}\r\n aria-label={props.addToCartText}\r\n disabled={props.data.orderTemplate.totalLines === 0}\r\n type='button'\r\n onClick={warningHandler}\r\n {...addOrderTemplateAttribute}\r\n >\r\n {props.addToCartText}\r\n </button>\r\n <LinesAddedToCartDialog\r\n className='msc-lines-added-to-cart-dialog'\r\n id={props.id}\r\n typeName={props.typeName}\r\n context={props.context}\r\n dialogStrings={props.dialogStrings.linesAddedToCartDialogResources}\r\n data={{\r\n linesCount: addedLinesCount,\r\n orderTemplate: props.data.orderTemplate.productList,\r\n products\r\n }}\r\n modalOpen={linesAddedToCartDialogOpen}\r\n onClose={closeLinesAddedToCartDialog}\r\n />\r\n <ModalWarning\r\n buttonLabel=''\r\n className=''\r\n applicationNode=''\r\n isOpen={modalWarningOpen}\r\n onWarningSubmit={onClickHandler}\r\n warningClose={warningClose}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport const AddOrderTemplateToCartComponent: React.FunctionComponent<IAddOrderTemplateToCartComponentProps> =\r\n // @ts-expect-error -- As per design, custom component\r\n msdyn365Commerce.createComponent<IAddOrderTemplateToCartComponent>('AddOrderTemplate', {\r\n component: AddOrderTemplate,\r\n ...AddToCartComponentActions\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 IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageProps,\r\n IImageSettings,\r\n IRequestContext,\r\n msdyn365Commerce\r\n} from '@msdyn365-commerce/core'; // Image, IImageData,\r\nimport { AttributeSwatch, AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionTypes,\r\n generateImageUrl,\r\n getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IPriceComponentResources, PriceComponent } from '@msdyn365-commerce/components';\r\nimport { ISwatchItem } from '@msdyn365-commerce/components';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ProductComponentSwatchComponent } from '@msdyn365-commerce/components';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n}) => {\r\n const product = data.product;\r\n\r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\r\n );\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls)\r\n ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\r\n : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n ): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState<string | undefined>();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState<string | undefined>();\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback(\r\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [context, productPageUrl]\r\n );\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>{unitOfMeasure}</span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>{inventoryAvailabilityLabel}</span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches =\r\n item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault\r\n };\r\n }) ?? [];\r\n if (\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) &&\r\n dimensionType === DimensionTypes.color\r\n ) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n key={item.RecordId}\r\n context={context}\r\n onSelectDimension={updatePageAndImageUrl}\r\n swatches={swatches}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string\r\n ): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\r\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\r\n }`;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n requestContext?: IRequestContext\r\n ): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // const image: IImageData = {\r\n // src: imageUrl,\r\n // altText: altText ? altText : '',\r\n // fallBackSrc: fallbackImageUrl\r\n // };\r\n const imageProps: IImageProps = { gridSettings };\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return <React.Fragment></React.Fragment>; //<Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} />;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price. */\r\n function renderPrice(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n maxVariantPrice?: number,\r\n minVariantPrice?: number,\r\n savingsPriceResourceText?: string,\r\n freePriceResourceText?: string,\r\n originalPriceResourceText?: string,\r\n currentPriceResourceText?: string\r\n ): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n data={{ price }}\r\n savingsText={savingsPriceResourceText}\r\n freePriceText={freePriceResourceText}\r\n originalPriceText={originalPriceResourceText}\r\n currentPriceText={currentPriceResourceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n ): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n }\r\n\r\n function getErpExternalItemId(attributeValues?: AttributeValue[]): string | undefined {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute =>\r\n attribute.Name === 'External Item Id' ||\r\n attribute.Name === 'ERP_ExternalItemID' ||\r\n attribute.KeyName === 'ERPExternalItemID'\r\n );\r\n if (externalItemIdAttribute && externalItemIdAttribute.TextValue !== '') {\r\n return externalItemIdAttribute.TextValue;\r\n }\r\n return '';\r\n }\r\n\r\n function getErpSize(attributeValues?: AttributeValue[]): string | undefined {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute => attribute.Name === 'ERP_Sizes' || attribute.KeyName === 'ERPSizes'\r\n );\r\n if (externalItemIdAttribute && externalItemIdAttribute.TextValue !== '') {\r\n return externalItemIdAttribute.TextValue;\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param Name - Product Name.\r\n * @returns The product Name external item id component.\r\n */\r\n function renderErpExternalItemId(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n const attribute = getErpExternalItemId(attributeValues);\r\n if (attribute) {\r\n return (\r\n <div className='msc-product__ErpExternalItemId'>\r\n <span>{'Ref: '}</span>\r\n {attribute}\r\n </div>\r\n );\r\n } else {\r\n return <></>;\r\n }\r\n // return (\r\n // <div className='msc-product__ErpExternalItemId'>\r\n // <span>{'Ref: '}</span>\r\n // {attribute}\r\n // </div>\r\n // );\r\n }\r\n function renderErpSize(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n const attribute = getErpSize(attributeValues);\r\n if (attribute) {\r\n return (\r\n <div className='msc-product__ErpSize'>\r\n <span>{'Size: '}</span>\r\n {attribute}\r\n </div>\r\n );\r\n } else {\r\n return <></>;\r\n }\r\n // return (\r\n // <div className='msc-product__ErpSize'>\r\n // <span>{'Size: '}</span>\r\n // {attribute}\r\n // </div>\r\n // );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param Name - Product Name.\r\n * @returns The product Name external item id component.\r\n */\r\n function renderName(name?: string, attributeValues?: AttributeValue[]): JSX.Element | null {\r\n /*const attribute = getExternalItemId(attributeValues);\r\n if (attribute) {\r\n return (\r\n <p className='msc-product__name'>\r\n {name}-{getExternalItemId(attributeValues)}\r\n </p>\r\n );\r\n } else {\r\n */\r\n return <p className='msc-product__name'>{name}</p>;\r\n //}\r\n }\r\n return (\r\n <>\r\n <div className='product-component-infos-wrapper'>\r\n <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel,\r\n product.TotalRatings,\r\n ratingCountAriaLabel\r\n )}\r\n className='msc-product'\r\n {...attribute}\r\n >\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n </div>\r\n <div className='msc-product__titleblock'>\r\n <h4 className='msc-product__title'>{renderName(product.Name, product.AttributeValues)}</h4>\r\n </div>\r\n </a>\r\n {renderErpExternalItemId(product.AttributeValues)}\r\n {renderErpSize(product.AttributeValues)}\r\n {renderProductDimensions(product.AttributeValues)}\r\n </div>\r\n <div className='msc-product__details'>\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n product.MaxVariantPrice,\r\n product.MinVariantPrice,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel,\r\n product.TotalRatings,\r\n ratingCountAriaLabel\r\n )}\r\n className='msc-product-add-button'\r\n {...attribute}\r\n >\r\n <div className='msc-product-add-button__title'>Product detail</div>\r\n </a>\r\n </div>\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n </>\r\n );\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;\r\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, getCatalogId } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions, IDimensionsApp, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\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 * BulkPurchase state message Interface.\n */\nexport interface IBulkPurchaseStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n stateMessage?: IBulkPurchaseStateMessage;\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 private readonly _errorCssClass: string = 'danger';\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n private readonly collapseRef: React.RefObject<Collapse> = React.createRef<Collapse>();\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 /**\n *This function is being used to handel variant change dropdown.\n */\n private _dimensionDropDownChange = () => {\n this.collapseRef.current?.reEvaluateHeight();\n };\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n <Collapse className={className} isOpen={this.state.isExpanded} ref={this.collapseRef}>\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 const userMessageNode = this.state.stateMessage ? (\n <Alert color={this.state.stateMessage.statusCssString} isOpen={this.state.stateMessage.isOpen}>\n <span className={this.state.stateMessage.messageGlyph} />\n <span>{this.state.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\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 {userMessageNode}\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 const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState?.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\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 dimensionOnChange={this._dimensionDropDownChange}\n onErrorMessage={this._onErrorMessage}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n catalogId={catalogId}\n />\n );\n }\n\n private _onErrorMessage = (errorMessage: string) => {\n this.setState({\n stateMessage: {\n messageText: errorMessage,\n statusCssString: this._errorCssClass,\n messageGlyph: this._errorCssGlyphClass,\n isOpen: true\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 { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderProps } from '../header.props.autogenerated';\n\n/**\n * The header preferred store component.\n */\n@observer\nexport class HeaderPreferredStore extends React.PureComponent<IHeaderProps<IHeaderData>> {\n private readonly modalCloseButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n /**\n * Handle click on the store selector.\n * @returns : Promise void.\n */\n public handleClick = () => {\n return this._findPreferredStoreOnClick(this.props);\n };\n\n public render(): JSX.Element | undefined {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n slots,\n resources\n } = this.props;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\n const storeName =\n storeSelectorStateManager?.preferredStore && storeSelectorStateManager.preferredStore.StoreName\n ? storeSelectorStateManager.preferredStore.StoreName\n : resources.headerPreferredStoreText;\n\n return (\n <div className='ms-header__preferred-store-container'>\n <button\n className='ms-header__preferred-store-btn msc-btn'\n color='secondary'\n aria-label={resources.headerPreferredStoreAriaLabel}\n onClick={this.handleClick}\n ref={this.modalCloseButtonRef}\n >\n <span className='ms-header__preferred-store-text'>{storeName}</span>\n </button>\n {slots.storeSelector}\n </div>\n );\n }\n\n return undefined;\n }\n\n private async _findPreferredStoreOnClick(props: IHeaderProps<IHeaderData>): Promise<void> {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n modules\n } = props;\n if (!storeSelectorStateManager) {\n return;\n }\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n await storeSelectorStateManager\n .openDialog({\n id: storeSelectorId,\n showMapViewLink: true,\n parentElementRef: this.modalCloseButtonRef,\n onLocationSelected: orgUnitLocation => {\n return Promise.resolve();\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to set preferred store');\n }\n });\n }\n}\n\nexport default HeaderPreferredStore;\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, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ILogoProps {\n image: Msdyn365.IImageData;\n gridSettings?: Msdyn365.IGridSettings;\n link?: ILinkData;\n className?: string;\n telemetryContent?: ITelemetryContent;\n requestContext: Msdyn365.IRequestContext;\n typeName?: string;\n}\n\nexport interface ILinkData {\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n openInNewTab?: boolean;\n linkText?: string;\n}\n\n/**\n *\n * Logo component.\n * @extends {React.PureComponent<ILogoConfig>}\n */\nexport class Logo extends React.PureComponent<ILogoProps> {\n private readonly attributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: ILogoProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return <div className={this.props.className}>{this._renderLogo(this.props)}</div>;\n }\n\n private _renderLogo(config: ILogoProps): JSX.Element {\n if (config.link && config.link.linkUrl.destinationUrl) {\n return (\n <a\n href={config.link.linkUrl.destinationUrl}\n aria-label={config.link.ariaLabel}\n target={config.link.openInNewTab ? '_blank' : undefined}\n rel='noopener noreferrer'\n {...this.attributes}\n >\n {this._renderImage(config)}\n </a>\n );\n }\n return this._renderImage(config);\n }\n\n private _renderImage(config: ILogoProps): JSX.Element {\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Msdyn365.Image\n {...config.image}\n requestContext={this.props.requestContext}\n gridSettings={this.props.gridSettings!}\n imageSettings={(config && config.image && config.image.imageSettings) || defaultImageSettings}\n loadFailureBehavior='default'\n editProps={{\n key: config.image || {},\n requestContext: this.props.requestContext,\n moduleType: this.props.typeName,\n imagePropertyName: 'image'\n }}\n shouldSkipToMainImage\n />\n );\n }\n}\n\nexport default Logo;\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 {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderResources } from '../header.props.autogenerated';\n\nexport interface INavIconProps {\n resources: IHeaderResources;\n isExpanded: boolean;\n targetId: string;\n telemetryContent?: ITelemetryContent;\n toggleNavBar(): void;\n}\n\n/**\n *\n * NavIcon component.\n * @extends {React.PureComponent<INavIconProps>}\n */\n\n@observer\nexport class NavIcon extends React.PureComponent<INavIconProps> {\n private readonly attributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: INavIconProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n <Button\n className='ms-header__nav-icon'\n onClick={this.props.toggleNavBar}\n title={this.props.resources.mobileHamburgerAriaLabel}\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\n aria-expanded={this.props.isExpanded}\n aria-controls={this.props.targetId}\n {...this.attributes}\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 { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n KeyCodes,\n Modal,\n ModalBody,\n ModalHeader,\n onTelemetryClick,\n Popover,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\nimport { IHeaderData } from './header.data';\nimport { IHeaderProps, IHeaderResources, IMyAccountLinksData } from './header.props.autogenerated';\n\nexport interface IHeaderState {\n mobileMenuCollapsed: boolean;\n signinPopoverOpen: boolean;\n hasSigninerror?: boolean;\n}\n\nexport interface IHeaderViewProps extends IHeaderProps<IHeaderData>, IHeaderState {\n logo: React.ReactNode;\n wishListIconDesktop: React.ReactNode;\n wishListIconMobile: React.ReactNode;\n cartIcon: React.ReactNode;\n navIcon: React.ReactNode;\n className: string;\n menuBar: React.ReactNode[];\n search: React.ReactNode[];\n siteOptions: React.ReactNode[];\n HeaderTag: IModuleProps;\n HeaderContainer: INodeProps;\n MobileMenuContainer: INodeProps;\n MobileMenuHeader: React.ReactNode;\n MobileMenuBodyContainer: INodeProps;\n MobileMenuLinksContainer: INodeProps;\n HeaderTopBarContainer: INodeProps;\n Divider: INodeProps;\n\n AccountInfoDropdownParentContainer?: INodeProps;\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\n accountInfoDropdownButton?: React.ReactNode;\n\n signOutLink?: React.ReactNode;\n signInLink?: React.ReactNode;\n switchCustomerLink?: React.ReactNode;\n isOBORequest?: boolean;\n accountLinks?: React.ReactNode[];\n preferredStore?: React.ReactNode;\n currentDistributor?: React.ReactNode;\n}\n\n/**\n *\n * Header component.\n * @extends {React.PureComponent<IHeaderProps<IHeaderData>>}\n */\n@observer\nclass Header extends React.PureComponent<IHeaderProps<IHeaderData>, IHeaderState> {\n private readonly popOverRef: React.RefObject<HTMLButtonElement>;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private cart: ICartState | undefined;\n\n private isB2BSite: boolean = false;\n\n /**\n * The signed-in user name displayed in the header bar\n */\n @computed public get displayName(): Readonly<string | undefined> {\n return (\n (MsDyn365.isOboRequest(this.props.context.request) ? this.workerName : this.customerName) ||\n this.props.context.request?.user?.name\n );\n }\n\n /**\n * OBO scenario. The name of worker who shops on behalf of customer.\n */\n @computed public get workerName(): Readonly<string | undefined> {\n const worker = this.props.data.employee?.result;\n return worker?.Name;\n }\n\n @computed public get customerName(): Readonly<string | undefined> {\n const customer = this.props.data.accountInformation?.result;\n if (MsDyn365.isOboRequest(this.props.context.request)) {\n // For OBO scenario, display full customer name because multiple customers may have the same first name.\n return customer ? customer.Name : undefined;\n } else {\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n }\n\n public constructor(props: IHeaderProps<IHeaderData>) {\n super(props);\n this.popOverRef = React.createRef();\n this._toggleNavbar = this._toggleNavbar.bind(this);\n this._togglePopover = this._togglePopover.bind(this);\n this._keydown = this._keydown.bind(this);\n this.state = {\n mobileMenuCollapsed: true,\n signinPopoverOpen: false,\n hasSigninerror: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.isB2BSite = isChannelTypeB2B(this.props.context.request);\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('keydown', this._keydown);\n }\n reaction(\n () => {\n this.props.data.cart.result;\n },\n () => {\n this.cart = this.props.data.cart.result;\n }\n );\n\n const {\n context: {\n request: { user }\n },\n resources: {\n signUpCustomerNotFoundTitle,\n signUpMultipleCustomerFoundTitle,\n signInCustomerNotAuthorizedTitle,\n closeNotificationLabel\n }\n } = this.props;\n\n const signinNotificationError = this._getSigninNotification(\n user,\n signUpMultipleCustomerFoundTitle,\n signUpCustomerNotFoundTitle,\n signInCustomerNotAuthorizedTitle\n );\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\n // For signup show simple error notification.\n NotificationsManager.instance().addNotification(new ErrorNotification(signinNotificationError, closeNotificationLabel));\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('keydown', this._keydown, false);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n data: { accountInformation, wishlists },\n context: {\n request: { user }\n },\n context,\n resources: { cartLabel, cartQtyLabel }\n } = this.props;\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\n const navbarKey = 'header-nav-mobile';\n const customer = accountInformation && accountInformation.result;\n const cartIconSlot = this._getSlot('cartIcon');\n const menuBarSlot = this._getSlot('menuBar');\n const searchSlot = this._getSlot('search');\n let wishlistCount = 0;\n const siteOptionsSlot = this._getSlot('siteOptions');\n const preferredStoreSlot = this._getSlot('storeSelector');\n const currentDistributorSlot = this._getSlot('distributorSelector');\n if (wishlists !== undefined) {\n if (\n !wishlists.result ||\n !ArrayExtensions.hasElements(wishlists.result) ||\n !wishlists.result[0].CommerceListLines ||\n !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)\n ) {\n wishlistCount = 0;\n } else {\n wishlistCount = wishlists.result[0].CommerceListLines.length;\n }\n }\n const viewProps: IHeaderViewProps = {\n ...(this.props as IHeaderProps<IHeaderData>),\n ...this.state,\n logo: (\n <Logo\n {...{\n link: logoLink,\n image: logoImage,\n className: 'ms-header__logo',\n gridSettings: this.props.context.request.gridSettings,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent,\n typeName: this.props.typeName\n }}\n />\n ),\n wishListIconDesktop: (\n <WishListIconComponent\n className='ms-header__wishlist-desktop'\n showButtonTooltip={!disableTooltip}\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{}}\n wishlistCount={wishlistCount}\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\n isDispayWishlistCount={shouldShowWishlistCount}\n />\n ),\n wishListIconMobile: (\n <WishListIconComponent\n className='ms-header__wishlist-mobile'\n showButtonTooltip={!disableTooltip}\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{}}\n wishlistCount={wishlistCount}\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\n isDispayWishlistCount={shouldShowWishlistCount}\n />\n ),\n cartIcon: ArrayExtensions.hasElements(cartIconSlot) ? (\n cartIconSlot[0]\n ) : (\n <CartIconComponent\n cartLabel={cartLabel}\n cartQtyLabel={cartQtyLabel}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{ cart: this.cart }}\n />\n ),\n navIcon: (\n <NavIcon\n {...{\n resources: this.props.resources,\n isExpanded: !this.state.mobileMenuCollapsed,\n targetId: navbarKey,\n toggleNavBar: this._toggleNavbar,\n telemetryContent: this.telemetryContent\n }}\n />\n ),\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\n className: headerClassName,\n HeaderTag: {\n moduleProps: this.props,\n className: classnames(headerClassName),\n 'aria-label': this.props.resources.headerAriaLabel,\n tag: 'header'\n },\n HeaderContainer: {\n className: classnames('ms-header__container')\n },\n HeaderTopBarContainer: {\n className: classnames('ms-header__topbar')\n },\n Divider: {\n className: classnames('ms-header__divider')\n },\n MobileMenuContainer: {\n tag: Modal,\n id: navbarKey,\n className: 'ms-header__mobile-hamburger',\n isOpen: !this.state.mobileMenuCollapsed,\n wrapClassName: 'ms-header__modal',\n toggle: this._toggleNavbar\n },\n MobileMenuHeader: <ModalHeader className='ms-header__mobile-hamburger-menu-header' toggle={this._toggleNavbar} />,\n MobileMenuBodyContainer: {\n tag: ModalBody,\n className: 'ms-header__mobile-hamburger-menu-body'\n },\n MobileMenuLinksContainer: {\n className: 'ms-header__mobile-hamburger-menu-links'\n },\n AccountInfoDropdownParentContainer: {\n className: 'ms-header__account-info'\n },\n AccountInfoDropdownPopoverConentContainer: this.displayName\n ? {\n tag: Popover,\n id: 'myprofilePopover',\n className: 'ms-header__account-info-content',\n placement: 'bottom',\n isOpen: this.state.signinPopoverOpen,\n target: this.popOverRef,\n toggle: this._togglePopover\n }\n : undefined,\n signInLink: this._getSigninButton(user, this.props.resources),\n signOutLink: this._getSignOutButton(user, this.props.resources),\n isOBORequest: MsDyn365.isOboRequest(this.props.context.request),\n switchCustomerLink: this._getSwitchCustomerButton(user, this.props.resources),\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(user, this.props.resources),\n accountLinks: this._getAccountLinks(customer),\n preferredStore: ArrayExtensions.hasElements(preferredStoreSlot) && <HeaderPreferredStore {...this.props} />,\n currentDistributor: this.isB2BSite && ArrayExtensions.hasElements(currentDistributorSlot) ? currentDistributorSlot : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - Link Index.\n * @returns : Void.\n */\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\n if (this.props.config.myAccountLinks?.[linkIndex]) {\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\n }\n };\n\n /**\n * Get the slot.\n * @param slotName - Name of the slot.\n * @returns The slot.\n */\n private _getSlot(slotName: string): React.ReactNode[] | null {\n const { slots } = this.props;\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\n }\n\n /**\n * Renders the sign in button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSigninButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n !this.displayName && (\n <Button\n className='ms-header__signin-button'\n title={resources.signInLinkText}\n href={user?.signInUrl}\n aria-label={resources.signInLinkAriaText}\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\n {...attributes}\n >\n <span className='ms-header__signin-button-text' aria-hidden>\n {resources.signInLinkText}\n </span>\n </Button>\n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSignOutButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n <Button\n className='ms-header__signout-button'\n title={resources.signOutLinkText}\n href={user?.signOutUrl ?? ''}\n aria-label={resources.signOutLinkAriaText}\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\n {...attributes}\n >\n <span className='ms-header__signout-button-text' aria-hidden>\n {resources.signOutLinkText}\n </span>\n </Button>\n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSwitchCustomerButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SwitchCustomer);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const isOBOAccountSelected =\n MsDyn365.isOboRequest(this.props.context.request) && this.props.context.request.cookies.getAccountSelectionCookie();\n return (\n this.displayName &&\n isOBOAccountSelected && (\n <a\n aria-label={resources.switchCustomerLinkAriaText}\n className='ms-signin-info__account-link-button'\n title={resources.switchCustomerLinkText}\n href={this.getBusinessPartnerSelectionUrl()}\n role='link'\n onClick={() => this.props.context.request.cookies.removeAccountSelectionCookie()}\n {...attributes}\n >\n <div className='ms-header__switchcustomer-button-text'>\n <div className='ms-header__shoppingas-text'>{format(resources.shoppingAsText, this.customerName)}</div>\n <div>{resources.switchCustomerLinkText}</div>\n </div>\n </a>\n )\n );\n }\n\n private getBusinessPartnerSelectionUrl(): string | undefined {\n const route = MsDyn365.getUrlSync('businessPartnerSelection', this.props.context.actionContext);\n if (!route || !MsDyn365.msdyn365Commerce.isBrowser) {\n return undefined;\n }\n\n // MsDyn365.getUrlSync persists some params in the route and remove other params.\n // Among the persisted params, we need to remove catalogid.\n const persistedParamToRemove = ['catalogid'];\n const url = new URL(route, window.location.href);\n persistedParamToRemove.forEach(param => url.searchParams.delete(param));\n return url.href;\n }\n\n private _getSigninNotification(\n user: MsDyn365.IRequestContextUser | undefined,\n signUpMultipleCustomerFoundTitle: string,\n signUpCustomerNotFoundTitle: string,\n signInCustomerNotAuthorizedTitle: string\n ): string | undefined {\n if (!user?.retailServerErrorCode) {\n return undefined;\n }\n\n const { signUpCustomerNotFound, signUpMultipleCustomerFound, signInCustomerNotAuthorized } = this.props.config;\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\n const accountAuthorizationError = 'Microsoft_Dynamics_Commerce_Runtime_AuthorizationFailed';\n\n if (user?.retailServerErrorCode === notFoundError) {\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\n } else if (user?.retailServerErrorCode === multipleAccountError) {\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\n } else if (user?.retailServerErrorCode === accountAuthorizationError) {\n return signInCustomerNotAuthorized !== undefined ? signInCustomerNotAuthorized : signInCustomerNotAuthorizedTitle;\n }\n return user?.retailServerErrorMessage;\n }\n\n private _getAccountInfoDropdownButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n <Button\n innerRef={this.popOverRef}\n className='ms-header__profile-button'\n aria-describedby='myprofilePopover'\n onClick={this._togglePopover}\n color='link'\n aria-label={this.displayName}\n aria-expanded={this.state.signinPopoverOpen}\n {...attributes}\n >\n <div className='ms-profile-button-text'>\n <div>{this.displayName}</div>\n {MsDyn365.isOboRequest(this.props.context.request) && this.customerName && (\n <div>{format(resources.shoppingAsText, this.customerName)}</div>\n )}\n </div>\n </Button>\n )\n );\n }\n\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\n const { myAccountLinks } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n if (!this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\n return undefined;\n }\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\n payLoad.contentAction.etext = cta.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: cta.ariaLabel,\n className: 'ms-signin-info__account-link-button',\n linkText: cta.linkText,\n linkUrl: cta.linkUrl.destinationUrl,\n openInNewTab: cta.openInNewTab,\n role: 'link',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={index}\n link={editableLink}\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\n />\n );\n });\n }\n\n private _toggleNavbar(): void {\n this.setState({\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\n });\n }\n\n private _togglePopover(): void {\n this.setState({\n signinPopoverOpen: !this.state.signinPopoverOpen\n });\n }\n\n private _keydown(event: KeyboardEvent): void {\n if (event.keyCode === KeyCodes.Escape) {\n this.setState({ mobileMenuCollapsed: true });\n }\n }\n}\n\nexport default Header;\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 { IHeaderViewProps } from './header';\n\nconst headerView: React.FC<IHeaderViewProps> = props => {\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer,\n Divider\n } = props;\n return (\n <Module {...HeaderTag}>\n <Node {...HeaderContainer}>\n <Node {...HeaderTopBarContainer}>\n {props.navIcon}\n {props.logo}\n {_renderReactFragment(props.search)}\n {props.preferredStore}\n {props.currentDistributor}\n {_renderDesktopAccountBlock(props)}\n {props.wishListIconDesktop}\n <Node {...Divider} />\n {props.cartIcon}\n {_renderReactFragment(props.siteOptions)}\n </Node>\n <Node {...MobileMenuContainer}>\n <Node {...MobileMenuBodyContainer}>\n {props.MobileMenuHeader}\n {_renderReactFragment(props.menuBar)}\n <Node {...MobileMenuLinksContainer}>\n {props.accountLinks ? props.accountLinks.map(link => link) : false}\n {props.siteOptions}\n {props.wishListIconMobile}\n {props.signInLink}\n {props.signOutLink}\n </Node>\n </Node>\n </Node>\n {_renderReactFragment(props.menuBar)}\n </Node>\n </Module>\n );\n};\n\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signOutLink,\n signInLink,\n accountLinks\n } = props;\n\n if (AccountInfoDropdownParentContainer) {\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n <Node {...AccountInfoDropdownParentContainer}>\n {accountInfoDropdownButton}\n <Node {...AccountInfoDropdownPopoverConentContainer}>\n {accountLinks ? accountLinks.map(link => link) : false}\n {signOutLink}\n </Node>\n </Node>\n );\n } else if (signInLink) {\n return <Node {...AccountInfoDropdownParentContainer}>{signInLink}</Node>;\n }\n }\n props.context.telemetry.error('Header content is empty, module wont render.');\n return null;\n}\n\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\n return (\n <>\n {items && items.length > 0\n ? items.map((slot: React.ReactNode, index: number) => {\n return <React.Fragment key={index}>{slot}</React.Fragment>;\n })\n : null}\n </>\n );\n}\n\nexport default headerView;\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, getUrlSync, 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 ProductPriceForSelectedProductsInput,\n validateCatalogId,\n getProductPriceForSelectedProducts\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 productPrices: ProductPrice[];\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 productPrices: this.productPrices || []\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 const discountIds = this.props.config.productCollection.discountIds;\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 productPrices = this.state.productPrices;\n\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(\n item,\n index,\n productPrices ? productPrices.find(p => p.ProductId === item.RecordId) : undefined\n );\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 || discountIds) &&\n shouldDisplaySeeAllButton &&\n (ArrayExtensions.hasElements(updatedProducts) || this.props.config.productCollection.listType === 'promotional')\n ? this._getSeeAllButton(headingLabel, recommendation, discountIds)\n : undefined,\n resources: resources\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 let productPrices = this.state.productPrices;\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 } else if (productCollectionProducts === undefined && ArrayExtensions.hasElements(this.state.products)) {\n products = [];\n this.setState({ products: products });\n }\n\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n\n if (this.props.config.productCollection.listType === 'promotional') {\n productPrices = await getProductPriceForSelectedProducts(\n new ProductPriceForSelectedProductsInput(products.filter(p => !p.IsMasterProduct).map(p => p.RecordId)),\n this.props.context.actionContext\n );\n\n this.setState({ productPrices: productPrices });\n }\n };\n\n private readonly _getProduct = (\n product: ProductSearchResult,\n index: number,\n productPrice?: ProductPrice\n ): 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, productPrice }}\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 headingLabel - Heading label.\n * @param recommendation - Recommendation.\n * @param discountIds - Discount Ids.\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\n */\n private readonly _getSeeAllButton = (headingLabel: string, recommendation?: string, discountIds?: string[]): React.ReactNode => {\n if (!Msdyn365.msdyn365Commerce.isBrowser) {\n return null;\n }\n\n if (!recommendation && !discountIds) {\n return null;\n }\n\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const searchPageLink = getUrlSync('search', this.props.context.actionContext);\n if (!searchPageLink) {\n return null;\n }\n\n const url = new URL(searchPageLink, window.location.href);\n\n if (discountIds) {\n // see all button for promotion page\n url.searchParams.set('discountIds', discountIds.toString());\n url.searchParams.set('title', headingLabel);\n url.searchParams.set('catalogid', `${catalogId}`);\n } else if (recommendation) {\n // See all button for recommendation\n url.searchParams.set('recommendation', recommendation);\n url.searchParams.set('title', headingLabel);\n url.searchParams.set('catalogid', `${catalogId}`);\n }\n\n return (\n <Button\n className='ms-product-collection__see-all-btn msc-cta__primary'\n title={this.props.resources.seeAllButtonText}\n href={url.href}\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';\nimport { IProductCollectionResources } from './product-collection.props.autogenerated';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const {\n heading,\n ProductCollectionContainer,\n products,\n SingleSlideCarouselComponentProps,\n GridComponentProps,\n isCarousel,\n seeAllButton,\n resources\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\n // If no products are retrieved and the list type is promotional, still render the module to keep the entry of promotion page\n if (props.config.productCollection.listType === 'promotional') {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {seeAllButton}\n {_renderNoProduct(resources)}\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 _renderNoProduct = (resources: IProductCollectionResources): JSX.Element => {\n return (\n <Node className={''}>\n <p>{resources.noProductToRenderText}</p>\n </Node>\n );\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 { 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(\n props.data.product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\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 {\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} 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 initializedDimensions: Set<string> = new Set();\n\n private readonly cssClassNameConfigure: string = 'ms-quick-order__content-form-main';\n\n // @ts-expect-error -- Existing code.\n private cancellableDebounce: debounce;\n\n private readonly quickOrderCallbacks: IProductDimensionCallbacks = {\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this.initializedDimensions.add(initializedDimension);\n }\n },\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 // Only trigger _updateDimensions when all dimensions are initialized\n if (this.initializedDimensions.size === this.state.productDimensions?.length) {\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 /**\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.cancellableDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this.cancellableDebounce.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.cancellableDebounce = 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.cancellableDebounce();\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 // eslint-disable-next-line complexity\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 const isValidCart = productResponse && (await this._validateCart(productResponse, quantity));\n if (isValidCart && cart.result && productResponse !== undefined) {\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 if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailability();\n }\n const shouldValidateQuantityLimits: boolean = this._shouldValidateQuantityLimits();\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: shouldValidateQuantityLimits },\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' && shouldValidateQuantityLimits) {\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 readonly _shouldValidateQuantityLimits = (): boolean => {\n const featureStatuses = this.props.data.featureState.result;\n const isECommerceQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n if (isECommerceQuantityLimitsFeatureEnabledInHq) {\n return true;\n }\n\n const isOrderQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')\n ?.IsEnabled || false;\n\n if (!isOrderQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\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 return isOrderQuantityLimitsFeatureEnabledInSiteSettings ?? false;\n } else {\n const cartConfiguration = this.props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\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 = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n const addedQuantity =\n cart.result?.cart.CartLines?.find(\n item => item.ItemId?.toString() === this.state.productText && item.ProductId === this.state.productResponse?.RecordId\n )?.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(addedQuantity.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 availability.\n */\n private readonly _updateAvailability = 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 let productAvailable: IProductInventoryInformation | undefined;\n await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(productResponse.RecordId, channelId),\n actionContext\n ).then(result => {\n if (ArrayExtensions.hasElements(result)) {\n productAvailable = result.find(quantity => quantity.ProductAvailableQuantity.ProductId === productResponse.RecordId);\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n this.setState({ productAvailableQuantity: productAvailable });\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 private readonly _updateProductAvailability = async (): Promise<void> => {\n if (this.state.productAvailableQuantity === undefined) {\n await this._updateAvailability();\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 = async (productResponse: SimpleProduct, quantity: number): Promise<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\n // If stock check false no need to check the availability.\n const { context } = this.props;\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n await this._updateProductAvailability();\n const { productAvailableQuantity } = this.state;\n const availableQuantity = productAvailableQuantity ? productAvailableQuantity.ProductAvailableQuantity.AvailableQuantity : 0;\n if (availableQuantity === undefined || availableQuantity <= 0) {\n this.setState({\n stateMessage: {\n messageText: this.props.resources.quickOrderOutofStockErrorMsg,\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, IQuickOrderViewProps } from './index';\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 quickOrderProps,\n contentProps,\n form,\n quickOrderForm,\n drawer,\n configure,\n quickOrderFormProductContent,\n quickOrderFormMsgContent,\n quickOrderList,\n isMobileView\n } = props;\n\n return (\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 );\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 { 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 { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\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\nexport interface IRefineItemData {\n sourceValue?: number;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n refinerItemId: number;\n dataTypeValue?: number;\n name: string;\n label: string;\n count?: number;\n isChecked: boolean;\n refineItemUrl?: string;\n minValue?: string;\n maxValue?: string;\n dimensionType?: DimensionTypes;\n rowNumber?: number;\n unitText?: string;\n updatedSliderMaxValue?: string;\n updatedSliderMinValue?: string;\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 dataTypeValue === AttributeDataType.Currency || dataTypeValue === AttributeDataType.Decimal;\n}\n\n/**\n * Checks if the data type value corresponds to a range type integer.\n * @param dataTypeValue\n */\nexport function isRangeTypeForInteger(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Checks if the data type value corresponds to a custom input box Range.\n * @param dataTypeValue\n */\nexport function isCustomRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy\n): boolean {\n return (\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion?.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n );\n}\n\n/**\n * Checks if the selectedRefinementCriterion is siingle type with API va;ues or custom type.\n * If custom type then RowNumber is null\n * @param dataTypeValue\n */\nexport function isSingleSelectRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n productRefinerValue: ProductRefinerValue\n): boolean {\n return (\n productRefinerValue.LeftValueBoundString === selectedRefinementCriterion?.LeftValueBoundString &&\n productRefinerValue.RightValueBoundString === selectedRefinementCriterion?.RightValueBoundString &&\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion !== undefined\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(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue,\n parent?: IProductRefinerHierarchy\n): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n // Distinguish by displaytype also\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n ((parent?.DisplayTemplateValue === DisplayTemplate.Range\n ? isRangeType(refinementCriterion.DataTypeValue)\n : isRangeTypeForInteger(refinementCriterion.DataTypeValue)) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getIntegerRangeName(productRefinerValue: ProductRefinerValue): string {\n let rangeValue = '';\n\n if (productRefinerValue.LeftValueBoundString === '' && productRefinerValue.RightValueBoundString !== '') {\n rangeValue = `< ${productRefinerValue.RightValueBoundLocalizedString || productRefinerValue.RightValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString === '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `> ${productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString !== '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `${productRefinerValue.LeftValueBoundLocalizedString ||\n productRefinerValue.LeftValueBoundString} - ${productRefinerValue.RightValueBoundString ||\n productRefinerValue.RightValueBoundString}`;\n }\n return rangeValue;\n}\n\n/**\n * Get input without formatting.\n * @param input - Input string.\n * @returns - Returns number.\n */\nexport function getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNumber = Number(input);\n if (!Number.isNaN(inputAsNumber)) {\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 = formattedPriceReverseLookup.get(input);\n // return reverseLookupResult || input;\n return input;\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n\n // Keeping only itemToggled value for integer-range type in currentRefinementCriteria\n if (\n itemToggleNotification.parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n itemToggleNotification.parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n currentRefinementCriteria = currentRefinementCriteria.filter(r => {\n return r.RefinerRecordId !== itemToggleNotification.productRefinerValue.RefinerRecordId;\n });\n }\n\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (\n isMatchingRefinementCriterion(\n itemToggleNotification.productRefinerValue,\n selectedCriterion,\n itemToggleNotification.parentProductRefinerHierarchy\n )\n ) {\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, itemToggleNotification.parentProductRefinerHierarchy)\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 { AttributeDataType, DisplayTemplate, 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 { getIntegerRangeName, isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n rangeDisplayType?: number | undefined;\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, index) => {\n const rangeParentDisplay = refinerHierarchy.filter(p => p.RecordId === selectedRefiner.RefinerRecordId);\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner,\n // parameter to store Display Template type\n rangeDisplayType: rangeParentDisplay[0]?.DisplayTemplateValue || undefined\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 // Get range value for Range display and integer type only (not for Integer with TextBox(4) display)\n const rangeInteger =\n item.value.DataTypeValue === AttributeDataType.Integer &&\n item.rangeDisplayType &&\n item.rangeDisplayType === DisplayTemplate.Range &&\n item.value.RefinerRecordId !== 0;\n const newIntRange = rangeInteger\n ? item.key\n : item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString || item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString;\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 {newIntRange}\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, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n let parent: IProductRefinerHierarchy | undefined;\n if (refinerHierarchy && refinerHierarchy.find) {\n 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(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\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 // Adding integer range format\n if (\n productRefinerValue.DataTypeValue === AttributeDataType.Integer &&\n parent?.DisplayTemplateValue === DisplayTemplate.Range &&\n productRefinerValue.RefinerRecordId !== 0\n ) {\n refinerValueName = getIntegerRangeName(productRefinerValue);\n return refinerValueName;\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\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(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\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 {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} 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';\nimport { getIntegerRangeName, isSingleSelectRangeTypeIntegerSelected } from './utilities';\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 if (\n parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n const rangeValue = getIntegerRangeName(productRefinerValue);\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={\n isSingleSelectRangeTypeIntegerSelected(selectedRefinementCriterion!, productRefinerValue)\n ? `ms-refine-submenu-item ${itemTypeClassName}-selected`\n : `ms-refine-submenu-item ${itemTypeClassName}-range`\n }\n role='radio'\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {rangeValue}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n } else {\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\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 { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isUndefined } from 'lodash';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { IRefineItemState } from './refine-item';\nimport { isCustomRangeTypeIntegerSelected } from './utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\nexport type RangeRefineItemInputType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemInputProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n rangeType: RangeRefineItemInputType;\n\n /**\n * The telemetry content\n */\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemInputState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n invalidData: boolean | undefined;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItemInput extends React.Component<IRangeRefineItemInputProps, IRangeRefineItemInputState> {\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 public constructor(props: IRangeRefineItemInputProps) {\n super(props);\n this._changeMinInputRange = this._changeMinInputRange.bind(this);\n this._changeMaxInputRange = this._changeMaxInputRange.bind(this);\n this._applyCustom = this._applyCustom.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n let initialMin = '';\n let initialMax = '';\n const { selectedRefinementCriterion, parentProductRefinerHierarchy } = this.props;\n if (selectedRefinementCriterion) {\n initialMin = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.LeftValueBoundString || '';\n initialMax = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.RightValueBoundString || '';\n }\n\n this.state = {\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n invalidData: !(initialMin && initialMax),\n isChecked: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemInputProps, nextState: IRangeRefineItemInputState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n nextState.invalidData = !(nextState.selectedMin && nextState.selectedMax);\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemInputProps): void {\n if (previousProps !== this.props) {\n this.updateInputRangerProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n return undefined;\n }\n\n // /**\n // * Function to update slider props.\n // */\n private updateInputRangerProps(): void {\n const selectedMin = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.LeftValueBoundString;\n const selectedMax = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.RightValueBoundString;\n this.setState({ selectedMin, selectedMax });\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { 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 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 return (\n <li className='ms-refine-submenu-item list-group-item refine-submenu__item--range--custom'>\n <form className={`ms-refine-submenu__input-range-refiner`} {...formAttrs}>\n <div>\n <input\n className={minInputClassName}\n placeholder={'Min'}\n onChange={this._changeMinInputRange}\n value={this.state.selectedMin}\n ref={this.minInput}\n />\n <span>{' - '}</span>\n <input\n className={maxInputClassName}\n placeholder={'Max'}\n onChange={this._changeMaxInputRange}\n value={this.state.selectedMax}\n ref={this.maxInput}\n />\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 </div>\n <div>\n <Button title={'Apply'} className='applyBtn' onClick={this._applyCustom} disabled={this.state.invalidData}>\n {'Apply'}\n </Button>\n </div>\n </form>\n </li>\n );\n }\n\n private _applyCustom(event: React.MouseEvent<HTMLElement>): void {\n const selectedMinValue = this._getInputWithoutFormatting(this.state.selectedMin || '');\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy } = this.props;\n const max = this.state.selectedMax;\n\n const maxNum = max ? Number(max) : undefined;\n const productRefinerValue: ProductRefinerValue = {\n RefinerRecordId: parentProductRefinerHierarchy.Values[0].RefinerRecordId,\n LeftValueBoundString: this.state.selectedMin,\n RightValueBoundString: this.state.selectedMax,\n DataTypeValue: parentProductRefinerHierarchy.DataTypeValue,\n RefinerSourceValue: parentProductRefinerHierarchy.Values[0].RefinerSourceValue\n };\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true\n });\n }\n }\n\n private _changeMinInputRange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({\n selectedMin: event.target.value.trim()\n });\n }\n\n private _changeMaxInputRange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({\n selectedMax: event.target.value.trim()\n });\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 _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","/*!\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 {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} 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, isRangeTypeForInteger } from './utilities';\nimport RangeRefineItemInput from './range-refine-item-input';\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 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 (\n productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n // Check if is of integer range type\n if (isRangeTypeForInteger(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 let selectedRefinementCriterion: ProductRefinerValue | 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 selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\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 {productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range && (\n <RangeRefineItemInput\n parentProductRefinerHierarchy={productRefinerHierarchy}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n isDisabled={isDisabled}\n rangeType={'input'}\n key={productRefinerHierarchy.KeyName}\n />\n )}\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 {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput,\n ObjectExtensions\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 { action, 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 productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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 channelInventoryConfiguration?: ChannelInventoryConfiguration;\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 private _isMounted: 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 channelInventoryConfiguration: undefined\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 this._isMounted = true;\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 const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\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 channelInventoryConfiguration\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 await this._updateVariantAvailability();\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 channelInventoryConfiguration\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 await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\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 productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): 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 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 /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n @action\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?.skip &&\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 = !ObjectExtensions.isNullOrUndefined(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 const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.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={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\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"],"names":["HeaderPreferredStore","React","constructor","modalCloseButtonRef","handleClick","this","_findPreferredStoreOnClick","props","render","data","storeSelectorStateManager","result","slots","resources","ArrayExtensions","storeSelector","storeName","preferredStore","StoreName","headerPreferredStoreText","className","color","headerPreferredStoreAriaLabel","onClick","ref","modules","storeSelectorId","Object","keys","length","id","openDialog","showMapViewLink","parentElementRef","onLocationSelected","orgUnitLocation","Promise","resolve","catch","error","telemetry","message","debug","observer","Logo","super","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","attributes","getTelemetryAttributes","_renderLogo","config","link","linkUrl","destinationUrl","href","ariaLabel","target","openInNewTab","undefined","rel","_renderImage","Msdyn365","image","requestContext","gridSettings","imageSettings","viewports","xs","q","w","h","lg","lazyload","loadFailureBehavior","editProps","key","moduleType","typeName","imagePropertyName","shouldSkipToMainImage","NavIcon","Button","toggleNavBar","title","mobileHamburgerAriaLabel","isExpanded","targetId","Header","handleLinkTextChange","linkIndex","event","myAccountLinks","linkText","value","popOverRef","_toggleNavbar","bind","_togglePopover","_keydown","state","mobileMenuCollapsed","signinPopoverOpen","hasSigninerror","getTelemetryObject","context","request","telemetryPageName","friendlyName","customer","accountInformation","FirstName","Name","componentDidMount","MsDyn365","window","addEventListener","reaction","cart","user","signUpCustomerNotFoundTitle","signUpMultipleCustomerFoundTitle","closeNotificationLabel","signinNotificationError","_getSigninNotification","NotificationsManager","addNotification","ErrorNotification","componentWillUnmount","removeEventListener","wishlists","cartLabel","cartQtyLabel","logoLink","logoImage","shouldShowWishlistCount","disableTooltip","app","headerToggleClass","headerClassName","classnames","navbarKey","cartIconSlot","_getSlot","menuBarSlot","searchSlot","catalogSearchSlot","wishlistCount","siteOptionsSlot","preferredStoreSlot","CommerceListLines","viewProps","logo","wishListIconDesktop","WishListIconComponent","showButtonTooltip","wishlistTooltipText","wishlistCountLabel","isDispayWishlistCount","wishListIconMobile","cartIcon","CartIconComponent","navIcon","menuBar","search","catalogSearch","siteOptions","HeaderTag","moduleProps","tag","HeaderContainer","HeaderTopBarContainer","Divider","MobileMenuContainer","Modal","isOpen","wrapClassName","toggle","MobileMenuHeader","ModalHeader","MobileMenuBodyContainer","ModalBody","MobileMenuLinksContainer","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","displayName","Popover","placement","signInLink","_getSigninButton","signOutLink","_getSignOutButton","accountInfoDropdownButton","_getAccountInfoDropdownButton","accountLinks","_getAccountLinks","renderView","slotName","signInLinkText","signInUrl","signInLinkAriaText","onTelemetryClick","signOutLinkText","signOutUrl","signOutLinkAriaText","signUpCustomerNotFound","signUpMultipleCustomerFound","retailServerErrorCode","innerRef","map","cta","index","contentAction","etext","editableLink","role","additionalProperties","onTextChange","setState","keyCode","KeyCodes","__decorate","computed","renderCustomerName","_renderReactFragment","items","slot","TopHeaderContainer","contactURL","actionContext","sitePath","Module","Node","customerServicePhone","renderForMobile","accountClassName","_renderAccountBlock","Collapse","Drawer","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","_renderMobileAccountBlock","_renderCollapseMenu","layout","HeadingTag","ProductCollection","handleHeadingChange","heading","text","_getProductsDimensionsAvailabilities","async","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","products","includes","DimensionTypes","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","initProductState","productCollectionProducts","productCollection","_getProduct","product","isList","trace","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","quickviewSlot","quickview","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","Number","TotalRatings","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","isPriceMinMaxEnabled","featureState","find","priceResources","priceRangeSeparator","ProductContainer","productComponent","TebuProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","quickViewButton","inventoryLabel","IsEnabled","hidePrice","checkHidePrice","ProductComponent","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RecordId","_getActivePrice","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","recommendation","headingLabel","seeAllLink","getCatalogId","seeAllButtonText","productPrices","enableAffiliationBasedPricing","isAuthenticated","shouldDisplaySeeAllButton","recommendationListId","list","isCarousel","carousel","headingComponent","onEdit","updatedProducts","item","getProductData","ObjectExtensions","productCollectionViewProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperPrevious","flipperNextLabel","flipperNext","parentId","ProductCollectionContainer","GridComponentProps","ListComponentProps","filter","seeAllButton","AttributeValues","erpMarketStatusAttribute","attribute","TextValue","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","_renderList","listContainer","ChoiceSummary","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","currentTarget","clearAll","getAttribute","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","_getKeyForRefinerValue","clearAllText","label","classNames","choiceAriaLabel","selectedRefinersMap","clearAllAttributes","listItemProps","urlBuilder","productRefinerValue","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","Values","isMatchingRefinementCriterion","KeyName","warning","isRangeType","DataTypeValue","replace","_formatPrice","LeftValueBoundString","UnitText","RightValueBoundString","LeftValueBoundLocalizedString","amount","currency","cultureFormatter","formatCurrency","selected","textContent","trim","ErrorMessage","FeatureSearchResultItem","productName","productRecordId","productUrl","getProductPageUrlSync","getFallbackImageUrl","ItemId","apiSettings","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","imageUrl","altText","fallbackImage","renderProductPlacementImage","PrimaryImageUrl","Link","ModalToggle","SearchResultModal","modal","modalNode","modalHeader","modalHeaderNode","modalFooter","modalFooterNode","modalBody","autoFocus","applicationNode","returnFocusRef","returnRef","onModalToggle","zIndex","modalTitle","ModalFooter","modalCloseButtonText","getInventoryLabel","channelInventoryConfigurationId","inventoryAttribute","ProductSearchResultItems","moduleId","Separator","separator","Title","showStrikethroughPricing","originalPrice","getOriginalPrice","price","CustomerContextualPrice","Math","max","BasePrice","TradeAgreementPrice","AdjustedPrice","shouldUseFreePriceText","enableMarketingForm","productEnquiryLink","itemProp","renderCurrentPrice","initialPrice","maxVariantPrice","MaxVariantPrice","minVariantPrice","MinVariantPrice","renderCurrentPriceWithOriginalPrice","savingsText","TebuPriceModel3Component","msdyn365Commerce","component","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","pathname","getDefaultColorSwatchSelected","productData","colorAttribute","attributeValue","toLocaleLowerCase","defaultSwatch","Swatches","IsDefault","productImageUrlFromSwatch","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","useState","productImageUrl","setProductImageUrl","updatePageAndImageUrl","swatchItem","dimensionType","StringExtensions","productPageUrlWithSwatch","newUrl","searchParams","delete","swatchProductImageUrl","productImageUrls","newImageUrl","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","getRatingAriaLabel","rating","ratingAriaLabelText","roundedRating","toFixed","format","getReviewAriaLabel","reviewCount","ratingCountAriaLabelText","renderLabel","name","reviewCountArialableText","appendResource","type","hrefOrSrc","srcOrHref","document","querySelector","isResourceAlreadyAdded","element","createElement","head","appendChild","src","getScriptBySrc","recordId","catalogNumberFormatted","isJQueryLoaded","jQuery","scriptJQueryExisting","scriptJQueryNew","loadAfterJQuery","inlineScript","innerHTML","body","appendOtherScripts","script2","inlineBioz","createInlineBiozScript","forEach","resource","contains","removeChild","cleanupResources","Boolean","catalogNumber","Price","AverageRating","productCardimageSettings","fallbackImageUrl","imageProps","cropFocalRegion","attributeValues","externalItemIdAttribute","getErpExternalItemId","renderErpExternalItemId","getErpSize","renderErpSize","dimensionTypeValue","shouldDisplayDimension","swatches","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","some","swatch","ProductComponentSwatchComponent","onSelectDimension","moduleTypeName","basePrice","adjustedPrice","savingsPriceResourceText","freePriceResourceText","originalPriceResourceText","currentPriceResourceText","renderPrice","unitOfMeasure","DefaultUnitOfMeasure","description","Description","hideRating","avgRating","totalRatings","numberRatings","RatingComponent","ratingCount","readOnly","renderRating","inventoryAvailabilityLabel","selectedProductId","renderQuickView","RangeRefineItem","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","parentProductRefinerHierarchy","RefinerRecordId","minValue","maxValue","labels","sliderKeyString","sliderThumbs","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","isSelecting","rangeStart","rangeEnd","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","input","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","getElementById","tooltip","RefineItem","anchorType","children","attrs","JSON","stringify","isSingleSelect","RefinerTypeValue","RefinerType","itemTypeClassName","SourceValue","ProductRefinerSource","_renderRating","_getRefinerUrl","tabIndex","_renderSwatch","Count","hasColor","hasImage","swatchItems","checkIfShouldDisplayAsSwatch","SwatchComponent","isSelectionEnabled","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","hideCount","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","child","findMatchingRefinementCriterion","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","itemToggleNotification","onUpdateRefiners","prevState","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","dataTypeValue","AttributeDataType","refinementCriteria","refinementCriterion","RefinerSourceValue","getUpdatedRefinementCriteria","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","next","push","matchingIndex","findIndex","criterion","splice","expandRefinersCount","SearchResultContainer","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","expandrefinerCount","defaultPageNumber","listPageState","activeProducts","productRecIds","prod","projectDomain","ChannelId","channelId","CatalogId","catalogId","getCartFromCustomer","affliations","AffiliationLines","getActivePricesAsync","callerContext","queryResultSettings","Date","then","activePricesResponse","activePrice","ProductId","exception","Error","_getSearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","category","SearchResultContainer_1","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","dropdwonOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","nextText","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","sortedValidRefiners","sort","a","b","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","quickviewslot","isPriceMinMaxFeatureState","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","none","all","one","two","three","four","paginationPreviousText","paginationNextText","_viewport","device","Type","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","hydrateRefinersFromUrl","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","productId","Recommendation","includeAttributes","getCollectionProducts","productResults","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","Text","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","isMobile","errorMessage","FeatureSearchContainer","similarLookProduct","_getViewport","innerWidth","sm","md","observable","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","renderTetiere","img_tetiere","class_tetiere","alt","width","height","AddToCartComponentActions","_event","setUploadStatus","openModal","setLinesAddedToCartDialogOpen","setAddedLinesCount","addOrderTemplateToCartInput","AddOrderTemplateToCartInput","orderTemplate","productList","Id","addOrderTemplateToCartAction","buttonEventReference","ModalWarning","warningAccepted","accept","onWarningChecked","modalWarningBtn","warningClose","onWarningSubmit","fade","horizontalPosition","verticalPosition","modalWarningResources","modalWarningHeader","modalWarningMessage","checked","modalWarningCancel","disabled","modalWarningOK","ModalWarningFromLineAction","productFromLineAction","quantityFromLineAction","itemKeyFromLineAction","productSpecificationFromLineAction","AddOrderTemplateToCartComponent","uploadStatus","modalOpen","setModalOpen","addedLinesCount","linesAddedToCartDialogOpen","modalWarningOpen","setModalWarningOpen","modalText","status","dialogStrings","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","_getModalText","processStatusClass","closeWindowButtonText","addOrderTemplateAttribute","popupProps","renderModalPopup","PopupProducts","orderTemplateLines","line","fullProduct","totalLines","addToCartText","LinesAddedToCartDialog","linesAddedToCartDialogResources","linesCount","onClose","buttonLabel","PriceComponent","BulkPurchase","_errorCssClass","_errorCssGlyphClass","collapseRef","_dimensionDropDownChange","reEvaluateHeight","_onErrorMessage","stateMessage","messageText","statusCssString","messageGlyph","_toggleCollapse","hasDimensionsInProps","productDimensions","hasDimensionsInData","container","content","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","isMobileDevice","variant","VariantType","userMessageNode","Alert","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","isMultipleCatalogsFeatureEnabled","validateCatalogId","ProductDimensionsMatrix","dimensions","orderTemplates","customerInformation","dimensionOnChange","onErrorMessage","isMultipleCatalogFeatureEnabledInHq","BulkPurchaseViewComponent","CarouselModule","_handleDismissCarousel","cookies","set","dismissCarousel","_next","nextIndex","activeIndex","animating","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","closeAnimation","previous","onIndicatorsClickHandler","handleDismissCarousel","handleOnExited","handleOnExiting","retrieveItems","renderModuleAttributes","Carousel","pause","pauseOnHover","ride","autoplay","interval","transitionType","hideFlipper","dismissEnabled","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","directionTextNext","keyboard","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","cartState","appliedPromo","addPromoCode","promoCode","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_onSubmitHandler","_applyPromotionHandler","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","onSubmit","_removePromotion","code","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","CartLines","discountAmount","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","removePromotionHandler","promoCodTotalDiscount","reduce","coupon","Code","appliedPromoCodeHeadingText","removePromoAriaLabelFormat","removePromoText","isCollapseOpen","promoCodeHeadingText","isB2BSite","isChannelTypeB2B","workerName","customerName","worker","employee","signInCustomerNotAuthorizedTitle","currentDistributorSlot","headerAriaLabel","isOBORequest","switchCustomerLink","_getSwitchCustomerButton","currentDistributor","isOBOAccountSelected","getAccountSelectionCookie","switchCustomerLinkAriaText","switchCustomerLinkText","getBusinessPartnerSelectionUrl","removeAccountSelectionCookie","shoppingAsText","route","location","param","signInCustomerNotAuthorized","retailServerErrorMessage","_renderDesktopAccountBlock","listType","getProductPriceForSelectedProducts","ProductPriceForSelectedProductsInput","p","IsMasterProduct","productPrice","discountIds","searchPageLink","getUrlSync","_renderNoProduct","noProductToRenderText","QuickOrderDrawer","_toggle","isManuallyToggled","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","drawerCloseGlyph","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","maxQuantity","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","pattern","maxLength","quantity","addToCartBtn","userMessage","QuickOrderProduct","cartLine","simpleProduct","isSelected","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","defaultImageSettings","QuickOrderTableRowProductImageComponent","OmniChannelMedia","containerClassName","Image","fallBackSrc","QuickOrderExtraActionsPopupComponent","QuickOrderDesktopTableRowCellComponent","Dimensions","dimension","DimensionValue","Value","dimensionValue","join","quickOrderProductDimensionsSeparator","UnitOfMeasureSymbol","IncrementalQuantity","LineId","currentCount","Quantity","inputQuantityAriaLabel","quickOrderInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","isGiftCard","IsGiftCard","TotalAmount","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","isMobileView","quickOrderProducts","updateViewport","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","initializedDimensions","Set","cssClassNameConfigure","quickOrderCallbacks","initializeDimension","initializedDimension","add","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","size","enqueue","_updateDimensions","FinitePromiseQueueError","getDropdownName","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","productText","productResponse","inputQuantityText","quantityInput","HTMLInputElement","cancellableDebounce","cancel","isQuickOrderFormExpanded","getScanResult","GetScanResultInput","results","Product","ProductDimensionFull","_addItemToCart","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","_validateCart","deliveryOptions","getDeliveryOptionsAsync","QueryResultSettingsProxy","emailDeliveryModeCode","channel","EmailDeliveryModeCode","defaultDeliveryOption","DeliveryOptions","productAvailableQuantity","_updateAvailability","shouldValidateQuantityLimits","_shouldValidateQuantityLimits","addProductToCartInput","enableStockCheck","availableQuantity","ProductAvailableQuantity","AvailableQuantity","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","deliveryMode","addProductToCart","inputProductText","maxQtyLimitReachedMessage","_getMaxQtyMessage","errorDetails","LocalizedMessage","featureStatuses","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","cartConfiguration","IgnoreOrderSettings","_getConcatenatedMaxQtyMessage","currentQuantity","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","currentValue","inputElement","setAttribute","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeAmount","productDimensionTypeStyle","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","configureErrors","errorState","mappedDimensions","DimensionTypeValue","ExtensionProperties","selectedProduct","reject","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","_getDimensionErrorString","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","_updateProductAvailability","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","quickOrderOutofStockErrorMsg","viewport","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","form","configure","getProductConfigure","_initQuickOrderProducts","tableClassName","productInventoryInfo","maxQuantityForLineItem","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","addedQuantity","minInventory","renderConfigure","containerProps","dropdowns","renderConfigureDropdown","dropdown","labelContainerProps","errors","select","quickOrderProductContent","quickOrderMsgContent","renderForm","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","Intl","NumberFormat","style","barItemAriaLabel","starLabel","bar","Progress","buttonProps","AverageRatingNumber","summary","averageRating","TotalReviews","RatingsHistogram","selectFilterBy","completeClass","classname","callbacks","histogramItems","averageRatingAriaLabel","averageNumber","totalReviews","ratingsSummaryProps","histogramProps","filterKey","update","createRatingsReviewsStateInput","histogramItem","isRangeTypeForInteger","isCustomRangeTypeIntegerSelected","RowNumber","isSingleSelectRangeTypeIntegerSelected","getIntegerRangeName","rangeValue","RightValueBoundLocalizedString","r","productListInventoryDisplay","ProductListInventoryFilteringOptions","choice","rangeParentDisplay","rangeDisplayType","closeAriaLabel","newIntRange","refinerValues","filterValue","img","swatchItemAriaLabel","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","productCount","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasContentSwatch","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","defaultChkProductCount","productCountAriaLabelValue","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","invalidData","updateInputRangerProps","isListPageStateUpdated","_isMounted","_updateVariantAvailability","_updateListPageState","_getAllSortByOptions","_shouldHideFromRefiners","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","_getSortCriteriaColumn","queryColumns","mappedSearchConfiguration","StoreOperationsDataActions","newListPageState","action"],"sourceRoot":""}