{"version":3,"file":"static/js/15.57394e7653bf378fa6e4.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/active-image-utilities/active-product.tsx?69b2","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://Msdyn365.Commerce.Online/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.tsx?00d3","webpack://Msdyn365.Commerce.Online/./src/modules/active-image/active-image.view.tsx?a935","webpack://Msdyn365.Commerce.Online/./src/modules/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/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","webpack://Msdyn365.Commerce.Online/./src/search-state.ts?dd10","webpack://Msdyn365.Commerce.Online/./src/modules/search/actions/get-auto-suggest-suggestions.ts?4735","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.categorysuggest.tsx?c65d","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.form.tsx?25a5","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.keywordsuggest.tsx?297c","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.label.tsx?0c17","webpack://Msdyn365.Commerce.Online/./src/modules/search/components/search.productsuggest.tsx?2af9","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.tsx?72fb","webpack://Msdyn365.Commerce.Online/./src/modules/search/search.view.tsx?1505"],"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 { PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport {\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * IActiveProductProps interface.\n */\nexport interface IActiveProductProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n}\n\n/**\n * IActiveProduct interface.\n */\nexport interface IActiveProduct extends IComponent<IActiveProductProps> {}\n\n/**\n * RenderDescription function.\n * @param description - Product description string.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-active-image-product__text'>{description}</p>;\n}\n\n/**\n * GetRatingAriaLabel function.\n * @param rating - Product rating number.\n * @param ratingAriaLabel - Product rating aria label.\n * @returns - Returns string.\n */\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n const numberTwo: number = 2;\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(numberTwo);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\n/**\n * RenderRating function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param ratingId - The rating id.\n * @param avgRating - The average rating.\n * @param totalRatings - The total ratings.\n * @param ariaLabel - The rating aria label.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderRating(\n context: ICoreContext,\n typeName: string,\n ratingId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() ?? undefined;\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\n\n return (\n <RatingComponent\n context={context}\n id={ratingId}\n typeName={typeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabel}\n data={{}}\n />\n );\n}\n\n/**\n * RenderPrice function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param productId - The product id.\n * @param basePrice - The base price of the product.\n * @param adjustedPrice - The adjusted price of the product.\n * @param savingsText - The savings text of the product.\n * @param freePriceText - The free price text.\n * @param originalPriceText - The original price text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n productId: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={productId}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n />\n );\n}\n\n/**\n * RenderProductPlacementImage function.\n * @param requestContext - RequestContext.\n * @param imageSettings - The product image settings.\n * @param gridSettings - The viewport gird settings.\n * @param imageUrl - The product image url.\n * @param altText - The product image alt text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderProductPlacementImage(\n requestContext: IRequestContext,\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const imgData: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return <Image {...imgData} {...imageProps} requestContext={requestContext} loadFailureBehavior='empty' />;\n}\n\n/**\n * ActiveProduct constant.\n * @param props - The active product props.\n * @param props.data - The product search result data.\n * @param props.context - The core context.\n * @param props.imageSettings - The prodcut image settings.\n * @param props.savingsText - The product savings text.\n * @param props.freePriceText - The free price text.\n * @param props.originalPriceText - The original price text.\n * @param props.ratingAriaLabel - The product rating aria label.\n * @param props.typeName - The type name of the module.\n * @param props.id - The id of the product.\n * @returns - Returns JSX.Element | null.\n */\nexport const ActiveProductComponent: React.FC<IActiveProductProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n ratingAriaLabel,\n typeName,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\n id\n}) => {\n const product = data.product;\n if (!product) {\n return null;\n }\n\n return (\n <>\n <div className='msc-active-image-product'>\n <div className='msc-active-image-product__image'>\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n </div>\n <div className='msc-active-image-product__details'>\n <h4 className='msc-active-image-product__title'>{product.Name}</h4>\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\n {renderDescription(product.Description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n </div>\n </div>\n </>\n );\n};\n\nexport default ActiveProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * ILinksData: Interface for\n * Additional content.\n */\ninterface ILinksData {\n linkText?: string;\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n isOpenInNewTab?: boolean;\n}\n\n/**\n * IAdditionalContentData: Interface for\n * Active content.\n */\ninterface IAdditionalContentData {\n heading?: string;\n subtext?: string;\n links?: ILinksData[];\n}\n\n/**\n * IActiveImageAdditionalContentProps: Interface for\n * Active Image Additional Content Component props.\n */\nexport interface IActiveImageAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IActiveImageAdditionalContentViewProps: Interface for\n * Active Image Additional Content view props.\n */\nexport interface IActiveImageAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Active Image Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='msc-active-image__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Active Image Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='msc-active-image__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Active Image Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IActiveImageAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'msc-active-image__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.isOpenInNewTab,\n role: 'button'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Active Image additonal content item props.\n * @param props - Active Image Additional content component props.\n * @returns IActiveImageAdditionalContentItemViewProps.\n */\nconst assembleNode = (item: IAdditionalContentData, props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\n };\n};\n\n/**\n * ActiveImageAdditionalContent component.\n * @param props - Active Image Additional content component props.\n * @returns Active Image Additional content view props.\n */\nexport const activeImageAdditionalContent = (\n props: IActiveImageAdditionalContentProps\n): IActiveImageAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n return assembleNode(additionalContent, props);\n};\n\nexport default activeImageAdditionalContent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\n\n/**\n * @interface IRgbColor\n * @description - The IRgbColor interface contract.\n */\nexport interface IRgbColor {\n rValue: number;\n gValue: number;\n bValue: number;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IArea {\n areaId: string;\n coords: number[];\n href?: string;\n center?: number[];\n primaryImageUrl?: string;\n productUrl: string;\n productSearchResult?: ProductSearchResult;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IAreaMap {\n name: string;\n areas: IArea[];\n}\n\n/**\n * @enum CanvasCalculations\n * @description - The canvas calculations enum.\n */\nexport enum CanvasCalculations {\n defaultWidth = 0,\n defaultHeight = 0,\n defaultPositionX = 0,\n defaultPositionY = 0,\n defaultScale = 1,\n halfDivisor = 2,\n doubleMultiplier = 2,\n buttonHeight = 30,\n buttonPadding = 30,\n paddingAdjustment = 3,\n expandAnimationStartWidth = 10,\n expandAnimationEndWidth = 40,\n collapseAnimationStartWidth = 40,\n collapseAnimationEndWidth = 8,\n expandRadius = 12,\n collapseRadius = 8,\n rotation = 1.57,\n startAngle = 0,\n endAngle = 7,\n clearMargin = 50,\n clearHeight = 100,\n clearWidth = 100,\n textFadeInStartValue = 0,\n textFadeOutStartValue = 0.5,\n textFadeInterval = 0.01\n}\n\n/**\n * @enum CanvasStyles\n * @description - The canvas styles enum.\n */\nexport enum CanvasStyles {\n color = '#FFFFFF',\n buttonTextClor = '#000000'\n}\n\n/**\n * @enum\n * @description - The canvas styles enum.\n */\nexport interface IImageMapperResources {\n buttonText?: string;\n altText?: string;\n}\n\n/**\n * @interface IImageMapperProps\n * @description - The IImageMapperProps interface contract.\n */\nexport interface IImageMapperProps {\n imageData: IImageData;\n areaMap: IAreaMap;\n viewPort: string;\n requestContext: IRequestContext;\n color?: string;\n buttonTextClor?: string;\n width?: number;\n imgWidth?: number;\n activeImageRefs: React.RefObject<HTMLDivElement>;\n imageMapperResources?: IImageMapperResources;\n onLoad?(): void;\n onClick?(area: IArea, index: number, event: AreaEvent): void;\n onFocus?(area: IArea, index: number, event: AreaEvent): void;\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\n}\n\n/**\n * ImageMapper.\n */\nexport class ImageMapper extends React.Component<IImageMapperProps> {\n private readonly _backgroundImage: React.RefObject<Image>;\n\n private readonly _container: React.RefObject<HTMLDivElement>;\n\n private readonly _canvas: React.RefObject<HTMLCanvasElement>;\n\n private _isDesktopViewPort: boolean = false;\n\n private _context: CanvasRenderingContext2D | null | undefined = null;\n\n public constructor(props: IImageMapperProps) {\n super(props);\n this._backgroundImage = React.createRef();\n this._container = React.createRef();\n this._canvas = React.createRef();\n }\n\n /**\n * ComponentDidMount method.\n */\n public componentDidMount(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n this.renderAreas();\n this._context = null;\n }\n\n /**\n * ComponentDidUpdate method.\n */\n public componentDidUpdate(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n }\n\n /**\n * ShouldComponentUpdate method.\n * @param nextProps - Next props.\n * @returns Returns boolean.\n */\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\n let shouldRender = false;\n if (nextProps !== this.props) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n /**\n * GetActiveImageWidth method - Gets the active image width.\n * @returns Returns number | undefined.\n */\n public getActiveImageWidth = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return undefined;\n };\n\n /**\n * GetActiveImageHeight method - Gets the active image height.\n * @returns Returns number | undefined.\n */\n public getActiveImageHeight = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return undefined;\n };\n\n /**\n * ConvertHexToRgb method - This method takes color in HEX format and returns IRgbColor color object.\n * @param hexColor -The color hex value.\n * @returns -Returns IRgbColor object.\n */\n public convertHexToRgb = (hexColor: string): IRgbColor => {\n // RegEx used to execute the conversion of the hex color to rgb value.\n const regEx = new RegExp('^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$', 'u');\n\n // RegEx.exec method executes a search for a match in a specified string. Returns a result array, or null.\n const result = regEx.exec(hexColor);\n const defaultValue = 0;\n return result\n ? {\n rValue: Number.parseInt(result[1], 16),\n gValue: Number.parseInt(result[2], 16),\n bValue: Number.parseInt(result[3], 16)\n }\n : {\n rValue: defaultValue,\n gValue: defaultValue,\n bValue: defaultValue\n };\n };\n\n /**\n * ApplyFadingTransition method - Applys fading transition to button text.\n * @param text -The button text.\n * @param coords -The coordinates.\n * @param rgbColor -The RGB color object.\n * @param alpha -The alpha value of the button text.\n */\n public applyFadingTransition = (text: string, coords: number[], rgbColor: IRgbColor, alpha: number): void => {\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n context.fillStyle = `rgba(${rgbColor.rValue}, ${rgbColor.gValue}, ${rgbColor.bValue}, ${alpha} )`;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * Draw button method - Draws button and contains fixed hight, padding values.\n * @param text -The button text.\n * @param coords -The coordinates.\n */\n public drawButton = (text: string, coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonHeight = CanvasCalculations.buttonHeight;\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n const buttonPositionX = coords[0] - buttonWidth / halfDivisor;\n const buttonPositionY = coords[1] - buttonHeight / halfDivisor;\n const arcsize = buttonHeight / halfDivisor;\n\n context.beginPath();\n context.moveTo(buttonPositionX + arcsize, buttonPositionY);\n context.lineTo(buttonPositionX + buttonWidth - arcsize, buttonPositionY);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY,\n buttonPositionX + buttonWidth,\n buttonPositionY + arcsize,\n arcsize\n );\n context.lineTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight - arcsize);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY + buttonHeight,\n buttonPositionX + buttonWidth - arcsize,\n buttonPositionY + buttonHeight,\n arcsize\n );\n context.lineTo(buttonPositionX + arcsize, buttonPositionY + buttonHeight);\n context.arcTo(buttonPositionX, buttonPositionY + buttonHeight, buttonPositionX, buttonPositionY - arcsize, arcsize);\n context.lineTo(buttonPositionX, buttonPositionY + arcsize);\n context.arcTo(buttonPositionX, buttonPositionY, buttonPositionX + arcsize, buttonPositionY, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY);\n context.stroke();\n context.closePath();\n context.fillStyle = color;\n context.fill();\n context.fillStyle = buttonTextClor;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * ExpandAnimation method - Shows expand animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public expandAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.expandAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.expandAnimationEndWidth;\n const radius = CanvasCalculations.expandRadius;\n const rotation = CanvasCalculations.rotation;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeInValue = CanvasCalculations.textFadeInStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Reders expand animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n context.fillStyle = color;\n if (buttonText) {\n if (animationStartWidth < animationEndWidth) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeInValue);\n textFadeInValue += CanvasCalculations.textFadeInterval;\n animationStartWidth++;\n } else {\n this.drawButton(buttonText, [pointPositionX, pointPositionY]);\n }\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * CollapseAnimation method - Shows collapse animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public collapseAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.collapseAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.collapseAnimationEndWidth;\n const rotation = CanvasCalculations.rotation;\n const clearMargin = CanvasCalculations.clearMargin;\n const clearHeight = CanvasCalculations.clearHeight;\n const clearWidth = CanvasCalculations.clearWidth;\n const radius = CanvasCalculations.collapseRadius;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeOutValue = CanvasCalculations.textFadeOutStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Renders collapse animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.clearRect(pointPositionX - clearMargin, pointPositionY - clearMargin, clearWidth, clearHeight);\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n if (animationEndWidth < animationStartWidth && buttonText) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeOutValue);\n textFadeOutValue -= CanvasCalculations.textFadeInterval;\n animationStartWidth--;\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * DrawCircle method - Renders active points.\n * @param coords -Coordinates.\n */\n public drawCircle = (coords: number[]): void => {\n const { color = CanvasStyles.color, viewPort } = this.props;\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n const startAngle: number = CanvasCalculations.startAngle;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n const radius = viewPort === 'xs' || viewPort === 'sm' ? coords[2] * doubleMultiplier : coords[2];\n if (!context) {\n return;\n }\n context.fillStyle = color;\n context.beginPath();\n context.strokeStyle = color;\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\n context.closePath();\n context.stroke();\n context.fill();\n };\n\n /**\n * ScaleCoords method - To scale the active point coordinates based on the window size.\n * @param coords -Coordinates.\n * @returns -Returns number[].\n */\n public scaleCoords = (coords: number[]): number[] => {\n const { imgWidth } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultScale: number = CanvasCalculations.defaultScale;\n\n // Calculate scale based on current 'width' and the original 'imgWidth'\n const width = this.getActiveImageWidth();\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\n return coords.map(coord => coord * scale);\n };\n\n /**\n * RenderPrefilledAreas method - To render active points in case of events.\n */\n public renderPrefilledAreas = (): void => {\n const { areaMap } = this.props;\n areaMap.areas.map(area => {\n this.drawCircle(this.scaleCoords(area.coords));\n return null;\n });\n };\n\n /**\n * ComputeCenter method - To re-calculate the center of active point based on window size.\n * @param area -IArea.\n * @returns -Returns number[].\n */\n public computeCenter = (area: IArea): number[] => {\n const scaledCoords = this.scaleCoords(area.coords);\n return [scaledCoords[0], scaledCoords[1]];\n };\n\n /**\n * HandleHoverOn method - To handle mouse hover on event.\n * @param area -IArea.\n */\n public handleHoverOn = (area: IArea): void => {\n if (area.center && this._canvas.current) {\n this.drawCircle(this.scaleCoords(area.coords));\n this.expandAnimation(area.center);\n }\n };\n\n /**\n * HandleHoverOff method - To handle mouse hover off event.\n * @param area -IArea.\n */\n public handleHoverOff = (area: IArea): void => {\n if (this._canvas.current) {\n const context = this._canvas.current.getContext('2d') ?? this._context;\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\n\n if (!context) {\n return;\n }\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\n this.renderPrefilledAreas();\n if (area.center) {\n this.collapseAnimation(area.center);\n }\n }\n };\n\n /**\n * Click method - Mouse click event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public click = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onClick } = this.props;\n if (onClick) {\n event.preventDefault();\n onClick(area, index, event);\n }\n };\n\n /**\n * HoverOn method - Mouse hover on event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseEnter } = this.props;\n this.handleHoverOn(area);\n if (onMouseEnter) {\n onMouseEnter(area, index, event);\n }\n };\n\n /**\n * HoverOff method - Mouse hover off event.\n * @param area - IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseLeave } = this.props;\n\n this.handleHoverOff(area);\n\n if (onMouseLeave) {\n onMouseLeave(area, index, event);\n }\n };\n\n /**\n * RenderAreas method - Renders active points at given coordinates.\n * @returns -Returns JSX.Element[].\n */\n public renderAreas = (): JSX.Element[] => {\n const { areaMap, viewPort } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n\n return areaMap.areas.map((area, index) => {\n const scaledCoords = this.scaleCoords(area.coords);\n const xsRadius = area.coords[2] * doubleMultiplier;\n if (viewPort === 'xs') {\n scaledCoords[2] = xsRadius;\n }\n const center = this.computeCenter(area);\n const extendedArea = { ...area, scaledCoords, center };\n const areaKey = `area-${index}`;\n const altTextWithProductName = altText\n .replace('{buttonText}', buttonText ? buttonText : '')\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\n return (\n <area\n key={areaKey}\n shape='circle'\n coords={scaledCoords.join(',')}\n onMouseEnter={this.hoverOn(extendedArea, index)}\n onMouseLeave={this.hoverOff(extendedArea, index)}\n onClick={this.click(extendedArea, index)}\n onFocus={this.hoverOn(extendedArea, index)}\n onBlur={this.hoverOff(extendedArea, index)}\n href={area.productUrl}\n tabIndex={0}\n alt={altTextWithProductName}\n aria-label={altTextWithProductName}\n />\n );\n });\n };\n\n /**\n * InitCanvas method - To render the canvas.\n */\n public initCanvas = (): void => {\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\n return;\n }\n\n const { color, onLoad } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultHeight: number = CanvasCalculations.defaultHeight;\n\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\n\n this._canvas.current.width = canvasWidth;\n this._canvas.current.height = canvasHeight;\n this._container.current.style.width = `${canvasWidth}px`;\n\n const context = this._canvas.current.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.fillStyle = color ?? '';\n\n if (onLoad) {\n onLoad();\n }\n\n this.renderPrefilledAreas();\n };\n\n /**\n * Render method - To render the image mapper component with active image, canvas and active points.\n * @returns -Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const { imageData, areaMap, requestContext } = this.props;\n\n return (\n <div className='msc-active-image-container' ref={this._container}>\n <Image\n src={imageData.src}\n useMap={`#${areaMap.name}`}\n alt={areaMap.name}\n ref={this._backgroundImage}\n height={imageData.height}\n width={imageData.width}\n className='msc-active-image-img'\n imageSettings={imageData.imageSettings}\n gridSettings={requestContext.gridSettings ?? {}}\n requestContext={requestContext}\n />\n <canvas ref={this._canvas} className='msc-active-image-canvas' />\n <map name={areaMap.name} className='msc-active-image-map'>\n {this.renderAreas()}\n </map>\n </div>\n );\n }\n}\n\nexport default ImageMapper;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper\n} from '../active-image-utilities';\nimport { IActiveImageData } from './active-image.data';\nimport { IActiveImageProps } from './active-image.props.autogenerated';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent<HTMLAreaElement, MouseEvent> | React.FocusEvent<HTMLAreaElement>;\n\n/**\n * @interface IActiveImageViewProps\n * @classdesc - The IActiveImageViewProps interface contract.\n */\nexport interface IActiveImageViewProps extends IActiveImageProps<{}>, IImageMapperProps {\n activePointContainer: IModuleProps;\n activePointDetailsContainer: INodeProps;\n imageMapper: React.ReactNode;\n overlay: React.ReactNode;\n productCard: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IActiveImageAdditionalContentViewProps;\n productCardleftPosition: number;\n productCardtopPosition: number;\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\n}\n\n/**\n * @interface IActiveImageLinksData\n * @classdesc - The IActiveImageLinksData interface contract.\n */\nexport interface IActiveImageLinksData {\n linkText?: string;\n linkUrl: MsDyn365.ILinkData;\n ariaLabel?: string;\n willOpenInNewTab?: boolean;\n}\n\n/**\n * @interface IActiveImageState\n * @classdesc - The IActiveImageState interface contract.\n */\ninterface IActiveImageState {\n clientWidth: number;\n area: IArea | null;\n viewport: string;\n overlayClass: string;\n}\n\n/**\n * @enum ActiveImageConstants\n * @description - The active image constants enum.\n */\nexport enum ActiveImageConstants {\n timeoutInterval = 200,\n enterKey = 'Enter',\n escKey = 'Escape'\n}\n\n/**\n *\n * ActiveImage class.\n * @extends {React.PureComponent<IActiveImageProps<{}> & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent<IActiveImageProps<IActiveImageData> & IImageMapperProps, IActiveImageState> {\n private readonly _telemetryContent: ITelemetryContent;\n\n private _isDesktopViewPort: boolean;\n\n private readonly _defaultProductCardWidth: number = 315;\n\n private readonly _defaultProdutCardHight: number = 490;\n\n private readonly _activePoints: IArea[] = [];\n\n private readonly _activeImageRefs: React.RefObject<HTMLDivElement>;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject<HTMLDivElement>;\n\n public constructor(props: IActiveImageProps<IActiveImageData> & IImageMapperProps) {\n super(props);\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\n this.state = {\n clientWidth: 0,\n area: null,\n viewport,\n overlayClass: ''\n };\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n this._activeImageRefs = React.createRef();\n this._productCardDivRef = React.createRef();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('resize', this.updateClientWidth);\n document.addEventListener('keydown', this.keyDown, false);\n document.addEventListener('mousedown', this._handleOutsideClick);\n }\n setTimeout(() => {\n this.updateClientWidth();\n }, ActiveImageConstants.timeoutInterval);\n\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\n const images: HTMLCollectionOf<Element> = this._activeImageRefs.current.getElementsByClassName(\n 'msc-thumbnail_image msc-active-image-img'\n );\n if (ArrayExtensions.hasElements(Array.from(images))) {\n images[0].removeAttribute('usemap');\n }\n }\n }\n\n /**\n * AddActivePoints method - To handle add Active Points.\n * @param area - IArea.\n * @param product - ProductSearchResult.\n * @param coords - Coords.\n * @param productUrl - String.\n */\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\n if (!area) {\n this._activePoints.push({\n areaId: product.RecordId.toString(),\n coords,\n primaryImageUrl: product.PrimaryImageUrl ?? '',\n productUrl,\n productSearchResult: product\n });\n }\n };\n\n /**\n * ComponentWillUnmount method.\n */\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('resize', this.updateClientWidth);\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\n }\n }\n\n /**\n * UpdateClientWidth method to update client width in state.\n */\n public updateClientWidth = (): void => {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport });\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n };\n\n /**\n * Render method.\n * @returns - Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const viewProps: IActiveImageViewProps = {\n ...(this.props as IImageMapperProps & IActiveImageProps<{}>),\n activePointContainer: {\n moduleProps: this.props,\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\n },\n activePointDetailsContainer: {\n tag: 'div',\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\n ref: this._activeImageRefs\n },\n imgWidth: this.props.config.canvasWidth,\n imageMapper: this.renderImageMapper(),\n overlay: this.renderOverlay(),\n productCard: this.renderProductCard(),\n productCardleftPosition: this.getProductCardPositionX(),\n productCardtopPosition: this.getProductCardPositionY(),\n title: this.renderActiveImageDetailsHeading(),\n text: this.renderActiveImageDetailsParagraph(),\n links: this.renderActiveImageDetailsLinks(),\n detailsContainer: { className: 'msc-active-image__details' },\n detailsContainerCta: { className: 'msc-active-image__details__cta' },\n additionalContent: activeImageAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleAdditionalLinkText: this.handleAdditionalTextChange\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * RenderImageMapper method - To render image mapper.\n * @returns - Returns React.ReactNode | null.\n */\n public renderImageMapper = (): React.ReactNode | null => {\n const { config, context } = this.props;\n const defaultPosition: number = 0;\n const defaultLength: number = 0;\n const productResults = this.props.data.products.result;\n if (config.activePoints && productResults) {\n for (const product of productResults) {\n for (const configProduct of config.activePoints) {\n if (product.ItemId === configProduct.itemId) {\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\n const coords = [\n configProduct.xPosition ?? defaultPosition,\n configProduct.yPosition ?? defaultPosition,\n configProduct.radius ?? defaultPosition\n ];\n const area = this._activePoints.find(activePoint => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\n this.addActivePoints(area, product, coords, productUrl);\n }\n }\n }\n }\n const mappedArea: IAreaMap = {\n name: `map-${this._activeImageClass}`,\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\n };\n\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n return (\n <ImageMapper\n viewPort={this.state.viewport}\n requestContext={this.props.context.actionContext.requestContext}\n width={this.state.clientWidth}\n imgWidth={this.props.config.canvasWidth}\n onClick={this.enterArea}\n onFocus={this.enterArea}\n onMouseEnter={this.enterArea}\n onMouseLeave={this.leaveArea}\n imageData={this.props.config.activeImage ?? {}}\n areaMap={mappedArea}\n activeImageRefs={this._activeImageRefs}\n imageMapperResources={{\n altText: this.props.resources.altTextForSeeMoreButtonWithProductName,\n buttonText: this.props.resources.seeMoreButtonText\n }}\n />\n );\n };\n\n /**\n * EnterArea method - To handle mouse enter event.\n * @param area - Active point area.\n * @param index - Active point index.\n * @param event - Active point AreaEvent.\n */\n public enterArea = (area: IArea, index: number, event: AreaEvent): void => {\n this.setState({ area, overlayClass: 'msc-active-image-overlay' });\n if (this.props.onMouseEnter) {\n this.props.onMouseEnter(area, index, event);\n }\n if (event.type.toLocaleLowerCase() === 'click' && this._isDesktopViewPort) {\n window.open(area.productUrl, '_self');\n }\n };\n\n /**\n * LeaveArea method - To handle mouse leave event.\n */\n public leaveArea = (): void => {\n if (this._isDesktopViewPort) {\n this.resetState();\n }\n };\n\n /**\n * ResetState method - To reset the state for area and overlayclass.\n */\n public resetState = (): void => {\n this.setState({ area: null, overlayClass: '' });\n };\n\n /**\n * RenderProductComponent method - To render the product card with product information.\n * @returns - Returns React.ReactNode.\n */\n public renderProductComponent = (): React.ReactNode => {\n if (this.state.area?.productSearchResult) {\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\n const imageUrl: string = this.state.area.primaryImageUrl ?? '';\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\n const product: ProductSearchResult = this.state.area.productSearchResult;\n product.PrimaryImageUrl = primaryImageUrl;\n\n return (\n <ActiveProductComponent\n context={this.props.context}\n imageSettings={this.props.config.productImageSettings}\n id={product.ItemId ?? ''}\n typeName={this.props.typeName || ''}\n data={{ product }}\n />\n );\n }\n return React.Fragment;\n };\n\n /**\n * RenderProductCard method - To render product cards.\n * @returns - Returns React.ReactNode.\n */\n public renderProductCard = (): React.ReactNode => {\n const { area } = this.state;\n\n return (\n <>\n {area?.center && (\n <div className='msc-active-image-product-card' ref={this._productCardDivRef}>\n <div className='msc-active-image-product-card-wrapper' key={area.areaId}>\n {!this._isDesktopViewPort && <button onClick={this.resetState} className='close-button' />}\n {area.productSearchResult && this.renderProductComponent()}\n {!this._isDesktopViewPort && (\n <a href={area.productUrl} className='see-more-button'>\n {this.props.resources.seeMoreButtonText}\n </a>\n )}\n </div>\n </div>\n )}\n </>\n );\n };\n\n /**\n * RenderOverlay method - To render overlay for non desktop viewports.\n * @returns - Returns React.ReactNode.\n */\n public renderOverlay = (): React.ReactNode => {\n return <>{!this._isDesktopViewPort && <div className={this.state.overlayClass} />}</>;\n };\n\n /**\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\n * For xs, sm and md viewports it provides x position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionX = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsWidth = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.w\n : defaultImageSettings.viewports.lg?.w;\n const defaultPositionX: number = 0;\n const halfDivisor: number = 2;\n const productCardWidth: number = productImageSettingsWidth ? productImageSettingsWidth : this._defaultProductCardWidth;\n const { area, clientWidth, viewport } = this.state;\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\n const leftAllignPosition = pointPositionX - productCardWidth - productCardWidth / halfDivisor;\n const rightAllignPosition = pointPositionX + productCardWidth / halfDivisor;\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n if (leftAllignPosition < defaultPositionX) {\n position = rightAllignPosition;\n } else {\n position = leftAllignPosition;\n }\n }\n return position;\n };\n\n /**\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\n * For xs, sm and md viewports it provides y position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionY = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsHeight = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.h\n : defaultImageSettings.viewports.lg?.h;\n const halfDivisor: number = 2;\n const { area, viewport } = this.state;\n const produtCardHight: number = productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\n let position: number = pointPositionY;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - produtCardHight / halfDivisor;\n }\n return position;\n };\n\n /**\n * GetDefaultImageSettings method.\n * @returns MsDyn365.IImageSettings.\n */\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\n const defaultImageSettings: MsDyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\n },\n lazyload: true\n };\n\n return defaultImageSettings;\n };\n\n /**\n * KeyDown method - To handle keydown event.\n * @param event - KeyboardEvent.\n */\n public keyDown = (event: KeyboardEvent): void => {\n if (event.key === ActiveImageConstants.enterKey) {\n const target: HTMLElement = event.target as HTMLElement;\n if (target.nodeName === 'AREA') {\n const area: HTMLAreaElement = target as HTMLAreaElement;\n if (area.href) {\n window.open(area.href, '_self');\n }\n }\n }\n if (event.key === ActiveImageConstants.escKey) {\n this.resetState();\n }\n };\n\n /**\n * GetActiveImageWidth method - To get active image width.\n * @returns Returns number.\n */\n public getActiveImageWidth = (): number => {\n const defaultWidth: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return defaultWidth;\n };\n\n /**\n * GetActiveImageHeight method - To get active image height.\n * @returns Returns number.\n */\n public getActiveImageHeight = (): number => {\n const defaultHeight: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return defaultHeight;\n };\n\n /**\n * HandleLinkTextChange method - To handle link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleTextChange method - To handle text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * HandleParagraphChange method - To handle paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * HandleAdditionalTextChange method - To handle additional text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * RenderActiveImageDetailsLinks method - To render active image details links.\n * @returns - React node.\n */\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\n\n return links?.map((linkData: IActiveImageLinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'msc-active-image__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.willOpenInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n };\n\n /**\n * RenderActiveImageDetailsHeading method - To render active image details heading.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='msc-active-image__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n };\n\n /**\n * RenderActiveImageDetailsParagraph method - To render active image details paragraph.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsParagraph = (): React.ReactNode | undefined => {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='msc-active-image__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n };\n\n /**\n * GetActiveImageId - To get active image id from src.\n * @returns - String.\n */\n public getActiveImageId = (): string => {\n const { activeImage } = this.props.config;\n let activeImageId: string = '';\n if (activeImage?.src) {\n const activeImageSource = activeImage.src.split('/');\n const decrementOne: number = 1;\n const activeImageIdPart = activeImageSource[activeImageSource.length - decrementOne].split('?');\n activeImageId = activeImageIdPart[0] ?? '';\n }\n return activeImageId;\n };\n\n /**\n * Handle outside click method - To handle outside click of the active image product.\n * @param event - Mouse event.\n */\n private readonly _handleOutsideClick = (event: MouseEvent) => {\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\n return;\n }\n this.resetState();\n };\n}\nexport default ActiveImage;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IActiveImageAdditionalContentViewProps } from '../active-image-utilities';\nimport { IActiveImageViewProps } from './active-image';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\n return (\n <Node {...additionalContent.additionalContentNode}>\n {additionalContent.heading}\n <Node {...additionalContent.additionalContentContainer}>\n {additionalContent.text}\n <Node {...additionalContent.additionalContentItemLinks}>{additionalContent.links}</Node>\n </Node>\n </Node>\n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC<IActiveImageViewProps> = props => {\n return (\n <Module {...props.activePointContainer}>\n <Node {...props.activePointDetailsContainer}>\n {props.imageMapper}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </Node>\n <Node\n className='msc-active-image-product-card-container'\n style={{ top: `${props.productCardtopPosition}px`, left: `${props.productCardleftPosition}px` }}\n >\n {props.overlay}\n {props.productCard}\n </Node>\n </Module>\n );\n};\n\nexport default activeImageView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { 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 { 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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n ChannelInventoryConfiguration,\n ProductRefinerSource,\n ProductRefinerValue,\n ProductSearchCriteria,\n SearchSuggestion,\n SearchSuggestionCriteria\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n getInventoryConfigurationAsync,\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * This setting defines inventory filtering options.\n */\nexport enum ProductListInventoryFilteringOptions {\n /**\n * Filter out all products out of stock.\n */\n HideOOS = 'hideOOS',\n\n /**\n * Sort products by availability, OOS goes last.\n */\n SortOOS = 'sortOOS',\n\n /**\n * No filtering selected.\n */\n Default = 'default'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\n/**\n * Returns inventory in stock sortable refiner value.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @param isInStock - The flag indicating whether is getting in-stock refiner or out-of-stock refiner.\n * @returns Refiners.\n */\nconst getInventorySortableRefinerValue = (\n channelInventoryConfiguration: ChannelInventoryConfiguration,\n isInStock: boolean\n): ProductRefinerValue | undefined => {\n if (channelInventoryConfiguration && channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId) {\n return {\n RefinerRecordId: channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId,\n DataTypeValue: AttributeDataType.TrueFalse,\n LeftValueBoundString: isInStock ? 'true' : 'false',\n RightValueBoundString: isInStock ? 'true' : 'false',\n UnitText: '',\n RowNumber: 0,\n Count: 0,\n ExtensionProperties: [],\n RefinerSourceValue: ProductRefinerSource.Attribute\n };\n }\n return undefined;\n};\n\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise<void> {\n const catalogId = getCatalogId(ctx.requestContext);\n let productSearchCriteria: ProductSearchCriteria = {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n };\n\n if (ctx.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: ctx });\n const isInStockRefiner = true;\n const inventoryRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStockRefiner);\n\n if (inventoryRefinerValue) {\n productSearchCriteria = {\n ...productSearchCriteria,\n Refinement: [inventoryRefinerValue]\n };\n }\n }\n\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: productSearchCriteria,\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\n );\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: <IAction<Autosuggestions>>getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return <li className='msc-autoSuggest__categoryResults-title'>{categoryAutoSuggestionHeading}</li>;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach(refiner => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach(refinerKey => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded?: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Set updated input value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const inputNode = !hideSearchLabel ? (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n maxLength={maxChars}\n value={query}\n />\n ) : (\n <input\n className='ms-search__form-control'\n type='text'\n aria-label={ariaLabelSearch}\n name={searchQsp}\n placeholder={searchPlaceholder}\n ref={searchTextInput}\n onChange={onInputChange}\n value={query}\n />\n );\n\n const submitBtnNode = !disableSubmitSearch && <Button className='ms-search__form-submitSearch' aria-label={ariaLabelSubmit} />;\n\n const cancelBtNoden = (\n <Button\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\n aria-label={ariaLabelCancel}\n onClick={handleCancelSearchChange}\n type='button'\n />\n );\n\n return { input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchKeywordSuggestProps {\n searchKeywordSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface ISearchKeywordViewProps {\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * KeywordSuggestionsComponent.\n * @param props\n */\nexport const KeywordSuggestionsComponent = (props: ISearchKeywordSuggestProps): ISearchKeywordViewProps | undefined => {\n const { suggestions, hitPrefix, hitSuffix } = props;\n\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n const reactNodes: React.ReactNode[] = [];\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, props));\n });\n\n return { text: reactNodes };\n};\n\nconst _assembleNode = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps) => {\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = ariaLabel;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n <li className='msc-autoSuggest__keywordResults-item' key={item.Id}>\n <a aria-label={ariaLabel} href={_generateLink(item, hitPrefix, hitSuffix, props)} {...attribute}>\n {_generateLink(item, hitPrefix, hitSuffix, props) &&\n _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\n </a>\n </li>\n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, props: ISearchKeywordSuggestProps): string => {\n const { searchPageURL, searchQsp } = props;\n\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n if (searchQsp && formattedLink) {\n queryUrl.searchParams.set(searchQsp, formattedLink);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchLabelProps {\n isSearchFormExpanded: boolean;\n searchLabelClass: string;\n searchLabelArialLabel: string;\n searchtext: string;\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n hideSearchLabel?: boolean;\n telemetryContent: ITelemetryContent;\n handleCancelSearchChange(): void;\n}\n\nexport const LabelComponent = (props: ISearchLabelProps) => {\n const {\n searchLabelClass,\n searchLabelArialLabel,\n isSearchFormExpanded,\n searchtext,\n searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange,\n telemetryContent\n } = props;\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n\n return (\n <div className={searchLabelClass}>\n <Button\n className='ms-search__icon'\n aria-expanded={isSearchFormExpanded}\n aria-label={searchLabelArialLabel}\n onClick={handleCancelSearchChange}\n innerRef={searchCollapsedLabel}\n {...attributes}\n >\n {!hideSearchLabel && (\n <span className='ms-search__icon-text' aria-hidden>\n {searchtext}\n </span>\n )}\n </Button>\n </div>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n NodeTag\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps<ISearchData>;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return <li className='msc-autoSuggest__productResults-title'>{productAutoSuggestionHeading}</li>;\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) && _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps\n) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': `${ariaLabel!} ${productPrice}`,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\n : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\n\n return (\n // eslint-disable-next-line react/no-danger\n <span className='msc-price msc-autoSuggest__productResults-item-text' dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />\n );\n};\n\nconst _renderPrice = (\n adjustedPrice: number,\n basePrice: number,\n moduleId: string,\n moduleType: string,\n props: ISearchProductSuggestProps\n): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleType}\n context={context}\n data={{\n price: {\n CustomerContextualPrice: adjustedPrice,\n BasePrice: basePrice\n }\n }}\n className='msc-autoSuggest__productResults-item-price'\n freePriceText={props.resources?.freePriceText}\n />\n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\n <Image\n requestContext={props.autoSuggestProps.context.actionContext.requestContext}\n altText={altText}\n className='msc-autoSuggest__productResults-item-img'\n src={suggestion.ImageUrl}\n gridSettings={gridSettings!}\n imageSettings={imageSettings ? imageSettings : defaultImageSettings}\n loadFailureBehavior='empty'\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 { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps<ISearchData> {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n handleCancelSearchFocused?(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component<ISearchProps<ISearchData>, ISearchState>}\n */\nclass Search extends React.Component<ISearchProps<ISearchData>, ISearchState> {\n private readonly searchTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\n\n private readonly formReference: React.RefObject<HTMLButtonElement>;\n\n private readonly maxChars: number;\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\n\n private readonly autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private loadSuggestionsRequestId?: string;\n\n private inputSuggestionType: ISuggestionTypeCriterionData[];\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n public constructor(props: ISearchProps<ISearchData>) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n\n this.inputSuggestionType = [];\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n this._initSuggestionTypes();\n }\n\n public async componentDidMount(): Promise<void> {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps<ISearchData>, nextState: ISearchState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- ignore complexity.\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners,\n isLoadingAutoSuggest\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\n );\n const productSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Product\n );\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\n if (suggestion.SuggestionType !== SuggestionType.Category) {\n return false;\n }\n const refiner = categoryRefiners?.Values?.find(item => {\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\n });\n\n return !ObjectExtensions.isNullOrUndefined(refiner);\n });\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps<ISearchData>),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label: LabelComponent({\n isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext,\n searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel,\n searchTextInput: this.searchTextInput,\n disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp,\n searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\n ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestProduct:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\n ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n })\n : undefined,\n autosuggestCategory:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\n ? CategorySuggestionsComponent({\n searchCategorySuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: categorySuggestions,\n searchRefiners,\n telemetryContent: this.telemetryContent,\n shouldShowFullPath: shouldShowFullCategoryPath\n })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange,\n handleCancelSearchFocused: this._handleCancelSearchFocused\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _initSuggestionTypes() {\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\n\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\n if (!ArrayExtensions.hasElements(suggestions)) {\n this.inputSuggestionType = [\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\n ];\n return;\n }\n\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\n if (ArrayExtensions.hasElements(validSuggestions)) {\n this.inputSuggestionType = validSuggestions;\n return;\n }\n\n this.inputSuggestionType = [];\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return <Spinner className='msc-autoSuggest__loadingResult' label={loadingText} size={SpinnerSize.medium} labelPosition='right' />;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\n this._clearAutoSuggestState();\n }\n };\n\n private readonly _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (\n !(\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\n )\n ) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\n try {\n const searchSuggestions = await getSearchSuggestionsAction(\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\n this.props.context.actionContext\n );\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n return searchSuggestions;\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get auto suggest results');\n return undefined;\n }\n }\n\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\n try {\n const refiners = await this._getSearchRefiners(query);\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({\n suggestions,\n searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\n isLoadingAutoSuggest: false\n });\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get refiners results');\n }\n }\n\n private _loadSuggestions(query: string) {\n this.cancellabelDebounce = debounce(async () => {\n this.setState({ isLoadingAutoSuggest: true });\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\n this._loadSuggestions(query);\n }\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType(): string {\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\n );\n return distinctSuggestionTypes.join(',');\n }\n\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n validateCatalogId(catalogId);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _handleCancelSearchFocused = (): void => {\n const { suggestions } = this.state;\n if (!(suggestions && suggestions.AllSearchResults)) {\n this._clearAutoSuggestState();\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(route, window.location.href);\n if (qsp && query) {\n queryUrl.searchParams.set(qsp, query);\n }\n\n return queryUrl.href;\n };\n\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText =\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\n return ariaLiveRegion.innerText;\n }\n return '';\n };\n}\n\nexport default Search;\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 { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC<ISearchViewProps> = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n isLoadingAutoSuggest,\n isLoadingNode\n } = props;\n\n return (\n <Module {...Search}>\n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n <Node {...AutoSuggest}>\n {searchText && searchText.length > 0 ? <Node {...AutoSuggestAriaLabel}>{AutoSuggestAriaLabelText}</Node> : ''}\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\n </Node>\n </Module>\n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n <Node {...SearchForm}>\n <Node {...FormWrapper}>\n {form.input}\n {form.cancelBtn}\n {form.submitBtn}\n </Node>\n </Node>\n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n keywordSuggestions && (\n <Node {...KeywordSuggest}>\n <Node {...UlKeyword}>\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n keywordSuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n productSuggestions && (\n <Node {...ProductSuggest}>\n <Node {...UlProduct}>\n {productSuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n productSuggestions.items.map((item, index) => {\n return (\n <Node {...item.LiProduct} key={item.id || index}>\n <Node {...item.AProduct}>\n {item.thumbnail}\n {item.text}\n {item.price}\n </Node>\n </Node>\n );\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n categorySuggestions && (\n <Node {...CategorySuggest}>\n <Node {...UlCategory}>\n {categorySuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n categorySuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nexport default SearchView;\n"],"names":["HeaderPreferredStore","React","constructor","modalCloseButtonRef","handleClick","this","_findPreferredStoreOnClick","props","render","data","storeSelectorStateManager","result","slots","resources","ArrayExtensions","hasElements","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","__decorate","observer","Logo","super","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","attributes","getTelemetryAttributes","_renderLogo","config","link","linkUrl","destinationUrl","assign","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","_this$props$config$my","myAccountLinks","linkText","value","popOverRef","_toggleNavbar","bind","_togglePopover","_keydown","state","mobileMenuCollapsed","signinPopoverOpen","hasSigninerror","getTelemetryObject","context","request","telemetryPageName","friendlyName","_this$props$data$acco","customer","accountInformation","FirstName","Name","componentDidMount","MsDyn365","isBrowser","window","addEventListener","reaction","cart","user","signUpCustomerNotFoundTitle","signUpMultipleCustomerFoundTitle","closeNotificationLabel","signinNotificationError","_getSigninNotification","NotificationsManager","instance","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","_objectSpread","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","SignIn","signInLinkText","signInUrl","signInLinkAriaText","onTelemetryClick","_user$signOutUrl","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","signUpCustomerNotFound","signUpMultipleCustomerFound","retailServerErrorCode","MyProfile","innerRef","map","cta","index","contentAction","etext","editableLink","role","additionalProperties","onTextChange","setState","keyCode","KeyCodes","Escape","computed","renderCustomerName","_renderReactFragment","items","slot","_context$actionContex","_config$customerServi","TopHeaderContainer","contactURL","actionContext","sitePath","Module","Node","customerServicePhone","renderForMobile","accountClassName","_renderAccountBlock","_context$actionContex2","Collapse","Drawer","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","_renderMobileAccountBlock","_renderCollapseMenu","layout","HeadingTag","ProductCollection","handleHeadingChange","heading","text","_getProductsDimensionsAvailabilities","async","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","validValues","products","includes","DimensionTypes","none","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","initProductState","productCollectionProducts","productCollection","equals","_getProduct","product","isList","_this$props$data$feat","_this$state$productsD","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","_product$MasterProduc","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","isNullOrUndefined","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","_ref","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","_props$priceResources","renderCurrentPriceWithOriginalPrice","savingsText","TebuPriceModel3Component","msdyn365Commerce","createComponentOverride","component","_product$Name","_getProductImageUrlFr","_getProductPageUrlFro","_product$AttributeVal3","_product$AttributeVal4","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","pathname","getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","colorAttribute","attributeValue","_attributeValue$KeyNa","toLocaleLowerCase","defaultSwatch","Swatches","IsDefault","productImageUrlFromSwatch","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","useState","productImageUrl","setProductImageUrl","updatePageAndImageUrl","swatchItem","dimensionType","StringExtensions","isNullOrWhitespace","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","_product$AttributeVal","_product$AttributeVal2","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","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","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","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","parentProductRefinerHierarchy","RefinerRecordId","minValue","maxValue","labels","sliderKeyString","sliderThumbs","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","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","_this$props","children","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","RefinerTypeValue","RefinerType","SingleSelect","itemTypeClassName","SourceValue","ProductRefinerSource","Rating","_renderRating","_getRefinerUrl","tabIndex","_renderSwatch","Count","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$","hasColor","hasImage","swatchItems","checkIfShouldDisplayAsSwatch","SwatchComponent","isSelectionEnabled","_productRefinerValue$2","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","Range","SliderWithBars","itemToggleNotification","onUpdateRefiners","prevState","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","refinementCriteria","refinementCriterion","RefinerSourceValue","getUpdatedRefinementCriteria","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","next","push","Text","TrueFalse","matchingIndex","findIndex","criterion","splice","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","_this$props$context$r6","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","_activePrice$Customer","exception","Error","_getSearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","category","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","totalProductCount","count","numberOfProducts","oneProduct","TitleContainer","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","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","_refiner$LeftValueBou","sort","a","b","_a$LeftValueBoundStri","_a$LeftValueBoundStri2","_b$LeftValueBoundStri","_b$LeftValueBoundStri2","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$data$prod","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","all","one","two","three","four","paginationPreviousText","paginationNextText","_viewport","device","Type","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","hydrateRefinersFromUrl","_this$props$context$r","_this$props$context$r2","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","productId","Recommendation","includeAttributes","getCollectionProducts","productResults","_this$props$context$a","_listPageState$curren","_listPageState$sortin","_listPageState$active","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","_this$props$context$a2","_this$props$context$r7","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","_props$context$action","AddToCartComponentActions","_event","setUploadStatus","openModal","setLinesAddedToCartDialogOpen","setAddedLinesCount","addOrderTemplateToCartInput","AddOrderTemplateToCartInput","orderTemplate","productList","Id","addOrderTemplateToCartAction","buttonEventReference","ModalWarning","warningAccepted","accept","onWarningChecked","modalWarningBtn","warningClose","onWarningSubmit","_this$props$modalWarn","_this$props$modalWarn2","_this$props$modalWarn3","_this$props$modalWarn4","_this$props$modalWarn5","_this$props$modalWarn6","_this$props$modalWarn7","_this$props$modalWarn8","_this$props$modalWarn9","_this$props$modalWarn10","fade","horizontalPosition","verticalPosition","modalWarningResources","modalWarningHeader","modalWarningMessage","checked","modalWarningCancel","disabled","modalWarningOK","ModalWarningFromLineAction","productFromLineAction","quantityFromLineAction","itemKeyFromLineAction","productSpecificationFromLineAction","_this$props$modalWarn11","_this$props$modalWarn12","_this$props$modalWarn13","_this$props$modalWarn14","_this$props$modalWarn15","_this$props$modalWarn16","_this$props$modalWarn17","_this$props$modalWarn18","AddOrderTemplateToCartComponent","createComponent","uploadStatus","modalOpen","setModalOpen","addedLinesCount","linesAddedToCartDialogOpen","modalWarningOpen","setModalWarningOpen","modalText","_getModalText","status","dialogStrings","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","processStatusClass","closeWindowButtonText","AddOrderTemplateToCart","addOrderTemplateAttribute","popupProps","renderModalPopup","PopupProducts","orderTemplateLines","line","fullProduct","totalLines","addToCartText","warningHandler","LinesAddedToCartDialog","linesAddedToCartDialogResources","linesCount","onClose","closeLinesAddedToCartDialog","_buttonEventReference","buttonLabel","PriceComponent","ratingId","_totalRatings$toStrin","ActiveProductComponent","imgData","Image","assembleNode","_item$links","additionalContentNode","renderHeading","additionalContentHeading","handleAdditionalTextChange","subtext","renderParagraph","additionalContentParagraphText","links","ctaLink","renderLinks","isOpenInNewTab","handleAdditionalLinkTextChange","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","RegExp","exec","rValue","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","fillStyle","parentElement","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","buttonText","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","animate","_this$_canvas$current5","_this$_canvas$current6","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","_this$props$imageMapp2","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","_this$_canvas$current7","_this$_canvas$current8","clearRect","drawCircle","_this$_canvas$current9","_this$_canvas$current10","viewPort","doubleMultiplier","strokeStyle","arc","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","_this$_canvas$current11","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","click","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","productSearchResult","shape","join","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","style","shouldRender","_requestContext$gridS","imageData","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","_product$PrimaryImage","areaId","primaryImageUrl","updateClientWidth","viewport","variant","VariantType","Browser","renderImageMapper","_this$props$config$ac","activePoints","configProduct","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","xPosition","yPosition","activePoint","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","open","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","baseImageUrl","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$","_area$center","defaultImageSettings","getDefaultImageSettings","productImageSettingsWidth","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","produtCardHight","_area$center$2","_area$center2","xl","keyDown","enterKey","nodeName","escKey","handleTextChange","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","linkId","willOpenInNewTab","renderActiveImageDetailsHeading","_heading$tag","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","split","decrementOne","_handleOutsideClick","_this$_productCardDiv","timeoutInterval","images","getElementsByClassName","Array","from","removeAttribute","activePointContainer","activePointDetailsContainer","imageMapper","overlay","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","_this$props$config$ad","activeImageView","top","left","listType","getProductPriceForSelectedProducts","ProductPriceForSelectedProductsInput","p","IsMasterProduct","productPrice","discountIds","validateCatalogId","searchPageLink","getUrlSync","location","set","_renderNoProduct","noProductToRenderText","isRangeTypeForInteger","isCustomRangeTypeIntegerSelected","RowNumber","isSingleSelectRangeTypeIntegerSelected","getIntegerRangeName","rangeValue","RightValueBoundLocalizedString","r","_this$props$context","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","_rangeParentDisplay$","rangeParentDisplay","rangeDisplayType","closeAriaLabel","newIntRange","_parent","refinerValues","filterValue","_context$request$app","OmniChannelMedia","img","fallBackSrc","swatchItemAriaLabel","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","productText","productCount","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasContentSwatch","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","defaultChkProductCount","productCountAriaLabelValue","isMobileView","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","invalidData","updateInputRangerProps","_isUndefined","_props$context$reques","isListPageStateUpdated","_isMounted","_updateVariantAvailability","_updateListPageState","_this$props$config$it","_this$props$config$it2","_this$props$data$list","_this$props$data$list2","_this$props$data$list3","_this$props$data$list4","_getAllSortByOptions","_shouldHideFromRefiners","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_this$props$data$refi","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","_getSortCriteriaColumn","_this$props$data$list5","queryColumns","mappedSearchConfiguration","_this$props$data$list6","_nameTranslation","StoreOperationsDataActions","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","newListPageState","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","_this$props$context$r9","_listPageState$result","_listPageState$result2","_this$props$context$r10","_this$props$data$list7","_this$props$data$list8","Viewport","action","SearchState","SuggestionType","AutoSuggestInput","searchText","suggestionType","hitPrefix","hitSuffix","getCacheKey","getCacheObjectType","dataCacheType","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","ctx","_ctx$requestContext$a","productSearchCriteria","SearchCondition","Context","inventoryRefinerValue","getInventorySortableRefinerValue","isInStock","ExtensionProperties","Attribute","getInventoryConfigurationAsync","Refinement","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","AllSearchResults","createObservableDataAction","autoSuggestPromises","inputData","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","reactNodes","_assembleNode","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","Value","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","Category","encodedRefiner","compressRefiners","formattedText","dangerouslySetInnerHTML","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","onInputChangeFunction","inputNode","maxLength","submitBtnNode","cancelBtn","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","productAutoSuggestionHeading","_item$Value","Value3","DecimalValue","thumbnail","_renderThumbnail","_renderPrice","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","_props$resources","Search","waitTime","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","Spinner","size","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","formReference","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","inputSuggestionType","_loadSuggestions","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","innerText","setAttribute","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","isLoadingAutoSuggest","searchInputMaxLength","searchFormClass","_initSuggestionTypes","params","isEditor","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","keywordSuggestions","Keyword","None","productSuggestions","Product","categorySuggestions","_item$RefinerRecordId","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","autoComplete","onSubmit","UlKeyword","UlProduct","UlCategory","form","autosuggestKeyword","autosuggestProduct","autosuggestCategory","callbacks","handleCancelSearchFocused","isLoadingNode","suggestionTypes","suggestionTypeCriterion","unique","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","_debounce","Random","Guid","generateGuid","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","toUpperCase","slice","ProductsDataActions","_renderForm","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions"],"sourceRoot":""}