{"version":3,"file":"static/js/18.1ccbef73963a16502bcd.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/components/LoginToViewPricing.component.tsx?4d0c","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/utilities.ts?71e1","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/choice-summary.tsx?92a7","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/error-message.tsx?5da8","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/feature-search-result-item.tsx?5dcb","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/link.tsx?3ec2","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/modal.tsx?793f","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/product-search-result-items.tsx?7848","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/range-refine-item.tsx?cc5e","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/refine-item.tsx?ac45","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/refine-submenu.tsx?49ea","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/separator.tsx?fa0e","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/title.tsx?1fda","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.props.autogenerated.ts?22c3","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.tsx?578c","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.view.tsx?c38c","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/buybox-add-to-order-template.tsx?c57b","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/buybox.view.tsx?6f3d","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/addToCart.component.tsx?25ed","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/components/product.component.tsx?7a8d","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/quickview.view.tsx?efa8","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme-b2c/views/search-result-container.view.tsx?87ee","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/models/getProductSupersessionProperty.ts?8b55","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/models/SupersessionKey.ts?818f","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/buybox-add-to-order-template.tsx?7592","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/buybox.view.tsx?abca","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/addToCart.component.tsx?89c0","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/components/product.component.tsx?a667","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/quickview.view.tsx?5429","webpack://Msdyn365.Commerce.Online/./src/themes/gardner-theme/views/search-result-container.view.tsx?c8d6","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.tsx?9fd5","webpack://Msdyn365.Commerce.Online/./src/common/buybox-components.tsx?42b4","webpack://Msdyn365.Commerce.Online/./src/common/buybox-product-configure.tsx?139c","webpack://Msdyn365.Commerce.Online/./src/common/buyboxInterface.ts?9d60","webpack://Msdyn365.Commerce.Online/./src/common/dropdown/dropdown.tsx?f1d3","webpack://Msdyn365.Commerce.Online/./src/common/dropdown/dropdown.props.ts?7676","webpack://Msdyn365.Commerce.Online/./src/common/utilities/error-utilities.ts?bb69","webpack://Msdyn365.Commerce.Online/./src/modules/buybox/components/buybox-find-in-store.tsx?3ef8","webpack://Msdyn365.Commerce.Online/./src/modules/buybox/buybox.tsx?e22d","webpack://Msdyn365.Commerce.Online/./src/modules/buybox/buybox.view.tsx?376b","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/utilities/helper.ts?f31d","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/utilities/get-valid-product-images.ts?78b7","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/quickview.tsx?4080","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/utilities/get-product-details.ts?5cc2","webpack://Msdyn365.Commerce.Online/./src/modules/quickview/quickview.view.tsx?ee5b","webpack://Msdyn365.Commerce.Online/./src/modules/recently-viewed/base/recently-viewed-product-item.ts?4982","webpack://Msdyn365.Commerce.Online/./src/modules/recently-viewed/base/recently-viewed-item.ts?54c9","webpack://Msdyn365.Commerce.Online/./src/modules/recently-viewed/recently-viewed-state.ts?c73b","webpack://Msdyn365.Commerce.Online/./src/modules/recently-viewed/recently-viewed-manager.ts?a2a8","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/buybox-add-to-order-template.tsx?ceb4","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/buybox.view.tsx?98cf","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/quickview.view.tsx?8e29"],"sourcesContent":["import React from 'react';\r\nimport { IRequestContext } from '@msdyn365-commerce/core';\r\nexport const LoginToViewPricingComponent = (\r\n context: IRequestContext,\r\n loginText: string,\r\n priceComponent: JSX.Element,\r\n shouldBlockPricing: boolean,\r\n className: string = 'login-to-view-pricing'\r\n): JSX.Element => {\r\n const {\r\n user: { signInUrl, isAuthenticated }\r\n } = context;\r\n\r\n if (isAuthenticated) {\r\n return priceComponent;\r\n } else if (!isAuthenticated && !shouldBlockPricing) {\r\n return priceComponent;\r\n } else {\r\n return (\r\n
\r\n {loginText}\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 { 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. 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 { ProductListInventoryFilteringOptions } from '../actions';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && label && {label}}\r\n
    \r\n {items.map((item: IRefinerMap) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && (\r\n \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, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IEveSearchResultContainerResources } from '../eve-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: IEveSearchResultContainerResources;\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 { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IEveSearchResultContainerResources } from '../eve-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IEveSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nexport function getInventoryLabel(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\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n />\r\n
  • \r\n ))}\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\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 const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n 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 { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\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(\r\n productRefinerValue,\r\n parentProductRefinerHierarchy,\r\n isChecked,\r\n context,\r\n index,\r\n telemetryContent,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel\r\n );\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel\r\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\r\n : '';\r\n } else {\r\n refineMenuItemAriaLabel = refineItemsAriaLabel\r\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\r\n : '';\r\n }\r\n return (\r\n
  • \r\n \r\n {this._renderSwatch()}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n\r\n 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 _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n 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 ratingUserCountAriaLabel?: string,\r\n ratingSingleUserCountAriaLabel?: string\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 // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue =\r\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\r\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\r\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * 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 productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, 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 {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n isMobile\r\n } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n \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 productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n \r\n {listItems}\r\n \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (\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 * 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\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IEveSearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IEveSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n enableProdutDescription?: boolean;\r\n listView?: boolean;\r\n onlyShowPriceWhenAuthenticated?: boolean;\r\n}\r\n\r\nexport interface IEveSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n filterText: string;\r\n partNoHeading: string;\r\n descriptionHeading: string;\r\n availabilityHeading: string;\r\n listPriceHeading: string;\r\n yourPriceHeading: string;\r\n loginToViewPricing: string;\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n addToCartModalHeading: string;\r\n addToCartText: string;\r\n courseInCartText: string;\r\n invoiceInCartText: string;\r\n productEligibilityText: string;\r\n}\r\n\r\nexport interface IEveSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IEveSearchResultContainerResources;\r\n config: IEveSearchResultContainerConfig;\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 {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice, ProductRefinerValue, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n PriceForProductSearchResultInput\r\n} 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 isMobile,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction, action } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCollectionRefinersAction,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n IFullProductsSearchResultsWithCount,\r\n parseQueryParam,\r\n ProductListInventoryFilteringOptions,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\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 { ListPageState } from './list-page-state';\r\nimport { IEveSearchResultContainerData } from './eve-search-result-container.data';\r\nimport { expandRefinersCount, IEveSearchResultContainerProps } from './eve-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IEveSearchResultContainerProps {\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 productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IEveSearchResultContainerProps,\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 = 'lg';\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n private isListPageStateUpdated: boolean = false;\r\n\r\n public constructor(props: IEveSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\r\n this._viewport = 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 this._updateViewport();\r\n }\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation?.Text;\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n const products = await this.props.data.products;\r\n\r\n this._updateListPageState(listPageState, products);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters?.length,\r\n listPageState.currentPageNumber,\r\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\r\n ];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n const input = new GetFullProductsByCollectionInput(\r\n newListPageState.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(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n\r\n // eslint-disable-next-line max-len -- existing code\r\n 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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n\r\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\r\n\r\n newListPageState.totalProductCount = productResults.count;\r\n newListPageState.activeProducts = productResults.products;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice();\r\n }\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n newListPageState.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 newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 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 undefined,\r\n this.catalogId\r\n );\r\n\r\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\r\n this.setState({ refiners });\r\n }\r\n }\r\n );\r\n\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice();\r\n }\r\n\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes\r\n ) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n config: { imageSettings, className },\r\n resources,\r\n data: { listPageState, products: productCollection, featureProduct }\r\n } = this.props;\r\n\r\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\r\n this._updateListPageState(listPageState.result, productCollection.result);\r\n this.isListPageStateUpdated = true;\r\n }\r\n\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\r\n let errorText = '';\r\n if (!ArrayExtensions.hasElements(products)) {\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: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n 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: searchProduct ? featureComponent : null,\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Update the list page state with initial data.\r\n * @param listPageState -- List page State.\r\n * @param products -- Products.\r\n */\r\n @action\r\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\r\n let querySorting: SortColumn[] = [];\r\n const defaultPageNumber: number = 10;\r\n\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 if (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 &&\r\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\r\n\r\n // let didSetActiveProductsInSearch = false;\r\n // if (listPageState.pageType === 'Search') {\r\n // const searchTerm = this.props.context.request.query && this.props.context.request.query['search'];\r\n\r\n // if (searchTerm) {\r\n // const match = products.products.find(pr => pr.ItemId?.toLowerCase() === searchTerm.toLowerCase());\r\n // if (match) {\r\n // listPageState.activeProducts = [\r\n // match,\r\n // ...products.products.filter(pr => pr.ItemId?.toLowerCase() !== searchTerm.toLowerCase())\r\n // ];\r\n // didSetActiveProductsInSearch = true;\r\n // }\r\n // }\r\n // }\r\n // if (!didSetActiveProductsInSearch) {\r\n // listPageState.activeProducts = products.products;\r\n // }\r\n\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n if (this.props.context.request.query?.productId) {\r\n const featureProduct = this.props.data.featureProduct.result;\r\n if (featureProduct) {\r\n listPageState.featureProduct = featureProduct;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n 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 dropdownOptions = this._getAllSortByOptions();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\r\n }\r\n\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\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.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n // eslint-disable-next-line max-len -- existing code\r\n const skipCount = listPageState?.currentPageNumber\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?.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 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) && !this._shouldHideFromRefiners(refiner);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n };\r\n\r\n /**\r\n * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\r\n return (\r\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId)\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 closeAriaLabel={resources.closeAriaLabel}\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 channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n />\r\n );\r\n };\r\n\r\n /**\r\n * Get Active products.\r\n * @returns - JSX Elements.\r\n */\r\n private readonly _getProducts = (): JSX.Element => {\r\n const {\r\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\r\n } = this.props;\r\n const { resources } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\r\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\r\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewSlot = this.props.slots?.quickview?.[0];\r\n\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={shouldAllowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewSlot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n // eslint-disable-next-line max-len -- existing code\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\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 /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves dropdown options.\r\n * @returns All dropdown options.\r\n */\r\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!searchConfiguration) {\r\n return [];\r\n }\r\n\r\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\r\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\r\n );\r\n\r\n return ArrayExtensions.validValues(mappedSearchConfiguration);\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(\r\n mappedSearchConfig =>\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: \r\n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n 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 if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{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\nimport { IPriceComponentResources } from '../../themes/gardner-theme/views/components/price.component';\r\nimport { ProductPrice, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button, getTelemetryObject, IPopupProps, Module, Node, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { PropsWithChildren, useState } from 'react';\r\nimport { ISearchResultContainerProps } from '../../themes/gardner-theme/definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport { ProductComponent } from '../../themes/gardner-theme/views/components/product.component';\r\nimport { getUrlSync, IGridSettings, IImageData, IImageProps, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { AddToCartListComponent } from '../../themes/gardner-theme/views/components/addToCart.component';\r\nimport { IProductSearchResultExtensionData } from '../../themes/gardner-theme/views/product-result-container.data';\r\nimport Table from 'reactstrap/lib/Table';\r\nimport { LoginToViewPricingComponent } from '../../components/LoginToViewPricing.component';\r\nimport { SupersessionKey } from '../../themes/gardner-theme/models/SupersessionKey';\r\nimport { CommercePropertyValueEnum } from '../../modules/allowable-freight/utils/CommercePropertyValueEnum';\r\nimport getExtensionPropertyValueByKey from '../../utils/getExtensionPropertyValueByKey';\r\nimport { EligibleItems } from '../../modules/eve-quick-order/eve-quick-order';\r\nimport GetProductEligibilityAction, { GetProductEligibilityInput } from '../../actions/get-product-eligibility.action';\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>\r\n): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => renderProductCardsDescription(props, product, index, false))}\r\n </ul>\r\n </Node>\r\n );\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\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>,\r\n product: ProductSearchResult,\r\n index: number,\r\n isEnabledProductDescription?: boolean\r\n): JSX.Element | null => {\r\n const { config, context, resources } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n const classname = isEnabledProductDescription\r\n ? 'ms-product-search-result__item product__description'\r\n : 'ms-product-search-result__item';\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n // @ts-ignore\r\n const isPriceMinMaxFeatureState = 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 loginToViewPricingText: resources.loginToViewPricing\r\n };\r\n return (\r\n <li className={classname} key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={isAllowBack}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n />\r\n </li>\r\n );\r\n};\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>\r\n): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) =>\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\r\n ? renderProductCardsDescription(props, product, index, true)\r\n : renderProductCardsDescription(props, product, index, false)\r\n )}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n return (\r\n <>\r\n <Node {...TitleContainer}>{title.titleCount}</Node>\r\n Not finding what you are looking for?\r\n </>\r\n );\r\n};\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\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\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps &\r\n ISearchResultContainerProps<IProductSearchResultExtensionData>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\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 FeatureSearchContainer,\r\n similarLookProduct,\r\n errorMessage,\r\n productPrices,\r\n context: {\r\n request,\r\n cultureFormatter,\r\n actionContext,\r\n actionContext: {\r\n requestContext: {\r\n gridSettings,\r\n user: { isAuthenticated }\r\n }\r\n }\r\n },\r\n resources: {\r\n filterText,\r\n partNoHeading,\r\n descriptionHeading,\r\n availabilityHeading,\r\n listPriceHeading,\r\n yourPriceHeading,\r\n loginToViewPricing,\r\n goToCartText,\r\n continueShoppingText,\r\n addToCartModalHeading,\r\n addToCartText\r\n },\r\n data: { cart, listPageState: productSearchResults },\r\n config: { enableProdutDescription, listView, imageSettings }\r\n } = props;\r\n\r\n const [eligbilityList, setEligbilityList] = useState<EligibleItems>([]);\r\n\r\n const getProductEligibility = async (): Promise<void> => {\r\n const itemIds = props.data.products?.result?.products.map(p => p.ItemId!) || [];\r\n if (!itemIds.length) {\r\n return;\r\n }\r\n\r\n // const addressId: string = props.context.request.cookies.getCheckoutCartCookie();\r\n const input = new GetProductEligibilityInput(itemIds, false, cart?.result?.cart?.Id || '', null, null, null);\r\n const eligibilityData = await GetProductEligibilityAction(input, props.context.actionContext);\r\n const list: EligibleItems = [];\r\n\r\n eligibilityData.forEach((i: any) => {\r\n const id = getExtensionPropertyValueByKey(i.ExtensionProperties, 'ItemId', CommercePropertyValueEnum.string);\r\n list.push({\r\n ItemId: String(id),\r\n IsEligible: i.IsEligible\r\n });\r\n });\r\n setEligbilityList(list);\r\n // getProductEligibilityAsync({ callerContext: props.context.actionContext }, itemIds, 0, addressId?.split(':')[1] || '').then(\r\n // (result: any) => {\r\n // const list: EligibleItems = [];\r\n //\r\n // result.forEach((i: any) => {\r\n // const id = getExtensionPropertyValueByKey(i.ExtensionProperties, 'ItemId', CommercePropertyValueEnum.string);\r\n // list.push({\r\n // ItemId: String(id),\r\n // IsEligible: i.IsEligible\r\n // });\r\n // });\r\n // setEligbilityList(list);\r\n // }\r\n // );\r\n };\r\n\r\n React.useEffect(() => {\r\n if (isAuthenticated) {\r\n void getProductEligibility();\r\n }\r\n }, [props.data]);\r\n\r\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\r\n const [modalOpen, setModalOpen] = React.useState<boolean>(false);\r\n const [addedProduct, setAddedProduct] = React.useState<SimpleProduct | undefined>(undefined);\r\n const [productPricing, setProductPricing] = React.useState<ProductPrice | undefined>(undefined);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n const setModalProps = (product: SimpleProduct, price: ProductPrice): IPopupProps => {\r\n return {\r\n modalOpen: modalOpen,\r\n context: props.context,\r\n className: 'list-view__modal',\r\n gridSettings,\r\n imageSettings,\r\n priceComponent: props.component,\r\n id: '1',\r\n productQuantity: 1,\r\n navigationUrl: getUrlSync('cart', actionContext),\r\n setModalOpen: value => setModalOpen(value),\r\n typeName: 'Add To Cart',\r\n data: { product, price },\r\n dialogStrings: {\r\n goToCartText: goToCartText,\r\n currentPriceText: '',\r\n continueShoppingText: continueShoppingText,\r\n freePriceText: '',\r\n headerItemOneText: addToCartModalHeading,\r\n headerItemFormatText: '',\r\n originalPriceText: '',\r\n headerMessageText: ''\r\n }\r\n };\r\n };\r\n\r\n const handleAddToCart = (productId: number, quantity: number) => {\r\n const foundProduct = productSearchResults.result?.activeProducts.find(pr => pr.RecordId === productId);\r\n if (!foundProduct) {\r\n return;\r\n }\r\n const product: SimpleProduct = {\r\n BasePrice: foundProduct.BasePrice || foundProduct.Price,\r\n AdjustedPrice: foundProduct.Price,\r\n Name: foundProduct.Name,\r\n RecordId: foundProduct.RecordId,\r\n ItemId: foundProduct.ItemId,\r\n ProductTypeValue: 1,\r\n Price: foundProduct.Price\r\n };\r\n setAddedProduct(product);\r\n setProductPricing(getProductPrice(productPrices, product.RecordId));\r\n cart.result\r\n ?.addProductToCart({\r\n product,\r\n count: quantity,\r\n catalogId: 0\r\n })\r\n .then(response => {\r\n if (response.status === 'SUCCESS' && props.app.config.addToCartBehavior === 'showModal') {\r\n setModalOpen(true);\r\n }\r\n });\r\n };\r\n\r\n const getProductSupersessionProperty = (product: ProductSearchResult, extensionKey: SupersessionKey) => {\r\n const properties = product.ExtensionProperties;\r\n if (properties) {\r\n return properties.find(pr => pr.Key === extensionKey)?.Value?.StringValue || null;\r\n }\r\n return null;\r\n };\r\n\r\n const renderAddtoCartButton = (pr: ProductSearchResult, courseId: any, courseInCartText: string) => {\r\n if (isAuthenticated) {\r\n if (courseId) {\r\n return (\r\n <td>\r\n <div className='eduerrors'>{courseInCartText}</div>\r\n </td>\r\n );\r\n }\r\n\r\n if (props.data.cart.result?.hasInvoiceLine) {\r\n return (\r\n <td>\r\n <div className='eduerrors'>{props.resources.invoiceInCartText}</div>\r\n </td>\r\n );\r\n } else {\r\n const item: any = eligbilityList.find(i => i.ItemId === pr.ItemId);\r\n\r\n return item?.IsEligible ? (\r\n <AddToCartListComponent productId={pr.RecordId} onAddToCart={handleAddToCart} addToCartButtonText={addToCartText} />\r\n ) : (\r\n <td colSpan={2} style={{ textAlign: 'right' }}>\r\n {item?.ItemId ? props.resources.productEligibilityText : ' '}\r\n </td>\r\n );\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const _renderProductsListView = () => {\r\n const { courseInCartText } = props.resources;\r\n let courseId: string | number | boolean | null | undefined;\r\n const cart = props.data.cart.result?.cart;\r\n const cartlines = cart?.CartLines;\r\n if (cartlines && cartlines.length) {\r\n courseId = getExtensionPropertyValueByKey(cartlines[0].ExtensionProperties, 'CourseId', CommercePropertyValueEnum.string);\r\n }\r\n return (\r\n <Table className={'list-view__table'}>\r\n <thead>\r\n <tr>\r\n <th />\r\n <th>{partNoHeading}</th>\r\n <th>{descriptionHeading}</th>\r\n <th>{availabilityHeading}</th>\r\n <th>{listPriceHeading}</th>\r\n <th>{yourPriceHeading}</th>\r\n {isAuthenticated ? (\r\n <>\r\n <th>Quantity</th>\r\n <th />\r\n </>\r\n ) : null}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {productSearchResults.result?.activeProducts.map(pr => {\r\n // const pricing = getProductPrice(productPrices, pr.RecordId);\r\n // const inventoryLabel = getInventoryLabel(configurationObject?.result?.channelInventoryConfigurationId, pr);\r\n const priceComponent = <span>{cultureFormatter.formatCurrency(pr.Price)}</span>;\r\n return (\r\n <tr key={pr.RecordId}>\r\n <td>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n gridSettings,\r\n `/Products/${pr.ItemId}_000_001.png`,\r\n pr.PrimaryImageUrl,\r\n pr.Name,\r\n request\r\n )}\r\n </td>\r\n <td>\r\n <a href={getProductPageUrlSync(pr.Name!, pr.RecordId, actionContext)}>{pr.ItemId}</a>\r\n <br />\r\n {getProductSupersessionProperty(pr, SupersessionKey.SupersededId) ? (\r\n <p className={'supersession-text'}>\r\n Superseded From: {getProductSupersessionProperty(pr, SupersessionKey.SupersededId)}\r\n </p>\r\n ) : null}\r\n </td>\r\n <td>\r\n {pr.Name}\r\n <br />\r\n {getProductSupersessionProperty(pr, SupersessionKey.SupersededName) ? (\r\n <p className={'supersession-text'}>\r\n Superseded From: {getProductSupersessionProperty(pr, SupersessionKey.SupersededName)}\r\n </p>\r\n ) : null}\r\n </td>\r\n <td>{getProductSupersessionProperty(pr, SupersessionKey.Inventory)}</td>\r\n <td>{LoginToViewPricingComponent(props.context.request, loginToViewPricing, priceComponent, true)}</td>\r\n <td>{!isAuthenticated ? null : cultureFormatter.formatCurrency(pr.Price)}</td>\r\n {renderAddtoCartButton(pr, courseId, courseInCartText)}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </Table>\r\n );\r\n };\r\n\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>\r\n )}\r\n {choiceSummary}\r\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n {errorMessage}\r\n {enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/* @ts-ignore */}\r\n {modalOpen && addedProduct ? <Popup {...setModalProps(addedProduct, productPricing)} /> : null}\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n )}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n <Node className='ms-refiner-heading'>\r\n <Node className='ms-refiner-heading_title'>\r\n <Button\r\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\r\n aria-label='Filter'\r\n onClick={toggle}\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n >\r\n {filterText}\r\n </Button>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\r\n <div className='ms-search-result-wrapper-sort-by-category'>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n </Node>\r\n <Node {...ProductSectionContainer}>\r\n {errorMessage}\r\n {/*{enableProdutDescription ? renderProducts(props) : renderProductCards(props)}*/}\r\n {listView ? _renderProductsListView() : enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <Node tag='h1' className=''>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst 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 if (productCardimageSettings) {\r\n productCardimageSettings.viewports = {\r\n lg: { h: 100, w: 100, q: '80' },\r\n md: { h: 100, w: 100, q: '80' },\r\n sm: { h: 100, w: 100, q: '80' },\r\n xs: { h: 100, w: 100, q: '80' }\r\n };\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\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return <Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} className={'eve-listview__img'} />;\r\n};\r\n\r\nconst getProductPrice = (pricing: ProductPrice[] | undefined, productRecId: number): ProductPrice | undefined => {\r\n if (!pricing) {\r\n return undefined;\r\n }\r\n return pricing.find(pr => pr.ProductId === productRecId);\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 {\r\n AddToOrderTemplateComponent,\r\n IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateActionErrorResult,\r\n IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getConfigureErrors,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonResources,\r\n IBuyboxData,\r\n IBuyboxState,\r\n IBuyboxViewProps } from '@msdyn365-commerce-modules/buybox';\r\nimport * as React from 'react';\r\n\r\nimport { IBuyboxProps as IBuyboxExtentionProps } from '../../definition-extensions/buybox.ext.props.autogenerated';\r\n\r\n/**\r\n * To generate AddToOrderTemplateDialog resources.\r\n * @param resources - The resources.\r\n * @returns -- Returns the list of AddToOrderTemplateDialog resources..\r\n */\r\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n}\r\n\r\n/**\r\n * To generate OrderTemplateNameDialog resources.\r\n * @param resources - The resources.\r\n * @returns -- Returns the list of OrderTemplateNameDialog resources..\r\n */\r\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxCommonResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n}\r\n\r\n/**\r\n * To generate ItemAddedToOrderTemplateDialog resources.\r\n * @param resources - The resources.\r\n * @returns -- Returns the list of ItemAddedToOrderTemplateDialog resources..\r\n */\r\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.priceFree,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n}\r\n\r\n/**\r\n * To generate DuplicateItemsWhenAddingToOrderTemplateDialog resources.\r\n * @param resources - The resources.\r\n * @returns -- Returns the list of DuplicateItemsWhenAddingToOrderTemplateDialog resources..\r\n */\r\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: IBuyboxCommonResources):\r\nIDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n}\r\n\r\n/**\r\n * Add to wishlist failed function.\r\n * @param callbacks -Buybox callbacks.\r\n * @param resources -Buybox resources.\r\n * @param product -Simple product.\r\n * @returns Update error state.\r\n */\r\nconst onAddToOrderTemplateFailed = (callbacks: IBuyboxCallbacks,\r\n resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (result: IOrderTemplateActionErrorResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'ORDER_TEMPLATE',\r\n configureErrors: result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n};\r\n\r\n/**\r\n * RenderAddToOrderTemplateButton.\r\n * @param props - Buybox view props.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @param product - Product data.\r\n * @returns -- Returns JSX element.\r\n */\r\nexport const renderAddToOrderTemplateButton = (props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks, product: SimpleProduct): React.ReactNode => {\r\n\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file.\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n quantity\r\n } = state;\r\n\r\n const isShowButtonText = true;\r\n\r\n return orderTemplates && (\r\n <AddToOrderTemplateComponent\r\n className='msc-add-to-cart-extra-actions'\r\n addToOrderTemplateButtonText={resources.addToOrderTemplateButtonText}\r\n addToOrderTemplateButtonTooltip={resources.addToOrderTemplateButtonTooltip}\r\n addToOrderTemplateDialogResources={generateAddToOrderTemplateDialogResources(resources)}\r\n createOrderTemplateDialogResources={generateOrderTemplateNameDialogResources(resources)}\r\n itemAddedToOrderTemplateDialogResources={generateItemAddedToOrderTemplateDialogResources(resources)}\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources={generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources)}\r\n data={{ product, quantity, orderTemplates, customerInformation }}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n onError={onAddToOrderTemplateFailed(callbacks, resources, product)}\r\n shouldShowButtonFailedTooltip={state.isCustomPriceSelected}\r\n showButtonTooltip={false}\r\n showButtonText={isShowButtonText}\r\n />\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n AddToWishlistComponent,\r\n IWishlistActionErrorResult\r\n} from \"@msdyn365-commerce/components\";\r\nimport { format, ItemAvailability, SimpleProduct } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { IStoreInfo } from \"@msdyn365-commerce-modules/bopis-utilities\";\r\nimport {\r\n getConfigureErrors,\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonResources,\r\n IBuyboxData,\r\n IBuyboxFindInStoreViewProps,\r\n IBuyboxKeyInPriceViewProps,\r\n IBuyboxProductConfigureDropdownViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps,\r\n IBuyboxResources as IBuyboxExtentionResources,\r\n IBuyboxShopSimilarLookViewProps,\r\n IBuyboxState,\r\n IBuyboxViewProps\r\n} from \"@msdyn365-commerce-modules/buybox\";\r\nimport {\r\n ArrayExtensions, getFullAvailableInventoryNearby, GetFullAvailableInventoryNearbyInput,\r\n IFullOrgUnitAvailability\r\n} from \"@msdyn365-commerce-modules/retail-actions\";\r\nimport { IncrementalQuantity, INodeProps, ITelemetryContent, Module, Node } from \"@msdyn365-commerce-modules/utilities\";\r\nimport { reaction } from \"mobx\";\r\nimport * as React from \"react\";\r\nimport { getInventoryLevelRangesAsync } from \"../../../actions/DataActionExtension.g\";\r\nimport { SupersessionKey } from \"../../gardner-theme/models/SupersessionKey\";\r\nimport getExtensionPropertyValueByKey, { CommercePropertyValueEnum } from \"../../../utils/getExtensionPropertyValueByKey\";\r\nimport { IItemInventoryLevelProfileEntity, IProfileDataMap } from \"../../../actions/DataServiceEntities.g\";\r\n\r\nimport {\r\n IBuyboxProps as IBuyboxExtentionProps,\r\n IBuyboxProps\r\n} from \"../definition-extensions/buybox.ext.props.autogenerated\";\r\nimport { renderAddToOrderTemplateButton } from \"./components/buybox-add-to-order-template\";\r\nimport { RichTextComponent } from \"@msdyn365-commerce/core\";\r\nimport { IBuyBoxDataExtended } from \"../definition-extensions/buybox.data\";\r\n/**\r\n * BuyBoxConstants enum.\r\n */\r\nexport enum BuyBoxConstants {\r\n zero = 0\r\n}\r\n\r\n/**\r\n * On Change function.\r\n * @param callbacks -Callbacks.\r\n * @returns Update quantity.\r\n */\r\nconst onChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number): boolean => {\r\n if (callbacks.updateQuantity) {\r\n return callbacks.updateQuantity(newValue);\r\n }\r\n return true;\r\n};\r\n\r\nconst _renderLoginURL = (url?: string, text?: string): JSX.Element => {\r\n return (\r\n <p className=\"msc-product__loginURL\">\r\n <a href={url}>{text}</a>\r\n </p>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * RenderQuantity.\r\n * @param quantityComponent - QuantityComponent.\r\n * @param callbacks - Callbacks.\r\n * @param props - Props.\r\n * @param state - State.\r\n * @param extentionResources - ExtentionResources.\r\n * @param quantityLimitsMessages - QuantityLimitsMessages.\r\n * @param max - Max.\r\n * @param telemetryContent - TelemetryContent.\r\n * @param unitOfMeasure - Unit Of Measure.\r\n * @returns -- Returns.\r\n */\r\nconst renderQuantity = (\r\n quantityComponent: IBuyboxProductQuantityViewProps,\r\n callbacks: IBuyboxCallbacks,\r\n props: IBuyboxProps<IBuyboxData>,\r\n state: IBuyboxState,\r\n extentionResources: IBuyboxExtentionResources,\r\n quantityLimitsMessages: React.ReactNode,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n max: number | undefined,\r\n telemetryContent?: ITelemetryContent,\r\n unitOfMeasure?: React.ReactNode): JSX.Element => {\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const { ContainerProps, LabelContainerProps, heading, errors } = quantityComponent;\r\n\r\n const {\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n quantity\r\n } = state;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n {errors}\r\n </Node>\r\n\r\n <IncrementalQuantity\r\n id=\"ms-buybox__product-quantity-input\"\r\n max={max}\r\n currentCount={quantity}\r\n onChange={onChangeHandler(callbacks)}\r\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\r\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\r\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\r\n minQuantityText={extentionResources.minQuantityText}\r\n maxQuantityText={extentionResources.maxQuantityText}\r\n telemetryContent={telemetryContent}\r\n />\r\n {unitOfMeasure}\r\n {quantityLimitsMessages}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render key in price function.\r\n * @param keyInPrice - KeyInPrice.\r\n * @returns -- Returns.\r\n */\r\nconst renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderAddToCart.\r\n * @param addToCart - AddToCart.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToCart = (addToCart: IBuyboxAddToCartViewProps, product: SimpleProduct | undefined, inventoryRangesList: IProfileDataMap[], unavailableText: string): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n if (product) {\r\n const invPropertyValue = getExtensionPropertyValueByKey(product.ExtensionProperties, SupersessionKey.Inventory, CommercePropertyValueEnum.string)\r\n const currentInvString = invPropertyValue ? invPropertyValue.toString() : '0';\r\n const currentInventory = parseInt(currentInvString, 10);\r\n let invProfOos: IItemInventoryLevelProfileEntity | undefined;\r\n inventoryRangesList.map(ir => {\r\n const tempInvRange = ir.Profile?.find(p => p.ItemId === product.ItemId && p.Code === 'OOS');\r\n if (tempInvRange) {\r\n invProfOos = tempInvRange;\r\n }\r\n });\r\n \r\n const OosUpperBound = invProfOos?.hasOwnProperty('UpperBoundInclusive') && invProfOos?.UpperBoundInclusive !== undefined ? invProfOos.UpperBoundInclusive : 0;\r\n const isOutOfStock = currentInventory <= OosUpperBound;\r\n \r\n \r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {!isOutOfStock ? button : (\r\n <div className=\"ms-buybox__inventory-info\">{unavailableText}</div>\r\n )}\r\n </Node>\r\n );\r\n }\r\n return <></>;\r\n};\r\n\r\n/**\r\n * RenderFindInStore.\r\n * @param findInStore - FindInStore.\r\n * @returns -- Returns.\r\n */\r\nconst renderFindInStore = (findInStore: IBuyboxFindInStoreViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const {\r\n ContainerProps,\r\n storeSelector,\r\n heading,\r\n description,\r\n errors,\r\n button,\r\n modal,\r\n productPickupOptionList\r\n } = findInStore;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {storeSelector}\r\n {heading}\r\n {productPickupOptionList}\r\n {description}\r\n {errors}\r\n {button}\r\n {modal}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderAddToOrderTemplate.\r\n * @param props - Buybox view props.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToOrderTemplate = (props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks): JSX.Element | null => {\r\n const product = props.data.product.result;\r\n if (!props.addToOrderTemplate || !product) {\r\n return null;\r\n }\r\n\r\n const orderTemplateButton = renderAddToOrderTemplateButton(props, state, callbacks, product);\r\n\r\n return (\r\n <Node {...props.addToOrderTemplate.ContainerProps}>\r\n {props.addToOrderTemplate.errorBlock}\r\n {orderTemplateButton}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Add to wishlist failed function.\r\n * @param callbacks -Buybox callbacks.\r\n * @param resources -Buybox resources.\r\n * @param product -Simple product.\r\n * @returns Update error state.\r\n */\r\nconst onAddToWishlistFailed = (callbacks: IBuyboxCallbacks,\r\n resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (result: IWishlistActionErrorResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: \"WISHLIST\",\r\n configureErrors: result.status === \"MISSINGDIMENSION\" ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n};\r\n\r\n/**\r\n * RenderAddToWishlist.\r\n * @param props - Buybox view props.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @param product - Product data.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddtoWishlistButton = (props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks, product: SimpleProduct): React.ReactNode => {\r\n const { context, resources } = props;\r\n const wishlists = props.data.wishlists.result;\r\n const isShowWishlitButtonText = true;\r\n return (\r\n <AddToWishlistComponent\r\n className=\"msc-add-to-cart-extra-actions\"\r\n addToWishlistButtonText={resources.addToWishlistButtonText}\r\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\r\n addToWishlistMessage={resources.addToWishlistMessage}\r\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\r\n addItemToWishlistError={resources.addItemToWishlistError}\r\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\r\n nameOfWishlist={resources.nameOfWishlist}\r\n data={{ product, wishlists }}\r\n context={context}\r\n ariaRole=\"button\"\r\n id={props.id}\r\n typeName={props.typeName}\r\n onError={onAddToWishlistFailed(callbacks, resources, product)}\r\n getSelectedProduct={state.selectedProduct}\r\n showButtonText={isShowWishlitButtonText}\r\n showButtonTooltip={false}\r\n />\r\n );\r\n};\r\n\r\n/**\r\n * RenderAddToWishlist.\r\n * @param props - Buybox viewprops.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToWishlist = (props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks): JSX.Element | null => {\r\n const product = props.data.product.result;\r\n if (!props.addToWishlist || !product) {\r\n return null;\r\n }\r\n\r\n const wishlistButton = renderAddtoWishlistButton(props, state, callbacks, product);\r\n return (\r\n <Node {...props.addToWishlist.ContainerProps}>\r\n {props.addToWishlist.errorBlock}\r\n {wishlistButton}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RRenderShopSimilarItem.\r\n * @param shopSimilarItem - ShopSimilarItem.\r\n * @returns -- Returns.\r\n */\r\nconst renderShopSimilarItem = (shopSimilarItem: IBuyboxShopSimilarLookViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const { ContainerProps, errors, input } = shopSimilarItem;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errors}\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderSocialShare.\r\n * @param socialShare - Social share react node array.\r\n * @returns -- Returns.\r\n */\r\nconst _renderSocialShare = (socialShare: React.ReactNode[]): JSX.Element | undefined => {\r\n if (!socialShare || socialShare.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n <>\r\n {socialShare[0]}\r\n </>\r\n );\r\n};\r\n\r\n/**\r\n * RenderConfigureDropdown.\r\n * @param dropdown - Buybox product configure dropdown view props.\r\n * @returns -- Returns JSX.Element.\r\n */\r\nconst renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {select}\r\n {errors}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderConfigure.\r\n * @param configure - Buybox product configure view props.\r\n * @returns -- Returns JSX.Element.\r\n */\r\nconst renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\r\n const { ContainerProps, dropdowns } = configure;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {dropdowns.map(renderConfigureDropdown)}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * BuyboxView.\r\n * @param props - Props.\r\n * @returns -- Returns.\r\n */\r\nconst BuyboxView: React.FC<IBuyboxViewProps & IBuyboxExtentionProps<IBuyBoxDataExtended>> = props => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const {\r\n ModuleProps,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n MediaGalleryContainerProps,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n ProductInfoContainerProps,\r\n addToCart,\r\n addToOrderTemplate,\r\n addToWishlist,\r\n configure,\r\n findInStore,\r\n quantity,\r\n price,\r\n title,\r\n rating,\r\n inventoryLabel,\r\n shopSimilarLook,\r\n keyInPrice,\r\n shopSimilarDescription,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n max,\r\n unitOfMeasure,\r\n callbacks,\r\n state,\r\n resources,\r\n resources: {\r\n loginToViewPricing,\r\n productUnavailableText\r\n },\r\n data: { enhancedDescription },\r\n quantityLimitsMessages,\r\n telemetryContent,\r\n config: {\r\n onlyShowPriceWhenAuthenticated,\r\n enableShopSimilarDescription,\r\n enableShopSimilarLooks\r\n },\r\n context: {\r\n request: {\r\n user: { signInUrl, isAuthenticated }\r\n }\r\n },\r\n app: {\r\n config: appConfig\r\n }\r\n } = props;\r\n\r\n let skuText: string = props.resources.skuText;\r\n skuText += props.data.product.result?.ItemId;\r\n const preferredStoreInfo: IStoreInfo | undefined = props.data.storeSelectorStateManager.result?.preferredStore;\r\n const preferredStoreId = preferredStoreInfo?.StoreId ? preferredStoreInfo.StoreId : \"\";\r\n const preferredStoreName = preferredStoreInfo?.StoreName ? preferredStoreInfo.StoreName : \"\";\r\n const product = props.data.product.result;\r\n\r\n const [availability, setAvailability] = React.useState<string>(\"\");\r\n const [isStoreChange, setIsStoreChange] = React.useState<boolean>(false);\r\n const [areInventoryRangesChecked, setAreInventoryRangesChecked] = React.useState<boolean>(false);\r\n const [inventoryRangesList, setInventoryRangesList] = React.useState<IProfileDataMap[]>([]);\r\n\r\n const getInvProfs = async (): Promise<void> => {\r\n if (areInventoryRangesChecked) {\r\n return;\r\n }\r\n const itemId = props.data.product.result?.ItemId || '';\r\n const resp = await getInventoryLevelRangesAsync({ callerContext: props.context.actionContext }, [itemId]);\r\n console.log(resp);\r\n setAreInventoryRangesChecked(true);\r\n setInventoryRangesList(resp);\r\n }\r\n\r\n React.useEffect(() => {\r\n void getInvProfs();\r\n }, [props.data.product]);\r\n\r\n const shouldShowShopOptions = enableShopSimilarDescription || enableShopSimilarLooks;\r\n /**\r\n * GetStockInventoryLabel.\r\n * @param availabilityWithHours - Stock availability with hours.\r\n * @returns -- Returns.\r\n */\r\n const getStockInventoryLabel = (availabilityWithHours: IFullOrgUnitAvailability | undefined): string | undefined => {\r\n if (availabilityWithHours && ArrayExtensions.hasElements(availabilityWithHours.ProductInventoryInformation)) {\r\n for (const productInventoryInformation of availabilityWithHours.ProductInventoryInformation) {\r\n if (availabilityWithHours.OrgUnitAvailability?.OrgUnitLocation?.InventoryLocationId ===\r\n productInventoryInformation.InventLocationId) {\r\n return productInventoryInformation.StockLevelLabel;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n const getInventory = React.useCallback(async () => {\r\n const input = new GetFullAvailableInventoryNearbyInput(props.data.product.result?.RecordId, BuyBoxConstants.zero,\r\n BuyBoxConstants.zero, BuyBoxConstants.zero, BuyBoxConstants.zero, true);\r\n\r\n /**\r\n * IsProductInStock.\r\n * @param itemAvailabilities - Item availability array.\r\n * @returns -- Returns.\r\n */\r\n const isProductInStock = (itemAvailabilities: ItemAvailability[] | undefined): boolean => {\r\n if (!appConfig.enableStockCheck) {\r\n return true;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(itemAvailabilities)) {\r\n return itemAvailabilities[BuyBoxConstants.zero].AvailableQuantity! > BuyBoxConstants.zero;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n await getFullAvailableInventoryNearby(input, props.context.actionContext).catch((error: Error) => {\r\n props.telemetry.error(error.message);\r\n }).then(response => {\r\n if (response && ArrayExtensions.hasElements(response)) {\r\n const isPreferredStore = (value: IFullOrgUnitAvailability) => value.OrgUnitAvailability?.OrgUnitLocation?.OrgUnitNumber === preferredStoreId;\r\n const filteredFullOrgUnitAvailability = response.filter(isPreferredStore);\r\n const preferredStoreAvailability = ArrayExtensions.hasElements(filteredFullOrgUnitAvailability) ? (\r\n filteredFullOrgUnitAvailability[BuyBoxConstants.zero]) : undefined;\r\n const stockStatusLabel: string | undefined = getStockInventoryLabel(preferredStoreAvailability);\r\n const isInStock = isProductInStock(preferredStoreAvailability?.OrgUnitAvailability?.ItemAvailabilities);\r\n const resourceLabel = isInStock ? props.resources.inStockText : props.resources.outOfStockText;\r\n const stockText: string | undefined = stockStatusLabel ? stockStatusLabel : resourceLabel;\r\n const preferredStoreAvailabilityText = `${format(props.resources.availabilityAtPreferredStoreText, preferredStoreName)} ${stockText}`;\r\n setAvailability(preferredStoreAvailabilityText);\r\n }\r\n });\r\n\r\n setIsStoreChange(false);\r\n }, [\r\n props.data.product.result?.RecordId, appConfig.enableStockCheck, preferredStoreId, preferredStoreName, props.context.actionContext,\r\n props.resources.availabilityAtPreferredStoreText, props.resources.inStockText, props.resources.outOfStockText, props.telemetry\r\n ]);\r\n\r\n React.useEffect(() => {\r\n if (props.config.displayStockAvailability) {\r\n getInventory().catch((error: Error) => {\r\n props.telemetry.error(error.message);\r\n });\r\n }\r\n }, [getInventory, isStoreChange, props.telemetry, props.config.displayStockAvailability]);\r\n\r\n reaction(\r\n () => props.data.storeSelectorStateManager.result?.selectedStoreLocationId,\r\n () => {\r\n setIsStoreChange(true);\r\n }\r\n );\r\n\r\n\r\n /**\r\n * RenderAvailabiltyAtPreferredStore.\r\n * @returns -- Returns.\r\n */\r\n const renderAvailabilityAtPreferredStore = (): JSX.Element | undefined => {\r\n const hasProductDimensions = ArrayExtensions.hasElements(props.data.product.result?.Dimensions);\r\n if (hasProductDimensions && props.data.product.result?.MasterProductId === undefined) {\r\n return undefined;\r\n }\r\n const containerProps: INodeProps = {\r\n className: \"ms-buybox__preferred-store-availability\",\r\n tag: \"span\"\r\n };\r\n\r\n return (\r\n <Node {...containerProps}>\r\n {availability}\r\n </Node>\r\n );\r\n };\r\n return (\r\n <Module {...ModuleProps}>\r\n <Node {...MediaGalleryContainerProps}>\r\n {props.mediaGallery}\r\n </Node>\r\n <Node {...ProductInfoContainerProps}>\r\n {title}\r\n <Node className=\"msc-buybox__ratings-section\">\r\n <div className=\"msc-buybox__ratings-section-sku-text\">\r\n {skuText}\r\n </div>\r\n {rating}\r\n </Node>\r\n {(isAuthenticated || !onlyShowPriceWhenAuthenticated) ? (\r\n <Node className=\"msc-buybox__price-section\">\r\n <div className=\"msc-buybox__price-section-text\">\r\n {props.resources.priceText}\r\n </div>\r\n {price}\r\n </Node>\r\n ) : _renderLoginURL(signInUrl, loginToViewPricing)}\r\n\r\n {configure && renderConfigure(configure)}\r\n {keyInPrice && renderKeyInPrice(keyInPrice)}\r\n <Node className=\"msc-buybox__bulk-purchase-section\">\r\n <div className=\"msc-buybox__bulk-purchase-button-text\">\r\n {quantity && renderQuantity(quantity, callbacks, props, state, resources, quantityLimitsMessages, max, telemetryContent, unitOfMeasure)}\r\n {props.bulkPurchaseLink}\r\n </div>\r\n </Node>\r\n {props.config.displayStockAvailability && preferredStoreId && renderAvailabilityAtPreferredStore()}\r\n {inventoryLabel}\r\n {renderAddToCart(addToCart, product, inventoryRangesList, productUnavailableText)}\r\n {findInStore && renderFindInStore(findInStore)}\r\n {addToWishlist && renderAddToWishlist(props, state, callbacks)}\r\n {addToOrderTemplate && renderAddToOrderTemplate(props, state, callbacks)}\r\n {findInStore?.productPickupOptionList ? <div className=\"msc-buybox__pickup-options\">\r\n {findInStore.productPickupOptionList}\r\n </div> : null}\r\n {_renderSocialShare(props.slots && props.slots.socialShare)}\r\n {shouldShowShopOptions ? (\r\n <React.Fragment>\r\n <div className=\"msc-buybox__description-text\">\r\n {props.resources.shopText}\r\n </div>\r\n <Node className=\"msc-buybox__shop-description\">\r\n {shopSimilarLook && renderShopSimilarItem(shopSimilarLook)}\r\n {shopSimilarDescription && renderShopSimilarItem(shopSimilarDescription)}\r\n </Node>\r\n </React.Fragment>\r\n ) : null}\r\n\r\n <Node className=\"msc-buybox__description-section\">\r\n <div className=\"msc-buybox__description-section-text\">\r\n {props.resources.descriptionText}\r\n </div>\r\n {/* 6704 - Remove the original desription and replace with the enhanced description */}\r\n {/* {description} */}\r\n <RichTextComponent text={enhancedDescription.result?.description}/>\r\n </Node>\r\n {ArrayExtensions.hasElements(props.slots.productSpecification) ?\r\n <Node className=\"msc-buybox__product-specification\">\r\n {props.slots.productSpecification[0]}\r\n </Node> : null}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nexport default BuyboxView;\r\n","import React from 'react';\r\n\r\ninterface IAddToCartListComponentProps {\r\n productId: number\r\n onAddToCart(id: number, quantity: number): void;\r\n addToCartButtonText: string\r\n}\r\n\r\nexport const AddToCartListComponent: React.FC<IAddToCartListComponentProps> = ({productId, onAddToCart, addToCartButtonText}) => {\r\n\r\n const [ quantity , setQuantity ] = React.useState<number>(1);\r\n\r\n const handleQuantityChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setQuantity(e.target.valueAsNumber);\r\n }\r\n const handleAddToCart = () => onAddToCart(productId, quantity);\r\n\r\n return (\r\n <>\r\n <td>\r\n <input type=\"number\" min={\"1\"} max={\"10\"} value={quantity} aria-label={'Change Quantity'} onChange={handleQuantityChange}/>\r\n </td>\r\n <td><button type={'button'} className={'list-view__add-to-cart-btn msc-button'} onClick={handleAddToCart}>{addToCartButtonText}</button></td>\r\n </>\r\n )\r\n}","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { ISwatchItem, PriceComponent, ProductComponentSwatchComponent, RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IPriceComponentResources } from './price.component'\r\nimport { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, convertDimensionTypeToProductDimensionType, Dictionary, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n// import { LoginToViewPricingComponent } from \"../../../../components/LoginToViewPricing.component\";\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 isEnabledProductDescription?: boolean;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n inventoryLabel?: string;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\nconst PriceComponentActions = {};\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\nfunction 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(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\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\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n}\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\nfunction 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 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\nfunction 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>\r\n {unitOfMeasure}\r\n </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\nfunction 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>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\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\nfunction getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productUrl;\r\n }\r\n\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\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 isEnabledProductDescription,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n inventoryLabel,\r\n dimensionAvailabilities\r\n}) => {\r\n const product = data.product;\r\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\r\n if (allowBack) {\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 const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\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((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\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) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [selectedSwatchItems, context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\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 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 * 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 {\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\r\n const siteContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = 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 isDisabled: enableStockCheck && dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? ''))?.isDisabled\r\n };\r\n }) ?? [];\r\n if (dimensionToPreSelectInProductCard !== DimensionTypes.none && ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n context={context}\r\n swatches={swatches}\r\n onSelectDimension={updatePageAndImageUrl}\r\n key={item.RecordId}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\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 const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\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 return (\r\n <>\r\n {isEnabledProductDescription ? <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, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image__description'>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context)}\r\n </div>\r\n <div className='msc-product__title_description'>\r\n <h5 className='msc-product__title__text'>\r\n {product.Name}\r\n </h5>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n </div>\r\n </div>\r\n </a> : <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(product.Name, context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl, product.PrimaryImageUrl, product.Name, context)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h5 className='msc-product__title'>\r\n {product.Name}\r\n </h5>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n </div>\r\n </a>}\r\n {renderProductDimensions(product.AttributeValues)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n </>\r\n );\r\n};\r\n\r\nfunction 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): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n}\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction 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\nfunction renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string, ratingCountAriaLabel?: string): 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\nfunction renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string, isPriceMinMaxEnabled?: boolean, priceResources?: IPriceComponentResources): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n const priceComponent = (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price }}\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n console.log(priceResources);\r\n return priceComponent;\r\n // return (\r\n // LoginToViewPricingComponent(\r\n // context.request,\r\n // priceResources?.loginToViewPricingText || '',\r\n // priceComponent,\r\n // true\r\n // )\r\n // );\r\n}\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string,\r\n context?: ICoreContext): 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 fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n requestContext={context?.actionContext.requestContext} {...img} {...imageProps}\r\n loadFailureBehavior='empty' />\r\n );\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\nexport default ProductComponent;\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 { AddToWishlistComponent, IWishlistActionErrorResult } from '@msdyn365-commerce/components';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getConfigureErrors, IBuyboxAddToCartViewProps,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonResources,\r\n IBuyboxKeyInPriceViewProps,\r\n IBuyboxProductConfigureDropdownViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps,\r\n IBuyboxState,\r\n IQuickviewViewProps } from '@msdyn365-commerce-modules/buybox';\r\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IQuickviewProps as IQuickviewPropsExtend } from '../definition-extensions/quickview.ext.props.autogenerated';\r\n\r\n/**\r\n * RenderAddToCart.\r\n * @param addToCart - AddToCart.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {button}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Add to wishlist failed function.\r\n * @param callbacks -Buybox callbacks.\r\n * @param resources -Buybox resources.\r\n * @param product -Simple product.\r\n * @returns Update error state.\r\n */\r\nconst onAddToWishlistFailed = (callbacks: IBuyboxCallbacks | undefined,\r\n resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (result: IWishlistActionErrorResult) => {\r\n callbacks?.updateErrorState({\r\n errorHost: 'WISHLIST',\r\n configureErrors: result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n};\r\n\r\n/**\r\n * RenderAddToWishlist.\r\n * @param props - Buybox viewprops.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @param product - Product data.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddtoWishlistButton = (props: IQuickviewViewProps,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks | undefined, product: SimpleProduct): React.ReactNode => {\r\n const { context, resources } = props;\r\n const wishlists = props.data.wishlists.result;\r\n const isShowWishlitButtonText = true;\r\n return (\r\n <AddToWishlistComponent\r\n className='msc-add-to-cart-extra-actions'\r\n addToWishlistButtonText={resources.addToWishlistButtonText}\r\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\r\n addToWishlistMessage={resources.addToWishlistMessage}\r\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\r\n addItemToWishlistError={resources.addItemToWishlistError}\r\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\r\n nameOfWishlist={resources.nameOfWishlist}\r\n data={{ product, wishlists }}\r\n context={context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n onError={onAddToWishlistFailed(callbacks, resources, product)}\r\n getSelectedProduct={state.selectedProduct}\r\n showButtonText={isShowWishlitButtonText}\r\n showButtonTooltip={false}\r\n />\r\n );\r\n};\r\n\r\n/**\r\n * RenderAddToWishlist.\r\n * @param props - Buybox viewprops.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToWishlist = (props: IQuickviewViewProps,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks | undefined): JSX.Element | null => {\r\n const product = props.productDetails?.product;\r\n if (!props.addToWishlist || !product) {\r\n return null;\r\n }\r\n\r\n const wishlistButton = renderAddtoWishlistButton(props, state, callbacks, product);\r\n return (\r\n <Node {...props.addToWishlist.ContainerProps}>\r\n {props.addToWishlist.errorBlock}\r\n {wishlistButton}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderQuantity.\r\n * @param quantity - Quantity.\r\n * @param quantityLimitsMessages - QuantityLimitsMessages.\r\n * @param props - Props.\r\n * @returns -- Returns.\r\n */\r\nconst renderQuantity = (quantity: IBuyboxProductQuantityViewProps, quantityLimitsMessages: React.ReactNode, props: IQuickviewViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\r\n const { unitOfMeasure } = props;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {input}\r\n {unitOfMeasure}\r\n {quantityLimitsMessages}\r\n {errors}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * KenderKeyInPrice.\r\n * @param keyInPrice - KeyInPrice.\r\n * @returns -- Returns.\r\n */\r\nconst renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderConfigureDropdown.\r\n * @param dropdown - Buybox product configure dropdown view props.\r\n * @returns -- Returns JSX.Element.\r\n */\r\nconst renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {select}\r\n {errors}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderConfigure.\r\n * @param configure - Buybox product configure view props.\r\n * @returns -- Returns JSX.Element.\r\n */\r\nconst renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\r\n const { ContainerProps, dropdowns } = configure;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {dropdowns.map(renderConfigureDropdown)}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderBodyContent.\r\n * @param props - Props.\r\n * @returns -- Returns.\r\n */\r\nconst renderBodyContent = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>): JSX.Element => {\r\n const { price, keyInPrice, quantity, inventoryLabel, quantityLimitsMessages, loading,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n ProductInfoContainerProps, MediaGalleryContainerProps, CarouselProps, addToWishlist, configure, callbacks, state } = props;\r\n if (loading) {\r\n return (\r\n <>\r\n {loading}\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <Node {...MediaGalleryContainerProps}>\r\n <Node {...CarouselProps} />\r\n </Node>\r\n <Node {...ProductInfoContainerProps}>\r\n <Node className='msc-quickview__price-section'>\r\n <Node className='msc-quickview__price-section-text'>\r\n {props.resources.priceText}\r\n {price}\r\n </Node>\r\n {addToWishlist && renderAddToWishlist(props, state, callbacks)}\r\n </Node>\r\n {configure && renderConfigure(configure)}\r\n {keyInPrice && renderKeyInPrice(keyInPrice)}\r\n {quantity && renderQuantity(quantity, quantityLimitsMessages, props)}\r\n {inventoryLabel}\r\n </Node>\r\n </>\r\n );\r\n\r\n};\r\n\r\n/**\r\n * RenderQuickViewPopup.\r\n * @param props - Props.\r\n * @returns -- Returns.\r\n */\r\nconst renderQuickViewPopup = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n const { ModalContainer, ModalHeaderContainer, ModalFooterContainer, ModalHeaderContent, ModalBodyContainer, addToCart,\r\n cartContainerProps, seeDetailsbutton } = props;\r\n\r\n return (\r\n <Module {...ModalContainer}>\r\n <Node {...ModalHeaderContainer}>\r\n {ModalHeaderContent}\r\n <Node className='msc-quickview__heading'>\r\n {props.title}\r\n {!props.loading && !StringExtensions.isNullOrEmpty(props.state.productPrice?.ItemId) ? <Node className='msc-quickview__sku-text'>\r\n {props.resources.skuText}\r\n {props.state.productPrice?.ItemId}\r\n </Node> : ''}\r\n {props.rating}\r\n </Node>\r\n </Node>\r\n <Node {...ModalBodyContainer}>\r\n {renderBodyContent(props)}\r\n </Node>\r\n <Node {...ModalFooterContainer}>\r\n <Node {...cartContainerProps}>\r\n {addToCart && seeDetailsbutton}\r\n {addToCart && renderAddToCart(addToCart)}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Functional component which renders quick view button and popup based by the given props file.\r\n * @param props - Configuration for the quick view component.\r\n * @returns - Functional component of the quick view.\r\n */\r\nexport const QuickViewFunctionalComponent:\r\nReact.FC<IQuickviewViewProps & IQuickviewPropsExtend<{}>> = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>) => {\r\n const { quickView, quickViewButton, isModalOpen } = props;\r\n const quickViewUpdatedProps: IModuleProps = { ...quickView, title: props.resources.quickViewbuttonText };\r\n return (\r\n <Module {...quickViewUpdatedProps}>\r\n {quickViewButton}\r\n {isModalOpen && renderQuickViewPopup(props)}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default QuickViewFunctionalComponent;\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 { IPriceComponentResources } from \"./components/price.component\";\r\nimport { ProductPrice, ProductSearchResult, SimpleProduct } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { ArrayExtensions, getProductPageUrlSync } from \"@msdyn365-commerce-modules/retail-actions\";\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from \"@msdyn365-commerce-modules/search-result-container\";\r\nimport {\r\n Button,\r\n getTelemetryObject,\r\n IPopupProps,\r\n Module,\r\n Node,\r\n Popup\r\n} from \"@msdyn365-commerce-modules/utilities\";\r\nimport React, { PropsWithChildren, useState } from \"react\";\r\nimport { _getGlobalState, } from \"mobx\"\r\nimport { ISearchResultContainerProps } from \"../definition-extensions/search-result-container.ext.props.autogenerated\";\r\nimport { ProductComponent } from \"./components/product.component\";\r\nimport {\r\n getUrlSync,\r\n IGridSettings,\r\n IImageData,\r\n IImageProps,\r\n IImageSettings,\r\n Image,\r\n IRequestContext\r\n} from \"@msdyn365-commerce/core\";\r\nimport { AddToCartListComponent } from \"./components/addToCart.component\";\r\nimport { IProductSearchResultExtensionData } from \"./product-result-container.data\";\r\nimport { getInventoryLevelRangesAsync } from \"../../../actions/DataActionExtension.g\";\r\nimport { SupersessionKey } from \"../../gardner-theme/models/SupersessionKey\";\r\nimport getProductSupersessionProperty from \"../../gardner-theme/models/getProductSupersessionProperty\";\r\nimport { IItemInventoryLevelProfileEntity, IProfileDataMap } from \"../../../actions/DataServiceEntities.g\";\r\nimport Table from \"reactstrap/lib/Table\";\r\n// import { LoginToViewPricingComponent } from \"../../../components/LoginToViewPricing.component\";\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className=\"list-unstyled\">\r\n {products.map((product: ProductSearchResult, index: number) => renderProductCardsDescription(props, product, index, false))}\r\n </ul>\r\n </Node>\r\n );\r\n};\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\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>,\r\n product: ProductSearchResult,\r\n index: number,\r\n isEnabledProductDescription?: boolean): JSX.Element | null => {\r\n const {\r\n config,\r\n context,\r\n resources\r\n } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === \"back\" || breadCrumbType === \"categoryAndBack\");\r\n const classname = isEnabledProductDescription ? \"ms-product-search-result__item product__description\" : \"ms-product-search-result__item\";\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n // @ts-ignore\r\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\r\n featureState => featureState.Name === \"Dynamics.AX.Application.RetailSearchPriceRangeFeature\");\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator,\r\n loginToViewPricingText: resources.loginToViewPricing\r\n };\r\n return (\r\n <li className={classname} key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={isAllowBack}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n />\r\n </li>\r\n );\r\n};\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className=\"list-unstyled\">\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n (index % productDescriptionInterval === productDescriptionIntervalRemainder0) ||\r\n (index % productDescriptionInterval === productDescriptionIntervalRemainder9) ? renderProductCardsDescription(props, product,\r\n index, true) : renderProductCardsDescription(props, product, index, false)\r\n ))}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n return (\r\n <Node {...TitleContainer}>\r\n {title.titleCount}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\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\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<IProductSearchResultExtensionData>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\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 FeatureSearchContainer,\r\n similarLookProduct,\r\n errorMessage,\r\n productPrices,\r\n context: {\r\n request,\r\n cultureFormatter,\r\n actionContext,\r\n actionContext: {\r\n requestContext: {\r\n gridSettings,\r\n user: { isAuthenticated }\r\n }\r\n }\r\n },\r\n resources: {\r\n filterText, partNoHeading,\r\n descriptionHeading,\r\n availabilityHeading,\r\n quantityHeading,\r\n // listPriceHeading,\r\n yourPriceHeading,\r\n // loginToViewPricing,\r\n goToCartText,\r\n continueShoppingText,\r\n addToCartModalHeading,\r\n addToCartText\r\n },\r\n data: { cart, listPageState: productSearchResults, products: configurationObject },\r\n config: { enableProdutDescription, listView, imageSettings }\r\n } = props;\r\n\r\n const [areInventoryRangesChecked, setAreInventoryRangesChecked] = useState<boolean>(false);\r\n const [inventoryRangesList, setInventoryRangesList] = useState<IProfileDataMap[]>([]);\r\n\r\n const getInvProfs = async (): Promise<void> => {\r\n if (areInventoryRangesChecked) {\r\n return;\r\n }\r\n const itemIds = props.data.products?.result?.products.map(p => p.ItemId!) || [];\r\n const resp = await getInventoryLevelRangesAsync({ callerContext: props.context.actionContext }, itemIds);\r\n setAreInventoryRangesChecked(true);\r\n setInventoryRangesList(resp);\r\n }\r\n\r\n React.useEffect(() => {\r\n if (isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) {\r\n void getInvProfs();\r\n }\r\n }, [props.data.products]);\r\n\r\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\r\n const [modalOpen, setModalOpen] = React.useState<boolean>(false);\r\n const [addedProduct, setAddedProduct] = React.useState<SimpleProduct | undefined>(undefined);\r\n const [productPricing, setProductPricing] = React.useState<ProductPrice | undefined>(undefined);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n \r\n const setModalProps = (product: SimpleProduct, price: ProductPrice): IPopupProps => {\r\n return {\r\n modalOpen: modalOpen,\r\n context: props.context,\r\n className: 'list-view__modal',\r\n gridSettings,\r\n imageSettings,\r\n priceComponent: props.component,\r\n id: \"1\",\r\n productQuantity: 1,\r\n navigationUrl: getUrlSync('cart', actionContext),\r\n setModalOpen: (value) => setModalOpen(value),\r\n typeName: \"Add To Cart\",\r\n data: { product, price },\r\n dialogStrings: {\r\n goToCartText: goToCartText,\r\n currentPriceText: '',\r\n continueShoppingText: continueShoppingText,\r\n freePriceText: '',\r\n headerItemOneText: addToCartModalHeading,\r\n headerItemFormatText: '',\r\n originalPriceText: '',\r\n headerMessageText: ''\r\n }\r\n }\r\n }\r\n\r\n const handleAddToCart = (productId: number, quantity: number) => {\r\n const foundProduct = productSearchResults.result?.activeProducts.find(pr => pr.RecordId === productId);\r\n if (!foundProduct) {\r\n return;\r\n }\r\n const product: SimpleProduct = {\r\n BasePrice: foundProduct.BasePrice || foundProduct.Price,\r\n AdjustedPrice: foundProduct.Price,\r\n Name: foundProduct.Name,\r\n RecordId: foundProduct.RecordId,\r\n ItemId: foundProduct.ItemId,\r\n ProductTypeValue: 1,\r\n Price: foundProduct.Price\r\n }\r\n setAddedProduct(product);\r\n setProductPricing(getProductPrice(productPrices, product.RecordId))\r\n cart.result?.addProductToCart({\r\n product,\r\n count: quantity,\r\n catalogId: 0\r\n }).then((response) => {\r\n if (response.status === \"SUCCESS\" && props.app.config.addToCartBehavior === 'showModal') {\r\n setModalOpen(true);\r\n }\r\n });\r\n }\r\n\r\n // const getProductSupersessionProperty = (product: ProductSearchResult, extensionKey: SupersessionKey) => {\r\n // const properties = product.ExtensionProperties;\r\n // if (properties) {\r\n // return properties.find(pr => pr.Key === extensionKey)?.Value?.StringValue || null;\r\n // }\r\n // return null;\r\n // }\r\n\r\n const renderAddtoCartButton = (pr: ProductSearchResult) => {\r\n if (isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) {\r\n const currentInvString = getProductSupersessionProperty(pr, SupersessionKey.Inventory) || '0';\r\n const currentInventory = parseInt(currentInvString, 10);\r\n let invProfOos: IItemInventoryLevelProfileEntity | undefined;\r\n inventoryRangesList.map(ir => {\r\n const tempInvRange = ir.Profile?.find(p => p.ItemId === pr.ItemId && p.Code === 'OOS');\r\n if (tempInvRange) {\r\n invProfOos = tempInvRange;\r\n }\r\n });\r\n\r\n const OosUpperBound = invProfOos?.hasOwnProperty('UpperBoundInclusive') && invProfOos?.UpperBoundInclusive !== undefined ? invProfOos.UpperBoundInclusive : 0;\r\n const isOutOfStock = currentInventory <= OosUpperBound;\r\n\r\n return !isOutOfStock ? (\r\n <AddToCartListComponent\r\n productId={pr.RecordId}\r\n onAddToCart={handleAddToCart}\r\n addToCartButtonText={addToCartText} />\r\n ) : (\r\n <>\r\n <td></td>\r\n <td>\r\n <div className=\"list-view__prod-unavail\">{props.resources.productUnavailableText}</div>\r\n </td>\r\n </>\r\n )\r\n }\r\n return null;\r\n }\r\n\r\n const _renderProductsListView = () => {\r\n\r\n return (\r\n <Table className={\"list-view__table\"}>\r\n <thead>\r\n <tr>\r\n <th />\r\n <th>{partNoHeading}</th>\r\n <th>{descriptionHeading}</th>\r\n <th>{availabilityHeading}</th>\r\n {/* <th>{listPriceHeading}</th> */}\r\n <th>{yourPriceHeading}</th>\r\n {(isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) ? (\r\n <>\r\n <th>{quantityHeading}</th>\r\n <th />\r\n </>\r\n ) : null}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {productSearchResults.result?.activeProducts.map(pr => {\r\n // const pricing = getProductPrice(productPrices, pr.RecordId);\r\n const inventoryLabel = getInventoryLabel(configurationObject?.result?.channelInventoryConfigurationId, pr);\r\n // const priceComponent = <span>{cultureFormatter.formatCurrency(pr.Price)}</span>;\r\n return (\r\n <tr key={pr.RecordId}>\r\n <td>{renderProductPlacementImage(\r\n imageSettings, gridSettings, pr.PrimaryImageUrl,\r\n pr.PrimaryImageUrl, pr.Name, request)}</td>\r\n <td><a href={getProductPageUrlSync(pr.Name!, pr.RecordId, actionContext)}>{pr.ItemId}</a></td>\r\n <td>{pr.Name}</td>\r\n <td>{inventoryLabel}</td>\r\n {/* <td>\r\n {LoginToViewPricingComponent(props.context.request, loginToViewPricing,\r\n priceComponent, props.config.onlyShowPriceWhenAuthenticated ?? false)}</td> */}\r\n <td>{(isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) ? cultureFormatter.formatCurrency(pr.Price) : null}</td>\r\n {renderAddtoCartButton(pr)}\r\n {/* {isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated ? (<AddToCartListComponent productId={pr.RecordId} onAddToCart={handleAddToCart}\r\n addToCartButtonText={addToCartText} />) : null} */}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </Table>\r\n );\r\n };\r\n\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {similarLookProduct ? null : <Node {...CategoryNavContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n {choiceSummary}\r\n <Node className=\"msc-sort-filter-wrapper\">\r\n {modalToggle}\r\n </Node>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n {errorMessage}\r\n {enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/* @ts-ignore */}\r\n {modalOpen && addedProduct ? <Popup {...setModalProps(addedProduct, productPricing)} /> : null}\r\n {similarLookProduct ? null : <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n <Node className=\"ms-refiner-heading\">\r\n <Node className=\"ms-refiner-heading_title\">\r\n <Button\r\n className={isExpanded ? \"ms-refine-filter__toggle_expanded\" : \"ms-refine-filter__toggle_collapsed\"}\r\n aria-label=\"Filter\"\r\n onClick={toggle}\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n >\r\n {filterText}\r\n </Button>\r\n <div className=\"ms-search-result-wrapper-title-choice-summary\">\r\n {choiceSummary}\r\n </div>\r\n <div className=\"ms-search-result-wrapper-sort-by-category\">\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n </Node>\r\n <Node {...ProductSectionContainer}>\r\n {errorMessage}\r\n {/*{enableProdutDescription ? renderProducts(props) : renderProductCards(props)}*/}\r\n {listView ? _renderProductsListView() : enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown,\r\n isRecoSearchPage), modalProps.modalFooter);\r\n};\r\n\r\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <Node tag=\"h1\" className=\"\">\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderProductPlacementImage = (\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext): JSX.Element | null => {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n if (productCardimageSettings) {\r\n productCardimageSettings.viewports = {\r\n lg: { h: 100, w: 100, q: \"80\" },\r\n md: { h: 100, w: 100, q: \"80\" },\r\n sm: { h: 100, w: 100, q: \"80\" },\r\n xs: { h: 100, w: 100, q: \"80\" }\r\n };\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\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n {...image} {...imageProps} loadFailureBehavior=\"empty\"\r\n requestContext={requestContext}\r\n className={\"eve-listview__img\"}\r\n />\r\n );\r\n};\r\n\r\nconst getProductPrice = (pricing: ProductPrice[] | undefined, productRecId: number): ProductPrice | undefined => {\r\n if (!pricing) {\r\n return undefined;\r\n }\r\n return pricing.find(pr => pr.ProductId === productRecId);\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","import { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { SupersessionKey } from './SupersessionKey';\r\n\r\nexport default function getProductSupersessionProperty(product: ProductSearchResult, extensionKey: SupersessionKey) {\r\n const properties = product.ExtensionProperties;\r\n if (properties) {\r\n return properties.find(pr => pr.Key === extensionKey)?.Value?.StringValue || null;\r\n }\r\n return null;\r\n}\r\n","export enum SupersessionKey {\r\n SupersededId = 'superseded-from-id',\r\n SupersededName = 'superseded-from-name',\r\n Inventory = 'inventory'\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 AddToOrderTemplateComponent,\r\n IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateActionErrorResult,\r\n IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getConfigureErrors,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonResources,\r\n IBuyboxData,\r\n IBuyboxState,\r\n IBuyboxViewProps } from '@msdyn365-commerce-modules/buybox';\r\nimport * as React from 'react';\r\n\r\nimport { IBuyboxProps as IBuyboxExtentionProps } from '../../definition-extensions/buybox.ext.props.autogenerated';\r\n\r\n/**\r\n * To generate AddToOrderTemplateDialog resources.\r\n * @param resources - The resources.\r\n * @returns -- Returns the list of AddToOrderTemplateDialog resources..\r\n */\r\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n}\r\n\r\n/**\r\n * To generate OrderTemplateNameDialog resources.\r\n * @param resources - The resources.\r\n * @returns -- Returns the list of OrderTemplateNameDialog resources..\r\n */\r\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxCommonResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n}\r\n\r\n/**\r\n * To generate ItemAddedToOrderTemplateDialog resources.\r\n * @param resources - The resources.\r\n * @returns -- Returns the list of ItemAddedToOrderTemplateDialog resources..\r\n */\r\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.priceFree,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n}\r\n\r\n/**\r\n * To generate DuplicateItemsWhenAddingToOrderTemplateDialog resources.\r\n * @param resources - The resources.\r\n * @returns -- Returns the list of DuplicateItemsWhenAddingToOrderTemplateDialog resources..\r\n */\r\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: IBuyboxCommonResources):\r\nIDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n}\r\n\r\n/**\r\n * Add to wishlist failed function.\r\n * @param callbacks -Buybox callbacks.\r\n * @param resources -Buybox resources.\r\n * @param product -Simple product.\r\n * @returns Update error state.\r\n */\r\nconst onAddToOrderTemplateFailed = (callbacks: IBuyboxCallbacks,\r\n resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (result: IOrderTemplateActionErrorResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'ORDER_TEMPLATE',\r\n configureErrors: result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n};\r\n\r\n/**\r\n * RenderAddToOrderTemplateButton.\r\n * @param props - Buybox view props.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @param product - Product data.\r\n * @returns -- Returns JSX element.\r\n */\r\nexport const renderAddToOrderTemplateButton = (props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks, product: SimpleProduct): React.ReactNode => {\r\n\r\n const {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file.\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n quantity\r\n } = state;\r\n\r\n const isShowButtonText = true;\r\n\r\n return orderTemplates && (\r\n <AddToOrderTemplateComponent\r\n className='msc-add-to-cart-extra-actions'\r\n addToOrderTemplateButtonText={resources.addToOrderTemplateButtonText}\r\n addToOrderTemplateButtonTooltip={resources.addToOrderTemplateButtonTooltip}\r\n addToOrderTemplateDialogResources={generateAddToOrderTemplateDialogResources(resources)}\r\n createOrderTemplateDialogResources={generateOrderTemplateNameDialogResources(resources)}\r\n itemAddedToOrderTemplateDialogResources={generateItemAddedToOrderTemplateDialogResources(resources)}\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources={generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources)}\r\n data={{ product, quantity, orderTemplates, customerInformation }}\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n onError={onAddToOrderTemplateFailed(callbacks, resources, product)}\r\n shouldShowButtonFailedTooltip={state.isCustomPriceSelected}\r\n showButtonTooltip={false}\r\n showButtonText={isShowButtonText}\r\n />\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport {\r\n AddToWishlistComponent,\r\n IWishlistActionErrorResult\r\n} from \"@msdyn365-commerce/components\";\r\nimport { CommerceProperty, format, ItemAvailability, SimpleProduct } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { IStoreInfo } from \"@msdyn365-commerce-modules/bopis-utilities\";\r\nimport {\r\n getConfigureErrors,\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonResources,\r\n IBuyboxData,\r\n IBuyboxFindInStoreViewProps,\r\n IBuyboxKeyInPriceViewProps,\r\n IBuyboxProductConfigureDropdownViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps,\r\n IBuyboxResources as IBuyboxExtentionResources,\r\n IBuyboxShopSimilarLookViewProps,\r\n IBuyboxState,\r\n IBuyboxViewProps\r\n} from \"@msdyn365-commerce-modules/buybox\";\r\nimport {\r\n ArrayExtensions, getFullAvailableInventoryNearby, GetFullAvailableInventoryNearbyInput,\r\n IFullOrgUnitAvailability\r\n} from \"@msdyn365-commerce-modules/retail-actions\";\r\nimport { IncrementalQuantity, INodeProps, ITelemetryContent, Module, Node } from \"@msdyn365-commerce-modules/utilities\";\r\nimport { reaction } from \"mobx\";\r\nimport * as React from \"react\";\r\n\r\nimport {\r\n IBuyboxProps as IBuyboxExtentionProps,\r\n IBuyboxProps\r\n} from \"../definition-extensions/buybox.ext.props.autogenerated\";\r\nimport { renderAddToOrderTemplateButton } from \"./components/buybox-add-to-order-template\";\r\nimport { SupersessionKey } from \"../models/SupersessionKey\";\r\nimport { CommercePropertyValueEnum } from \"../../../modules/allowable-freight/utils/CommercePropertyValueEnum\";\r\nimport GetProductEligibilityAction, {\r\n GetProductEligibilityInput\r\n} from \"../../../actions/get-product-eligibility.action\";\r\nimport { IBuyBoxDataExtended } from \"../definition-extensions/buybox.data\";\r\nimport { RichTextComponent } from \"@msdyn365-commerce/core\";\r\n\r\n\r\n/**\r\n * BuyBoxConstants enum.\r\n */\r\nexport enum BuyBoxConstants {\r\n zero = 0\r\n}\r\n\r\ninterface EligibleItem {\r\n ItemId: string;\r\n IsEligible: boolean;\r\n}\r\n\r\n\r\n/**\r\n * On Change function.\r\n * @param callbacks -Callbacks.\r\n * @returns Update quantity.\r\n */\r\nconst onChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number): boolean => {\r\n if (callbacks.updateQuantity) {\r\n return callbacks.updateQuantity(newValue);\r\n }\r\n return true;\r\n};\r\n\r\nconst _renderLoginURL = (url?: string, text?: string): JSX.Element => {\r\n return (\r\n <p className=\"msc-product__loginURL\">\r\n <a href={url}>{text}</a>\r\n </p>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * RenderQuantity.\r\n * @param quantityComponent - QuantityComponent.\r\n * @param callbacks - Callbacks.\r\n * @param props - Props.\r\n * @param state - State.\r\n * @param extentionResources - ExtentionResources.\r\n * @param quantityLimitsMessages - QuantityLimitsMessages.\r\n * @param max - Max.\r\n * @param telemetryContent - TelemetryContent.\r\n * @param unitOfMeasure - Unit Of Measure.\r\n * @returns -- Returns.\r\n */\r\nconst renderQuantity = (\r\n quantityComponent: IBuyboxProductQuantityViewProps,\r\n callbacks: IBuyboxCallbacks,\r\n props: IBuyboxProps<IBuyboxData>,\r\n state: IBuyboxState,\r\n extentionResources: IBuyboxExtentionResources,\r\n quantityLimitsMessages: React.ReactNode,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n max: number | undefined,\r\n telemetryContent?: ITelemetryContent,\r\n unitOfMeasure?: React.ReactNode): JSX.Element => {\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const { ContainerProps, LabelContainerProps, heading, errors } = quantityComponent;\r\n\r\n\r\n const {\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n quantity\r\n } = state;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n {errors}\r\n </Node>\r\n\r\n <IncrementalQuantity\r\n id=\"ms-buybox__product-quantity-input\"\r\n max={max}\r\n currentCount={quantity}\r\n onChange={onChangeHandler(callbacks)}\r\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\r\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\r\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\r\n minQuantityText={extentionResources.minQuantityText}\r\n maxQuantityText={extentionResources.maxQuantityText}\r\n telemetryContent={telemetryContent}\r\n />\r\n {unitOfMeasure}\r\n {quantityLimitsMessages}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render key in price function.\r\n * @param keyInPrice - KeyInPrice.\r\n * @returns -- Returns.\r\n */\r\nconst renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderAddToCart.\r\n * @param addToCart - AddToCart.\r\n * @returns -- Returns.\r\n */\r\n// const renderAddToCart = (addToCart: IBuyboxAddToCartViewProps, eligbility: EligibleItem, eligibilityText: string): JSX.Element => {\r\nconst renderAddToCart = (addToCart: IBuyboxAddToCartViewProps, eligbility: EligibleItem, isProductAvailable: boolean): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {eligbility?.IsEligible && isProductAvailable ? button : ''}\r\n {/* {eligbility?.IsEligible ? button : eligbility?.ItemId ? eligibilityText : ''} */}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderFindInStore.\r\n * @param findInStore - FindInStore.\r\n * @returns -- Returns.\r\n */\r\nconst renderFindInStore = (findInStore: IBuyboxFindInStoreViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const {\r\n ContainerProps,\r\n storeSelector,\r\n heading,\r\n description,\r\n errors,\r\n button,\r\n modal,\r\n productPickupOptionList\r\n } = findInStore;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {storeSelector}\r\n {heading}\r\n {productPickupOptionList}\r\n {description}\r\n {errors}\r\n {button}\r\n {modal}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderAddToOrderTemplate.\r\n * @param props - Buybox view props.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToOrderTemplate = (props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks): JSX.Element | null => {\r\n const product = props.data.product.result;\r\n if (!props.addToOrderTemplate || !product) {\r\n return null;\r\n }\r\n\r\n const orderTemplateButton = renderAddToOrderTemplateButton(props, state, callbacks, product);\r\n\r\n return (\r\n <Node {...props.addToOrderTemplate.ContainerProps}>\r\n {props.addToOrderTemplate.errorBlock}\r\n {orderTemplateButton}\r\n </Node>\r\n );\r\n};\r\n\r\n\r\n/**\r\n * Add to wishlist failed function.\r\n * @param callbacks -Buybox callbacks.\r\n * @param resources -Buybox resources.\r\n * @param product -Simple product.\r\n * @returns Update error state.\r\n */\r\nconst onAddToWishlistFailed = (callbacks: IBuyboxCallbacks,\r\n resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (result: IWishlistActionErrorResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: \"WISHLIST\",\r\n configureErrors: result.status === \"MISSINGDIMENSION\" ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n };\r\n\r\n/**\r\n * RenderAddToWishlist.\r\n * @param props - Buybox view props.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @param product - Product data.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddtoWishlistButton = (props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks, product: SimpleProduct): React.ReactNode => {\r\n const { context, resources } = props;\r\n const wishlists = props.data.wishlists.result;\r\n const isShowWishlitButtonText = true;\r\n return (\r\n <AddToWishlistComponent\r\n className=\"msc-add-to-cart-extra-actions\"\r\n addToWishlistButtonText={resources.addToWishlistButtonText}\r\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\r\n addToWishlistMessage={resources.addToWishlistMessage}\r\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\r\n addItemToWishlistError={resources.addItemToWishlistError}\r\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\r\n nameOfWishlist={resources.nameOfWishlist}\r\n data={{ product, wishlists }}\r\n context={context}\r\n ariaRole=\"button\"\r\n id={props.id}\r\n typeName={props.typeName}\r\n onError={onAddToWishlistFailed(callbacks, resources, product)}\r\n getSelectedProduct={state.selectedProduct}\r\n showButtonText={isShowWishlitButtonText}\r\n showButtonTooltip={false}\r\n />\r\n );\r\n};\r\n\r\n/**\r\n * RenderAddToWishlist.\r\n * @param props - Buybox viewprops.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToWishlist = (props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks): JSX.Element | null => {\r\n const product = props.data.product.result;\r\n if (!props.addToWishlist || !product) {\r\n return null;\r\n }\r\n\r\n const wishlistButton = renderAddtoWishlistButton(props, state, callbacks, product);\r\n return (\r\n <Node {...props.addToWishlist.ContainerProps}>\r\n {props.addToWishlist.errorBlock}\r\n {wishlistButton}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RRenderShopSimilarItem.\r\n * @param shopSimilarItem - ShopSimilarItem.\r\n * @returns -- Returns.\r\n */\r\nconst renderShopSimilarItem = (shopSimilarItem: IBuyboxShopSimilarLookViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const { ContainerProps, errors, input } = shopSimilarItem;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errors}\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderSocialShare.\r\n * @param socialShare - Social share react node array.\r\n * @returns -- Returns.\r\n */\r\nconst _renderSocialShare = (socialShare: React.ReactNode[]): JSX.Element | undefined => {\r\n if (!socialShare || socialShare.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n <>\r\n {socialShare[0]}\r\n </>\r\n );\r\n};\r\n\r\n/**\r\n * RenderConfigureDropdown.\r\n * @param dropdown - Buybox product configure dropdown view props.\r\n * @returns -- Returns JSX.Element.\r\n */\r\nconst renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {select}\r\n {errors}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderConfigure.\r\n * @param configure - Buybox product configure view props.\r\n * @returns -- Returns JSX.Element.\r\n */\r\nconst renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\r\n const { ContainerProps, dropdowns } = configure;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {dropdowns.map(renderConfigureDropdown)}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * BuyboxView.\r\n * @param props - Props.\r\n * @returns -- Returns.\r\n */\r\nconst BuyboxView: React.FC<IBuyboxViewProps & IBuyboxExtentionProps<IBuyBoxDataExtended>> = props => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n const {\r\n ModuleProps,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n MediaGalleryContainerProps,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n ProductInfoContainerProps,\r\n addToCart,\r\n addToOrderTemplate,\r\n addToWishlist,\r\n configure,\r\n // description,\r\n findInStore,\r\n quantity,\r\n price,\r\n title,\r\n rating,\r\n // inventoryLabel,\r\n shopSimilarLook,\r\n keyInPrice,\r\n shopSimilarDescription,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\r\n max,\r\n unitOfMeasure,\r\n callbacks,\r\n state,\r\n resources,\r\n resources: {\r\n loginToViewPricing,\r\n supersessionLabel,\r\n productEligibilityText\r\n },\r\n data: {\r\n product,\r\n enhancedDescription\r\n },\r\n quantityLimitsMessages,\r\n telemetryContent,\r\n config: {\r\n onlyShowPriceWhenAuthenticated,\r\n enableShopSimilarDescription,\r\n enableShopSimilarLooks\r\n },\r\n context: {\r\n request: {\r\n user: { signInUrl, isAuthenticated }\r\n }\r\n },\r\n app: {\r\n config: appConfig\r\n }\r\n } = props;\r\n let skuText: string = props.resources.skuText;\r\n skuText += props.data.product.result?.ItemId;\r\n const preferredStoreInfo: IStoreInfo | undefined = props.data.storeSelectorStateManager.result?.preferredStore;\r\n const preferredStoreId = preferredStoreInfo?.StoreId ? preferredStoreInfo.StoreId : \"\";\r\n const preferredStoreName = preferredStoreInfo?.StoreName ? preferredStoreInfo.StoreName : \"\";\r\n\r\n const [availability, setAvailability] = React.useState<string>(\"\");\r\n const [isStoreChange, setIsStoreChange] = React.useState<boolean>(false);\r\n\r\n const shouldShowShopOptions = enableShopSimilarDescription || enableShopSimilarLooks;\r\n\r\n const [eligbility, setEligbility] = React.useState<EligibleItem>();\r\n const [isProductAvailable, setIsProductAvailable] = React.useState<boolean>(false);\r\n\r\n const getProductEligibility = async (): Promise<void> => {\r\n\r\n const itemId = (await product).ItemId;\r\n\r\n if (!itemId) {\r\n return;\r\n }\r\n const cart = props.data.cart;\r\n const input = new GetProductEligibilityInput([itemId], false, cart?.result?.cart?.Id || '', null, null, null);\r\n const eligibilityData = await GetProductEligibilityAction(input, props.context.actionContext);\r\n\r\n eligibilityData.forEach((i: any) => {\r\n const id = getExtensionPropertyValueByKey(i.ExtensionProperties, \"ItemId\", CommercePropertyValueEnum.string);\r\n if (String(id) === itemId) {\r\n const item: EligibleItem = {\r\n ItemId: String(id),\r\n IsEligible: i.IsEligible\r\n }\r\n setEligbility(item);\r\n getProductAvailability();\r\n }\r\n });\r\n }\r\n\r\n React.useEffect(() => {\r\n if (isAuthenticated) {\r\n void getProductEligibility();\r\n }\r\n }, [props.data]);\r\n\r\n const getProductAvailability = (): void => {\r\n const availableQuantities = props.data.productAvailableQuantity.result;\r\n let isStockAvailable = false\r\n\r\n if (availableQuantities && availableQuantities.length > 0) {\r\n isStockAvailable = availableQuantities[0].IsProductAvailable;\r\n }\r\n setIsProductAvailable(isStockAvailable);\r\n }\r\n\r\n /**\r\n * GetStockInventoryLabel.\r\n * @param availabilityWithHours - Stock availability with hours.\r\n * @returns -- Returns.\r\n */\r\n const getStockInventoryLabel = (availabilityWithHours: IFullOrgUnitAvailability | undefined): string | undefined => {\r\n\r\n if (availabilityWithHours && ArrayExtensions.hasElements(availabilityWithHours.ProductInventoryInformation)) {\r\n for (const productInventoryInformation of availabilityWithHours.ProductInventoryInformation) {\r\n if (availabilityWithHours.OrgUnitAvailability?.OrgUnitLocation?.InventoryLocationId ===\r\n productInventoryInformation.InventLocationId) {\r\n return productInventoryInformation.StockLevelLabel;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n const getInventory = React.useCallback(async () => {\r\n const input = new GetFullAvailableInventoryNearbyInput(props.data.product.result?.RecordId, BuyBoxConstants.zero,\r\n BuyBoxConstants.zero, BuyBoxConstants.zero, BuyBoxConstants.zero, true);\r\n\r\n /**\r\n * IsProductInStock.\r\n * @param itemAvailabilities - Item availability array.\r\n * @returns -- Returns.\r\n */\r\n const isProductInStock = (itemAvailabilities: ItemAvailability[] | undefined): boolean => {\r\n if (!appConfig.enableStockCheck) {\r\n return true;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(itemAvailabilities)) {\r\n return itemAvailabilities[BuyBoxConstants.zero].AvailableQuantity! > BuyBoxConstants.zero;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n await getFullAvailableInventoryNearby(input, props.context.actionContext).catch((error: Error) => {\r\n props.telemetry.error(error.message);\r\n }).then(response => {\r\n if (response && ArrayExtensions.hasElements(response)) {\r\n const isPreferredStore = (value: IFullOrgUnitAvailability) => value.OrgUnitAvailability?.OrgUnitLocation?.OrgUnitNumber === preferredStoreId;\r\n const filteredFullOrgUnitAvailability = response.filter(isPreferredStore);\r\n const preferredStoreAvailability = ArrayExtensions.hasElements(filteredFullOrgUnitAvailability) ? (\r\n filteredFullOrgUnitAvailability[BuyBoxConstants.zero]) : undefined;\r\n const stockStatusLabel: string | undefined = getStockInventoryLabel(preferredStoreAvailability);\r\n const isInStock = isProductInStock(preferredStoreAvailability?.OrgUnitAvailability?.ItemAvailabilities);\r\n const resourceLabel = isInStock ? props.resources.inStockText : props.resources.outOfStockText;\r\n const stockText: string | undefined = stockStatusLabel ? stockStatusLabel : resourceLabel;\r\n const preferredStoreAvailabilityText = `${format(props.resources.availabilityAtPreferredStoreText, preferredStoreName)} ${stockText}`;\r\n setAvailability(preferredStoreAvailabilityText);\r\n }\r\n });\r\n\r\n setIsStoreChange(false);\r\n }, [\r\n props.data.product.result?.RecordId, appConfig.enableStockCheck, preferredStoreId, preferredStoreName, props.context.actionContext,\r\n props.resources.availabilityAtPreferredStoreText, props.resources.inStockText, props.resources.outOfStockText, props.telemetry\r\n ]);\r\n\r\n React.useEffect(() => {\r\n if (props.config.displayStockAvailability) {\r\n getInventory().catch((error: Error) => {\r\n props.telemetry.error(error.message);\r\n });\r\n }\r\n }, [getInventory, isStoreChange, props.telemetry, props.config.displayStockAvailability]);\r\n\r\n reaction(\r\n () => props.data.storeSelectorStateManager.result?.selectedStoreLocationId,\r\n () => {\r\n setIsStoreChange(true);\r\n }\r\n );\r\n\r\n const _renderSupersessionData = () => {\r\n const productExtensionProperties = product.result?.ExtensionProperties;\r\n let supersededName: string | undefined;\r\n let supersededId: string | undefined;\r\n if (productExtensionProperties) {\r\n productExtensionProperties.forEach(ep => {\r\n const key = ep.Key || '';\r\n\r\n switch (key) {\r\n case SupersessionKey.SupersededName:\r\n supersededName = ep.Value?.StringValue;\r\n\r\n if (supersededName && supersededName === product.result?.Name) {\r\n supersededName = undefined;\r\n }\r\n break;\r\n case SupersessionKey.SupersededId:\r\n supersededId = ep.Value?.StringValue;\r\n if (supersededId && supersededId === product.result?.ItemId) {\r\n supersededId = undefined;\r\n }\r\n break;\r\n }\r\n })\r\n }\r\n\r\n if (!supersededName && !supersededId) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className={'supersession-data'}>\r\n <p>{supersessionLabel} {supersededName} ({supersededId})</p>\r\n </div>\r\n )\r\n }\r\n\r\n /**\r\n * RenderAvailabiltyAtPreferredStore.\r\n * @returns -- Returns.\r\n */\r\n const renderAvailabilityAtPreferredStore = (): JSX.Element | undefined => {\r\n const hasProductDimensions = ArrayExtensions.hasElements(props.data.product.result?.Dimensions);\r\n if (hasProductDimensions && props.data.product.result?.MasterProductId === undefined) {\r\n return undefined;\r\n }\r\n\r\n const containerProps: INodeProps = {\r\n className: \"ms-buybox__preferred-store-availability\",\r\n tag: \"span\"\r\n };\r\n\r\n return (\r\n <Node {...containerProps}>\r\n {availability}\r\n </Node>\r\n );\r\n };\r\n\r\n const getBuyBoxInventoryLabel = (): React.ReactNode | React.ReactElement | undefined => {\r\n const product = props.data.product.result;\r\n const availableQuantities = props.data.productAvailableQuantity.result;\r\n if (!product && !availableQuantities) {\r\n return undefined;\r\n }\r\n const className = 'ms-buybox';\r\n let stockLevelLabel = '';\r\n let inventoryClassName: string = `${className}__inventory-label`;\r\n if (!eligbility?.IsEligible) {\r\n stockLevelLabel = productEligibilityText;\r\n }\r\n // } else if (isProductAvailable) {\r\n // stockLevelLabel = resources.availableLabelText;\r\n // } else {\r\n // stockLevelLabel = resources.outOfStockLabelText;\r\n // }\r\n return (\r\n eligbility?.IsEligible ? props.inventoryLabel : (\r\n <div className={`${className}__inventory-info`}>\r\n <span className={inventoryClassName} >\r\n {stockLevelLabel}\r\n </span>\r\n </div>\r\n )\r\n );\r\n }\r\n\r\n\r\n // No quantity selector if cart has course\r\n let cart = props.data.cart.result;\r\n let cartLines = cart?.cart.CartLines\r\n let hasCourse = false;\r\n let hasInvoice = cart?.hasInvoiceLine;\r\n cartLines?.forEach(c => {\r\n const courseId = getExtensionPropertyValueByKey(c.ExtensionProperties, \"CourseId\", CommercePropertyValueEnum.string);\r\n if (courseId) {\r\n hasCourse = true;\r\n }\r\n });\r\n let hasCourseErr = <div className=\"eduerrors\">{props.resources.courseErr}</div>;\r\n let invoiceErr = <div className=\"eduerrors\">{props.resources.invoiceErr}</div>;\r\n return (\r\n <Module {...ModuleProps}>\r\n <Node {...MediaGalleryContainerProps}>\r\n {props.mediaGallery}\r\n </Node>\r\n <Node {...ProductInfoContainerProps}>\r\n {title}\r\n\r\n\r\n <Node className=\"msc-buybox__ratings-section\">\r\n <div className=\"msc-buybox__ratings-section-sku-text\">\r\n {skuText}\r\n </div>\r\n {_renderSupersessionData()}\r\n {rating}\r\n </Node>\r\n {(isAuthenticated || !onlyShowPriceWhenAuthenticated) ? (\r\n <Node className=\"msc-buybox__price-section\">\r\n <div className=\"msc-buybox__price-section-text\">\r\n {props.resources.priceText}\r\n </div>\r\n {price}\r\n </Node>\r\n ) : _renderLoginURL(signInUrl, loginToViewPricing)}\r\n\r\n {configure && renderConfigure(configure)}\r\n {hasCourse && hasCourseErr}\r\n {hasInvoice && invoiceErr}\r\n {keyInPrice && renderKeyInPrice(keyInPrice)}\r\n\r\n <Node className=\"msc-buybox__bulk-purchase-section\">\r\n <div className=\"msc-buybox__bulk-purchase-button-text\">\r\n {quantity && !hasCourse && !hasInvoice && renderQuantity(quantity, callbacks, props, state, resources, quantityLimitsMessages, max, telemetryContent, unitOfMeasure)}\r\n {props.bulkPurchaseLink}\r\n </div>\r\n </Node>\r\n {props.config.displayStockAvailability && preferredStoreId && renderAvailabilityAtPreferredStore()}\r\n {/* {inventoryLabel} */}\r\n {getBuyBoxInventoryLabel()}\r\n {!hasCourse && !hasInvoice && eligbility && renderAddToCart(addToCart, eligbility, isProductAvailable)}\r\n {findInStore && renderFindInStore(findInStore)}\r\n {addToWishlist && renderAddToWishlist(props, state, callbacks)}\r\n {addToOrderTemplate && renderAddToOrderTemplate(props, state, callbacks)}\r\n {findInStore?.productPickupOptionList ? <div className=\"msc-buybox__pickup-options\">\r\n {findInStore.productPickupOptionList}\r\n </div> : null}\r\n {_renderSocialShare(props.slots && props.slots.socialShare)}\r\n {shouldShowShopOptions ? (\r\n <React.Fragment>\r\n <div className=\"msc-buybox__description-text\">\r\n {props.resources.shopText}\r\n </div>\r\n <Node className=\"msc-buybox__shop-description\">\r\n {shopSimilarLook && renderShopSimilarItem(shopSimilarLook)}\r\n {shopSimilarDescription && renderShopSimilarItem(shopSimilarDescription)}\r\n </Node>\r\n </React.Fragment>\r\n ) : null}\r\n\r\n <Node className=\"msc-buybox__description-section\">\r\n <div className=\"msc-buybox__description-section-text\">\r\n {props.resources.descriptionText}\r\n </div>\r\n {/* 6704 - Remove the original desription and replace with the enhanced description */}\r\n {/* {description} */}\r\n <RichTextComponent text={enhancedDescription.result?.description}/>\r\n </Node>\r\n {ArrayExtensions.hasElements(props.slots.productSpecification) ?\r\n <Node className=\"msc-buybox__product-specification\">\r\n {props.slots.productSpecification[0]}\r\n </Node> : null}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n\r\nconst getExtensionPropertyValueByKey = (\r\n properties: CommerceProperty[] | undefined,\r\n key: string,\r\n valueType: CommercePropertyValueEnum\r\n) => {\r\n const property = properties?.find(p => p.Key === key)?.Value;\r\n\r\n // eslint-disable-next-line security/detect-object-injection\r\n const val = property ? property[valueType] : null;\r\n return val;\r\n};\r\n\r\nexport default BuyboxView;\r\n","import React from 'react';\r\n\r\ninterface IAddToCartListComponentProps {\r\n productId: number\r\n onAddToCart(id: number, quantity: number): void;\r\n addToCartButtonText: string\r\n}\r\n\r\nexport const AddToCartListComponent: React.FC<IAddToCartListComponentProps> = ({productId, onAddToCart, addToCartButtonText}) => {\r\n\r\n const [ quantity , setQuantity ] = React.useState<number>(1);\r\n\r\n const handleQuantityChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setQuantity(e.target.valueAsNumber);\r\n }\r\n const handleAddToCart = () => onAddToCart(productId, quantity);\r\n\r\n return (\r\n <>\r\n <td>\r\n <input type=\"number\" min={\"1\"} max={\"10\"} value={quantity} aria-label={'Change Quantity'} onChange={handleQuantityChange}/>\r\n </td>\r\n <td><button type={'button'} className={'list-view__add-to-cart-btn msc-button'} onClick={handleAddToCart}>{addToCartButtonText}</button></td>\r\n </>\r\n )\r\n}","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { ISwatchItem, PriceComponent, ProductComponentSwatchComponent, RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IPriceComponentResources } from './price.component'\r\nimport { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions, convertDimensionTypeToProductDimensionType, Dictionary, DimensionTypes, generateImageUrl,\r\n getProductPageUrlSync, IDimensionsApp, StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\nimport { LoginToViewPricingComponent } from \"../../../../components/LoginToViewPricing.component\";\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 isEnabledProductDescription?: boolean;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n inventoryLabel?: string;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> { }\r\n\r\nconst PriceComponentActions = {};\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\nfunction 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(attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color);\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\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls) ? generateImageUrl(\r\n defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings) : productData?.PrimaryImageUrl;\r\n}\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\nfunction 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 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\nfunction 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>\r\n {unitOfMeasure}\r\n </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\nfunction 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>\r\n {inventoryAvailabilityLabel}\r\n </span>\r\n </div>\r\n );\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\nfunction getProductPageUrlFromDefaultSwatch(coreContext: ICoreContext, productUrl: string, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productUrl;\r\n }\r\n\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\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 isEnabledProductDescription,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n inventoryLabel,\r\n dimensionAvailabilities\r\n}) => {\r\n const product = data.product;\r\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\r\n if (allowBack) {\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 const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\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((coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\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) ? swatchItem.productImageUrls[0] : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n }, [selectedSwatchItems, context, productPageUrl]);\r\n\r\n if (!product) {\r\n return null;\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 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 * 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 {\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\r\n const siteContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches = 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 isDisabled: enableStockCheck && dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? ''))?.isDisabled\r\n };\r\n }) ?? [];\r\n if (dimensionToPreSelectInProductCard !== DimensionTypes.none && ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) && dimensionType === DimensionTypes.color) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n context={context}\r\n swatches={swatches}\r\n onSelectDimension={updatePageAndImageUrl}\r\n key={item.RecordId}\r\n />\r\n );\r\n })\r\n }\r\n </div>\r\n );\r\n }\r\n\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 const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\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 return (\r\n <>\r\n {isEnabledProductDescription ? <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, ratingAriaLabel,\r\n product.TotalRatings, ratingCountAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image__description'>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl,\r\n product.PrimaryImageUrl, product.Name, context)}\r\n </div>\r\n <div className='msc-product__title_description'>\r\n <h5 className='msc-product__title__text'>\r\n {product.Name}\r\n </h5>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n </div>\r\n </div>\r\n </a> : <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(product.Name, context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating, ratingAriaLabel)}\r\n className='msc-product' {...attribute}>\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(imageSettings, context.request.gridSettings, productImageUrl, product.PrimaryImageUrl, product.Name, context)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h5 className='msc-product__title'>\r\n {product.Name}\r\n </h5>\r\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText, currentPriceText, isPriceMinMaxEnabled, priceResources)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n </div>\r\n </a>}\r\n {renderProductDimensions(product.AttributeValues)}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n </>\r\n );\r\n};\r\n\r\nfunction 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): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return (\r\n `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${reviewCountArialableText ? ` ${reviewCountArialableText}` : ''}`\r\n );\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return (<p className='msc-product__text'>\r\n {description}\r\n </p>);\r\n}\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction 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\nfunction renderRating(coreContext: ICoreContext, moduleTypeName: string, moduleId: string, avgRating?: number,\r\n totalRatings?: number, ariaLabel?: string, ratingCountAriaLabel?: string): 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\nfunction renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string, isPriceMinMaxEnabled?: boolean, priceResources?: IPriceComponentResources): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n const priceComponent = (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price }}\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n //console.log(priceResources);\r\n return (\r\n LoginToViewPricingComponent(\r\n context.request,\r\n priceResources?.loginToViewPricingText || '',\r\n priceComponent,\r\n true\r\n )\r\n );\r\n}\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string,\r\n context?: ICoreContext): 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 fallBackSrc: fallbackImageUrl\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings\r\n };\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n <Image\r\n requestContext={context?.actionContext.requestContext} {...img} {...imageProps}\r\n loadFailureBehavior='empty' />\r\n );\r\n}\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<IProductComponent>(\r\n 'Product',\r\n { component: ProductCard, ...PriceComponentActions }\r\n);\r\n\r\nexport default ProductComponent;\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 { AddToWishlistComponent, IWishlistActionErrorResult } from '@msdyn365-commerce/components';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getConfigureErrors, IBuyboxAddToCartViewProps,\r\n IBuyboxCallbacks,\r\n IBuyboxCommonResources,\r\n IBuyboxKeyInPriceViewProps,\r\n IBuyboxProductConfigureDropdownViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps,\r\n IBuyboxState,\r\n IQuickviewViewProps } from '@msdyn365-commerce-modules/buybox';\r\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IQuickviewProps as IQuickviewPropsExtend } from '../definition-extensions/quickview.ext.props.autogenerated';\r\n\r\n/**\r\n * RenderAddToCart.\r\n * @param addToCart - AddToCart.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n const { ContainerProps, errorBlock, button } = addToCart;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {errorBlock}\r\n {button}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Add to wishlist failed function.\r\n * @param callbacks -Buybox callbacks.\r\n * @param resources -Buybox resources.\r\n * @param product -Simple product.\r\n * @returns Update error state.\r\n */\r\nconst onAddToWishlistFailed = (callbacks: IBuyboxCallbacks | undefined,\r\n resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (result: IWishlistActionErrorResult) => {\r\n callbacks?.updateErrorState({\r\n errorHost: 'WISHLIST',\r\n configureErrors: result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n};\r\n\r\n/**\r\n * RenderAddToWishlist.\r\n * @param props - Buybox viewprops.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @param product - Product data.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddtoWishlistButton = (props: IQuickviewViewProps,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks | undefined, product: SimpleProduct): React.ReactNode => {\r\n const { context, resources } = props;\r\n const wishlists = props.data.wishlists.result;\r\n const isShowWishlitButtonText = true;\r\n return (\r\n <AddToWishlistComponent\r\n className='msc-add-to-cart-extra-actions'\r\n addToWishlistButtonText={resources.addToWishlistButtonText}\r\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\r\n addToWishlistMessage={resources.addToWishlistMessage}\r\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\r\n addItemToWishlistError={resources.addItemToWishlistError}\r\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\r\n nameOfWishlist={resources.nameOfWishlist}\r\n data={{ product, wishlists }}\r\n context={context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n onError={onAddToWishlistFailed(callbacks, resources, product)}\r\n getSelectedProduct={state.selectedProduct}\r\n showButtonText={isShowWishlitButtonText}\r\n showButtonTooltip={false}\r\n />\r\n );\r\n};\r\n\r\n/**\r\n * RenderAddToWishlist.\r\n * @param props - Buybox viewprops.\r\n * @param state - Buybox state.\r\n * @param callbacks - Buybox callbacks.\r\n * @returns -- Returns.\r\n */\r\nconst renderAddToWishlist = (props: IQuickviewViewProps,\r\n state: IBuyboxState, callbacks: IBuyboxCallbacks | undefined): JSX.Element | null => {\r\n const product = props.productDetails?.product;\r\n if (!props.addToWishlist || !product) {\r\n return null;\r\n }\r\n\r\n const wishlistButton = renderAddtoWishlistButton(props, state, callbacks, product);\r\n return (\r\n <Node {...props.addToWishlist.ContainerProps}>\r\n {props.addToWishlist.errorBlock}\r\n {wishlistButton}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderQuantity.\r\n * @param quantity - Quantity.\r\n * @param quantityLimitsMessages - QuantityLimitsMessages.\r\n * @param props - Props.\r\n * @returns -- Returns.\r\n */\r\nconst renderQuantity = (quantity: IBuyboxProductQuantityViewProps, quantityLimitsMessages: React.ReactNode, props: IQuickviewViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\r\n const { unitOfMeasure } = props;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {input}\r\n {unitOfMeasure}\r\n {quantityLimitsMessages}\r\n {errors}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * KenderKeyInPrice.\r\n * @param keyInPrice - KeyInPrice.\r\n * @returns -- Returns.\r\n */\r\nconst renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {input}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderConfigureDropdown.\r\n * @param dropdown - Buybox product configure dropdown view props.\r\n * @returns -- Returns JSX.Element.\r\n */\r\nconst renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n <Node {...LabelContainerProps}>\r\n {heading}\r\n </Node>\r\n {select}\r\n {errors}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderConfigure.\r\n * @param configure - Buybox product configure view props.\r\n * @returns -- Returns JSX.Element.\r\n */\r\nconst renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\r\n const { ContainerProps, dropdowns } = configure;\r\n\r\n return (\r\n <Node {...ContainerProps}>\r\n {dropdowns.map(renderConfigureDropdown)}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * RenderBodyContent.\r\n * @param props - Props.\r\n * @returns -- Returns.\r\n */\r\nconst renderBodyContent = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>): JSX.Element => {\r\n const { price, keyInPrice, quantity, inventoryLabel, quantityLimitsMessages, loading,\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n ProductInfoContainerProps, MediaGalleryContainerProps, CarouselProps, addToWishlist, configure, callbacks, state } = props;\r\n if (loading) {\r\n return (\r\n <>\r\n {loading}\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <Node {...MediaGalleryContainerProps}>\r\n <Node {...CarouselProps} />\r\n </Node>\r\n <Node {...ProductInfoContainerProps}>\r\n <Node className='msc-quickview__price-section'>\r\n <Node className='msc-quickview__price-section-text'>\r\n {props.resources.priceText}\r\n {price}\r\n </Node>\r\n {addToWishlist && renderAddToWishlist(props, state, callbacks)}\r\n </Node>\r\n {configure && renderConfigure(configure)}\r\n {keyInPrice && renderKeyInPrice(keyInPrice)}\r\n {quantity && renderQuantity(quantity, quantityLimitsMessages, props)}\r\n {inventoryLabel}\r\n </Node>\r\n </>\r\n );\r\n\r\n};\r\n\r\n/**\r\n * RenderQuickViewPopup.\r\n * @param props - Props.\r\n * @returns -- Returns.\r\n */\r\nconst renderQuickViewPopup = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>): JSX.Element => {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\r\n const { ModalContainer, ModalHeaderContainer, ModalFooterContainer, ModalHeaderContent, ModalBodyContainer, addToCart,\r\n cartContainerProps, seeDetailsbutton } = props;\r\n\r\n return (\r\n <Module {...ModalContainer}>\r\n <Node {...ModalHeaderContainer}>\r\n {ModalHeaderContent}\r\n <Node className='msc-quickview__heading'>\r\n {props.title}\r\n {!props.loading && !StringExtensions.isNullOrEmpty(props.state.productPrice?.ItemId) ? <Node className='msc-quickview__sku-text'>\r\n {props.resources.skuText}\r\n {props.state.productPrice?.ItemId}\r\n </Node> : ''}\r\n {props.rating}\r\n </Node>\r\n </Node>\r\n <Node {...ModalBodyContainer}>\r\n {renderBodyContent(props)}\r\n </Node>\r\n <Node {...ModalFooterContainer}>\r\n <Node {...cartContainerProps}>\r\n {addToCart && seeDetailsbutton}\r\n {addToCart && renderAddToCart(addToCart)}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Functional component which renders quick view button and popup based by the given props file.\r\n * @param props - Configuration for the quick view component.\r\n * @returns - Functional component of the quick view.\r\n */\r\nexport const QuickViewFunctionalComponent:\r\nReact.FC<IQuickviewViewProps & IQuickviewPropsExtend<{}>> = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>) => {\r\n const { quickView, quickViewButton, isModalOpen } = props;\r\n const quickViewUpdatedProps: IModuleProps = { ...quickView, title: props.resources.quickViewbuttonText };\r\n return (\r\n <Module {...quickViewUpdatedProps}>\r\n {quickViewButton}\r\n {isModalOpen && renderQuickViewPopup(props)}\r\n </Module>\r\n );\r\n};\r\n\r\nexport default QuickViewFunctionalComponent;\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 { IPriceComponentResources } from './components/price.component';\r\nimport { ProductPrice, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISearchResultModalViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { Button, getTelemetryObject, IPopupProps, Module, Node, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { PropsWithChildren, useState } from 'react';\r\nimport { ISearchResultContainerProps } from '../definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport { ProductComponent } from './components/product.component';\r\nimport { getUrlSync, IGridSettings, IImageData, IImageProps, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { AddToCartListComponent } from './components/addToCart.component';\r\nimport { IProductSearchResultExtensionData } from './product-result-container.data';\r\nimport Table from 'reactstrap/lib/Table';\r\nimport { LoginToViewPricingComponent } from '../../../components/LoginToViewPricing.component';\r\nimport { SupersessionKey } from '../models/SupersessionKey';\r\nimport { CommercePropertyValueEnum } from '../../../modules/allowable-freight/utils/CommercePropertyValueEnum';\r\nimport { getInventoryLevelRangesAsync } from '../../../actions/DataActionExtension.g';\r\nimport { IItemInventoryLevelProfileEntity, IProfileDataMap } from '../../../actions/DataServiceEntities.g';\r\nimport getExtensionPropertyValueByKey from '../../../utils/getExtensionPropertyValueByKey';\r\nimport { EligibleItems } from '../../../modules/eve-quick-order/eve-quick-order';\r\nimport GetProductEligibilityAction, { GetProductEligibilityInput } from '../../../actions/get-product-eligibility.action';\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>\r\n): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => renderProductCardsDescription(props, product, index, false))}\r\n </ul>\r\n </Node>\r\n );\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\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>,\r\n product: ProductSearchResult,\r\n index: number,\r\n isEnabledProductDescription?: boolean\r\n): JSX.Element | null => {\r\n const { config, context, resources } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n const classname = isEnabledProductDescription\r\n ? 'ms-product-search-result__item product__description'\r\n : 'ms-product-search-result__item';\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n // @ts-ignore\r\n const isPriceMinMaxFeatureState = 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 loginToViewPricingText: resources.loginToViewPricing\r\n };\r\n return (\r\n <li className={classname} key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={isAllowBack}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n />\r\n </li>\r\n );\r\n};\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (\r\n props: PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>>\r\n): JSX.Element | null => {\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) =>\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\r\n ? renderProductCardsDescription(props, product, index, true)\r\n : renderProductCardsDescription(props, product, index, false)\r\n )}\r\n </ul>\r\n </Node>\r\n );\r\n};\r\n\r\nconst renderExpandOrRefineResults = (\r\n props:\r\n | React.PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<IProductSearchResultExtensionData>>\r\n | undefined\r\n) => {\r\n if (MsDyn365.isBrowser && typeof window !== 'undefined') {\r\n const url = new URL(window.location.href);\r\n let link;\r\n if (!url.searchParams.has('expand')) {\r\n url.searchParams.append('expand', 'true');\r\n link = <a href={url?.toString() || '#'}>{props?.resources.expandResultsText}</a>;\r\n } else {\r\n url.searchParams.delete('expand');\r\n link = <a href={url?.toString() || '#'}>{props?.resources.refineResultsText}</a>;\r\n }\r\n return (\r\n <span>\r\n {props?.resources.notFindingText} {link}\r\n </span>\r\n );\r\n }\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitleCount = (\r\n titleProps: ITitleViewProps,\r\n enableSearchWrap: boolean,\r\n props:\r\n | React.PropsWithChildren<ISearchResultContainerViewProps & ISearchResultContainerProps<IProductSearchResultExtensionData>>\r\n | undefined\r\n): JSX.Element | null => {\r\n const { title, TitleContainer } = titleProps;\r\n return (\r\n <Node {...TitleContainer}>\r\n {title.titleCount}\r\n {enableSearchWrap ? renderExpandOrRefineResults(props) : undefined}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\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\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps &\r\n ISearchResultContainerProps<IProductSearchResultExtensionData>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\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 FeatureSearchContainer,\r\n similarLookProduct,\r\n errorMessage,\r\n productPrices,\r\n context: {\r\n request,\r\n cultureFormatter,\r\n actionContext,\r\n actionContext: {\r\n requestContext: {\r\n gridSettings,\r\n user: { isAuthenticated }\r\n }\r\n }\r\n },\r\n resources: {\r\n filterText,\r\n partNoHeading,\r\n descriptionHeading,\r\n availabilityHeading,\r\n quantityHeading,\r\n listPriceHeading,\r\n yourPriceHeading,\r\n // loginToViewPricing,\r\n loginToViewPricingAndAvailabilityText,\r\n supersededFromText,\r\n priceAndAvailabilityHeading,\r\n goToCartText,\r\n continueShoppingText,\r\n addToCartModalHeading,\r\n addToCartText\r\n },\r\n data: { cart, listPageState: productSearchResults, manufacturerCodes },\r\n config: { enableProdutDescription, listView, imageSettings }\r\n } = props;\r\n\r\n // Fix for issue 8251: Boost relevance of Part Number matches\r\n // This change prioritizes matched products by ItemId and manufacturer codes\r\n // to improve search relevance and address the issue of items flipping\r\n\r\n if (request.query) {\r\n const searchTerm = request.query['q'];\r\n const codes = manufacturerCodes?.result as any;\r\n\r\n const matchedProducts: ProductSearchResult[] = [];\r\n const unmatchedProducts: ProductSearchResult[] = [];\r\n\r\n productSearchResults.result?.activeProducts.forEach(p => {\r\n let matched = false;\r\n\r\n // Check for direct match by ItemId\r\n if (\r\n searchTerm &&\r\n (p.ItemId?.toLowerCase() === searchTerm.toLowerCase() || p.ItemId?.substring(3, p.ItemId.length) === searchTerm)\r\n ) {\r\n matched = true;\r\n } else {\r\n // Check for manufacturer code match\r\n for (let i = 0; i < codes.manufacturerCodes.length; i++) {\r\n if (codes.manufacturerCodes[i].GDNManufacturerCode + searchTerm === p.ItemId) {\r\n matched = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (matched) {\r\n matchedProducts.push(p);\r\n } else {\r\n unmatchedProducts.push(p);\r\n }\r\n });\r\n\r\n // Concatenate matched products at the beginning of the active products\r\n productSearchResults.result!.activeProducts = [...matchedProducts, ...unmatchedProducts];\r\n }\r\n\r\n const [eligbilityList, setEligbilityList] = useState<EligibleItems>([]);\r\n const [isEligibilityChecked, setEligibilityChecked] = useState<boolean>(false);\r\n const [areInventoryRangesChecked, setAreInventoryRangesChecked] = useState<boolean>(false);\r\n const [inventoryRangesList, setInventoryRangesList] = useState<IProfileDataMap[]>([]);\r\n\r\n const getProductEligibility = async (): Promise<void> => {\r\n if (isEligibilityChecked) {\r\n return;\r\n }\r\n const itemIds = props.data.products?.result?.products.map(p => p.ItemId!) || [];\r\n if (!itemIds.length) {\r\n return;\r\n }\r\n const cart = props.data.cart.result?.cart;\r\n // if (!cart) {\r\n // return;\r\n // }\r\n const input = new GetProductEligibilityInput(itemIds, false, cart?.Id || '', null, null, null);\r\n const eligibilityData = await GetProductEligibilityAction(input, props.context.actionContext);\r\n setEligibilityChecked(true);\r\n let list: EligibleItems = [];\r\n\r\n eligibilityData.forEach((i: any) => {\r\n const id = getExtensionPropertyValueByKey(i.ExtensionProperties, 'ItemId', CommercePropertyValueEnum.string);\r\n list.push({\r\n ItemId: String(id),\r\n IsEligible: i.IsEligible,\r\n IsAssorted: true\r\n });\r\n });\r\n setEligbilityList(list);\r\n void getInvProfs();\r\n };\r\n\r\n const getInvProfs = async (): Promise<void> => {\r\n if (areInventoryRangesChecked) {\r\n return;\r\n }\r\n const itemIds = props.data.products?.result?.products.map(p => p.ItemId!) || [];\r\n const resp = await getInventoryLevelRangesAsync({ callerContext: props.context.actionContext }, itemIds);\r\n setAreInventoryRangesChecked(true);\r\n setInventoryRangesList(resp);\r\n };\r\n\r\n React.useEffect(() => {\r\n if (isAuthenticated) {\r\n void getProductEligibility();\r\n }\r\n }, [props.data.products]);\r\n\r\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\r\n const [modalOpen, setModalOpen] = React.useState<boolean>(false);\r\n const [addedProduct, setAddedProduct] = React.useState<SimpleProduct | undefined>(undefined);\r\n const [productPricing, setProductPricing] = React.useState<ProductPrice | undefined>(undefined);\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n const setModalProps = (product: SimpleProduct, price: ProductPrice): IPopupProps => {\r\n return {\r\n modalOpen: modalOpen,\r\n context: props.context,\r\n className: 'list-view__modal',\r\n gridSettings,\r\n imageSettings,\r\n priceComponent: props.component,\r\n id: '1',\r\n productQuantity: 1,\r\n navigationUrl: getUrlSync('cart', actionContext),\r\n setModalOpen: value => setModalOpen(value),\r\n typeName: 'Add To Cart',\r\n data: { product, price },\r\n dialogStrings: {\r\n goToCartText: goToCartText,\r\n currentPriceText: '',\r\n continueShoppingText: continueShoppingText,\r\n freePriceText: '',\r\n headerItemOneText: addToCartModalHeading,\r\n headerItemFormatText: '',\r\n originalPriceText: '',\r\n headerMessageText: ''\r\n }\r\n };\r\n };\r\n\r\n const handleAddToCart = (productId: number, quantity: number) => {\r\n const foundProduct = productSearchResults.result?.activeProducts.find(pr => pr.RecordId === productId);\r\n if (!foundProduct) {\r\n return;\r\n }\r\n const product: SimpleProduct = {\r\n BasePrice: foundProduct.BasePrice || foundProduct.Price,\r\n AdjustedPrice: foundProduct.Price,\r\n Name: foundProduct.Name,\r\n RecordId: foundProduct.RecordId,\r\n ItemId: foundProduct.ItemId,\r\n ProductTypeValue: 1,\r\n Price: foundProduct.Price\r\n };\r\n setAddedProduct(product);\r\n setProductPricing(getProductPrice(productPrices, product.RecordId));\r\n cart.result\r\n ?.addProductToCart({\r\n product,\r\n count: quantity\r\n })\r\n .then(response => {\r\n if (response.status === 'SUCCESS' && props.app.config.addToCartBehavior === 'showModal') {\r\n setModalOpen(true);\r\n }\r\n });\r\n };\r\n\r\n const getProductSupersessionProperty = (product: ProductSearchResult, extensionKey: SupersessionKey) => {\r\n const properties = product.ExtensionProperties;\r\n if (properties) {\r\n return properties.find(pr => pr.Key === extensionKey)?.Value?.StringValue || null;\r\n }\r\n return null;\r\n };\r\n\r\n const renderAddtoCartButton = (pr: ProductSearchResult, courseId: any, courseInCartText: string) => {\r\n if (isAuthenticated) {\r\n const item: any = eligbilityList.find(i => i.ItemId === pr.ItemId);\r\n\r\n const currentInvString = getProductSupersessionProperty(pr, SupersessionKey.Inventory) || '0';\r\n const currentInventory = parseInt(currentInvString, 10);\r\n let invProfOos: IItemInventoryLevelProfileEntity | undefined;\r\n inventoryRangesList.map(ir => {\r\n const tempInvRange = ir.Profile?.find(p => p.ItemId === pr.ItemId && p.Code === 'OOS');\r\n if (tempInvRange) {\r\n invProfOos = tempInvRange;\r\n }\r\n });\r\n\r\n const OosUpperBound =\r\n invProfOos?.hasOwnProperty('UpperBoundInclusive') && invProfOos?.UpperBoundInclusive !== undefined\r\n ? invProfOos.UpperBoundInclusive\r\n : 0;\r\n const isOutOfStock = currentInventory <= OosUpperBound;\r\n\r\n if (item?.IsEligible && !isOutOfStock) {\r\n if (props.data.cart.result?.hasInvoiceLine) {\r\n return (\r\n <td>\r\n <div className='eduerrors'>{props.resources.invoiceInCartText}</div>\r\n </td>\r\n );\r\n }\r\n if (courseId) {\r\n return (\r\n <td>\r\n <div className='eduerrors'>{courseInCartText}</div>\r\n </td>\r\n );\r\n }\r\n return <AddToCartListComponent productId={pr.RecordId} onAddToCart={handleAddToCart} addToCartButtonText={addToCartText} />;\r\n } else {\r\n return (\r\n <td colSpan={2} style={{ textAlign: 'right' }}>\r\n {item?.ItemId ? props.resources.productEligibilityText : ' '}\r\n </td>\r\n );\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const _renderProductsListView = () => {\r\n const { courseInCartText } = props.resources;\r\n\r\n let courseId: string | number | boolean | null | undefined;\r\n let cart = props.data.cart.result?.cart;\r\n let cartlines = cart?.CartLines;\r\n if (cartlines && cartlines.length) {\r\n courseId = getExtensionPropertyValueByKey(cartlines[0].ExtensionProperties, 'CourseId', CommercePropertyValueEnum.string);\r\n }\r\n\r\n return (\r\n <Table className={'list-view__table'}>\r\n <thead>\r\n <tr>\r\n <th />\r\n <th>{partNoHeading}</th>\r\n <th>{descriptionHeading}</th>\r\n {isAuthenticated ? <th>{availabilityHeading}</th> : null}\r\n <th>{listPriceHeading}</th>\r\n <th>{isAuthenticated ? yourPriceHeading : priceAndAvailabilityHeading}</th>\r\n {isAuthenticated ? (\r\n <>\r\n <th>{quantityHeading}</th>\r\n <th />\r\n </>\r\n ) : null}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {productSearchResults.result?.activeProducts.map(pr => {\r\n // const pricing = getProductPrice(productPrices, pr.RecordId);\r\n // const inventoryLabel = getInventoryLabel(configurationObject?.result?.channelInventoryConfigurationId, pr);\r\n const priceComponent = <span>{cultureFormatter.formatCurrency(pr.BasePrice || pr.Price)}</span>;\r\n return (\r\n <tr key={pr.RecordId}>\r\n <td>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n gridSettings,\r\n `/Products/${pr.ItemId}_000_001.png`,\r\n pr.PrimaryImageUrl,\r\n pr.Name,\r\n request\r\n )}\r\n </td>\r\n <td>\r\n <a href={getProductPageUrlSync(pr.Name!, pr.RecordId, actionContext)}>{pr.ItemId}</a>\r\n <br />\r\n {getProductSupersessionProperty(pr, SupersessionKey.SupersededId) ? (\r\n <p className={'supersession-text'}>\r\n {supersededFromText} {getProductSupersessionProperty(pr, SupersessionKey.SupersededId)}\r\n </p>\r\n ) : null}\r\n </td>\r\n <td>\r\n {pr.Name}\r\n <br />\r\n {getProductSupersessionProperty(pr, SupersessionKey.SupersededName) ? (\r\n <p className={'supersession-text'}>\r\n {supersededFromText} {getProductSupersessionProperty(pr, SupersessionKey.SupersededName)}\r\n </p>\r\n ) : null}\r\n </td>\r\n {isAuthenticated ? <td>{getProductSupersessionProperty(pr, SupersessionKey.Inventory)}</td> : null}\r\n <td>{priceComponent}</td>\r\n {/* {LoginToViewPricingComponent(props.context.request, loginToViewPricing,\r\n priceComponent, props.config.onlyShowPriceWhenAuthenticated ?? true)}</td> */}\r\n\r\n <td>\r\n {LoginToViewPricingComponent(\r\n props.context.request,\r\n loginToViewPricingAndAvailabilityText,\r\n <>{cultureFormatter.formatCurrency(pr.Price)}</>,\r\n isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated\r\n )}\r\n {/* {(isAuthenticated || !props.config.onlyShowPriceWhenAuthenticated) ? cultureFormatter.formatCurrency(pr.Price) : null} */}\r\n </td>\r\n {renderAddtoCartButton(pr, courseId, courseInCartText)}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </Table>\r\n );\r\n };\r\n const enableSearchWrap = props.context.app.config.enableSearchWrap;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps, enableSearchWrap, props)}\r\n </Node>\r\n )}\r\n {choiceSummary}\r\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n {errorMessage}\r\n {enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {/* @ts-ignore */}\r\n {modalOpen && addedProduct ? <Popup {...setModalProps(addedProduct, productPricing)} /> : null}\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps, enableSearchWrap, props)}\r\n </Node>\r\n )}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n <Node className='ms-refiner-heading'>\r\n <Node className='ms-refiner-heading_title'>\r\n <Button\r\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\r\n aria-label='Filter'\r\n onClick={toggle}\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n >\r\n {filterText}\r\n </Button>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\r\n <div className='ms-search-result-wrapper-sort-by-category'>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n </Node>\r\n <Node {...ProductSectionContainer}>\r\n {errorMessage}\r\n {/*{enableProdutDescription ? renderProducts(props) : renderProductCards(props)}*/}\r\n {listView ? _renderProductsListView() : enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\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\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <Node tag='h1' className=''>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst 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 if (productCardimageSettings) {\r\n productCardimageSettings.viewports = {\r\n lg: { h: 100, w: 100, q: '80' },\r\n md: { h: 100, w: 100, q: '80' },\r\n sm: { h: 100, w: 100, q: '80' },\r\n xs: { h: 100, w: 100, q: '80' }\r\n };\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\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return <Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} className={'eve-listview__img'} />;\r\n};\r\n\r\nconst getProductPrice = (pricing: ProductPrice[] | undefined, productRecId: number): ProductPrice | undefined => {\r\n if (!pricing) {\r\n return undefined;\r\n }\r\n return pricing.find(pr => pr.ProductId === productRecId);\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport { ProductDimensionsMatrix } from '@msdyn365-commerce/components';\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport { ICoreContext, getCatalogId } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions, IDimensionsApp, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { IBulkPurchaseData } from './bulk-purchase.data';\nimport { IBulkPurchaseProps } from './bulk-purchase.props.autogenerated';\n\n/**\n * Additional optional props for the bulk purchase.\n */\nexport interface IBulkPurchaseExtendedProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n container: IModuleProps;\n content: React.ReactElement;\n}\n\n/**\n * BulkPurchase state message Interface.\n */\nexport interface IBulkPurchaseStateMessage {\n isOpen: boolean;\n messageGlyph: string;\n messageText: string;\n statusCssString: string;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n stateMessage?: IBulkPurchaseStateMessage;\n}\n\n/**\n * Bulk-purchase module.\n */\nexport class BulkPurchase extends React.PureComponent<IBulkPurchaseExtendedProps, IBulkPurchaseState> {\n public static readonly className = 'ms-bulk-purchase';\n private readonly _errorCssClass: string = 'danger';\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n private readonly collapseRef: React.RefObject<Collapse> = React.createRef<Collapse>();\n\n public constructor(props: IBulkPurchaseExtendedProps) {\n super(props);\n\n this.state = {\n isExpanded: false\n };\n }\n\n public render(): React.ReactElement | null {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const hasDimensionsInData = ArrayExtensions.hasElements(this.props.data.productDimensions?.result);\n if (!hasDimensionsInProps && !hasDimensionsInData) {\n return null;\n }\n\n const viewProps: IBulkPurchaseViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className: classnames(BulkPurchase.className, this.props.config.className)\n },\n content: this._renderCollapseContent(`${BulkPurchase.className}__content`)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderCollapseContent(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n </div>\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n <Button\n className={className}\n onClick={this._toggleCollapse}\n aria-expanded={this.state.isExpanded}\n title={this.props.resources.bulkPurchaseHeaderTitle}\n >\n {this.props.resources.bulkPurchaseHeaderTitle}\n </Button>\n );\n }\n\n /**\n *This function is being used to handel variant change dropdown.\n */\n private _dimensionDropDownChange = () => {\n this.collapseRef.current?.reEvaluateHeight();\n };\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n <Collapse className={className} isOpen={this.state.isExpanded} ref={this.collapseRef}>\n {this._renderMainContent(`${className}__main-content`)}\n </Collapse>\n );\n }\n\n private _renderMainContent(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n const userMessageNode = this.state.stateMessage ? (\n <Alert color={this.state.stateMessage.statusCssString} isOpen={this.state.stateMessage.isOpen}>\n <span className={this.state.stateMessage.messageGlyph} />\n <span>{this.state.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return (\n <div className={className}>\n {!isMobileDevice && (\n <div className={`${className}__description`}>\n <RichTextComponent text={this.props.resources.bulkPurchaseDescriptionText} />\n </div>\n )}\n {userMessageNode}\n {this._renderMatrix(`${className}__matrix-container`)}\n </div>\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState?.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n return (\n <ProductDimensionsMatrix\n className={className}\n context={this.props.context as ICoreContext<IDimensionsApp>}\n data={{\n dimensions: hasDimensionsInProps ? this.props.productDimensions! : this.props.data.productDimensions!.result!,\n orderTemplates: this.props.data.orderTemplates?.result,\n customerInformation: this.props.data.customerInformation?.result\n }}\n resources={this.props.resources}\n dimensionOnChange={this._dimensionDropDownChange}\n onErrorMessage={this._onErrorMessage}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n catalogId={catalogId}\n />\n );\n }\n\n private _onErrorMessage = (errorMessage: string) => {\n this.setState({\n stateMessage: {\n messageText: errorMessage,\n statusCssString: this._errorCssClass,\n messageGlyph: this._errorCssGlyphClass,\n isOpen: true\n }\n });\n };\n\n /**\n * Callback which toggles collapse mode.\n */\n private readonly _toggleCollapse = () => {\n this.setState(state => ({\n isExpanded: !state.isExpanded\n }));\n };\n}\n\nexport default BulkPurchase;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToCartComponent,\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n IAddToCartFailureResult,\n IAddToCartResources,\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateActionErrorResult,\n IOrderTemplateNameDialogResources,\n IWishlistActionErrorResult,\n PriceComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductAvailableQuantity, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, DeliveryMode, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n Heading,\n ITelemetryContent,\n Node,\n Quantity,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonData,\n IBuyboxCommonResources,\n IBuyboxErrorBlockProps,\n IBuyboxExtentedProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps,\n IBuyboxState,\n IProductDetails,\n ShopSimiliarButtonType\n} from './buyboxInterface';\nimport { getConfigureErrors, getGenericError, getQuantityError } from './utilities/error-utilities';\n\nconst _getClassNamePrefix = (typeName: string): string => {\n return typeName.toLocaleLowerCase() === 'quickview' ? 'ms-quickView' : 'ms-buybox';\n};\n\nexport function getBuyBoxInventoryLabel(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const { typeName } = props;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const productAvailableQuantity = props.data.productAvailableQuantity?.result ?? productDetails?.productAvailableQuantity;\n\n const className = _getClassNamePrefix(typeName);\n if (!productAvailableQuantity || !ArrayExtensions.hasElements(productAvailableQuantity)) {\n return undefined;\n }\n const shippingInventory = productAvailableQuantity.find(shipping => shipping.deliveryType === DeliveryMode.shipping);\n\n if (shippingInventory) {\n let inventoryClassName: string;\n if (shippingInventory.StockLevelCode) {\n inventoryClassName = `${className}__inventory-label ${className}__inventory-code-${shippingInventory.StockLevelCode.toLowerCase()}`;\n } else {\n inventoryClassName = `${className}__inventory-label`;\n }\n return (\n <div className={`${className}__inventory-info`}>\n <span className={inventoryClassName}>{shippingInventory.StockLevelLabel}</span>\n </div>\n );\n }\n\n return undefined;\n}\n\nexport function getBuyboxProductTitle(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const {\n config: { titleHeadingTag = 'h1' },\n typeName\n } = props;\n const className = _getClassNamePrefix(typeName);\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ?? productDetails?.product ?? undefined;\n\n return product && <Heading className={`${className}__product-title`} headingTag={titleHeadingTag} text={product.Name ?? ''} />;\n}\n\nexport function getBuyboxProductDescription(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const { typeName } = props;\n const className = _getClassNamePrefix(typeName);\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ?? productDetails?.product ?? undefined;\n\n return product && <p className={`${className}__product-description`}>{product.Description}</p>;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param {IBuyboxExtentedProps<IBuyboxCommonData>} props The buybox module props.\n * @param {IProductDetails} productDetails The product details to be displyed in buybox.\n * @returns {React.ReactElement} The node representing markup for unit of measure component.\n */\nexport function getBuyboxProductUnitOfMeasure(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const { typeName } = props;\n const className = _getClassNamePrefix(typeName);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (\n props.context.app.config &&\n (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none')\n ) {\n return undefined;\n }\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ?? productDetails?.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n props.telemetry.warning('Missing defult unit of measureor theproduct');\n return undefined;\n }\n\n return (\n <div className={`${className}__product-unit-of-measure`}>\n <span>{product.DefaultUnitOfMeasure}</span>\n </div>\n );\n}\n\nlet telemetryContent: ITelemetryContent;\n\n/**\n * On add to cart failed function.\n * @param props -The buybox module props.\n * @param state -The buybox module state.\n * @param callbacks -The buybox module callbacks.\n * @param defaultMinimumKeyInPrice -The default minimum key in price.\n * @param defaultMaximumKeyInPrice -The default maximum key in price.\n * @param cart -The cart state.\n * @param product -The simple product.\n * @param productAvailability -The product available quantity.\n * @returns Update error state.\n */\nconst onAddToCartFailed = (\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n defaultMinimumKeyInPrice: number,\n defaultMaximumKeyInPrice: number,\n cart: ICartState,\n product: SimpleProduct,\n productAvailability: ProductAvailableQuantity | undefined\n) => (result: IAddToCartFailureResult) => {\n let quantityErrorForState: string | undefined;\n let customAmountErrorForState: string | undefined;\n let otherErrorForState: string | undefined = getGenericError(\n result,\n cart,\n props.resources,\n props.context,\n product,\n productAvailability,\n undefined\n );\n\n if (result.failureReason === 'OUTOFSTOCK') {\n quantityErrorForState = result.failureReason === 'OUTOFSTOCK' ? getQuantityError(result.stockLeft, props.resources) : undefined;\n } else if (\n result.failureReason === 'CARTACTIONFAILED' &&\n result.cartActionResult &&\n (result.cartActionResult.substatus === 'MAXQUANTITY' || result.cartActionResult.substatus === 'QUANTITYLIMITS')\n ) {\n quantityErrorForState = getGenericError(result, cart, props.resources, props.context, product, productAvailability, undefined);\n otherErrorForState = undefined; // Prevent error duplication in otherError and quantityError\n }\n\n if (result.failureReason === 'INVALIDCUSTOMAMOUNT') {\n if (state.keyInPriceAmount === undefined || state.keyInPriceAmount < (props.config.minimumKeyInPrice || defaultMinimumKeyInPrice)) {\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(\n props.config.minimumKeyInPrice || defaultMinimumKeyInPrice\n );\n customAmountErrorForState = props.resources.invalidSmallCustomAmountText.replace('{minAmount}', formatedAmountLimit);\n } else if (state.keyInPriceAmount > (props.config.maximumKeyInPrice || defaultMaximumKeyInPrice)) {\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(\n props.config.maximumKeyInPrice || defaultMaximumKeyInPrice\n );\n customAmountErrorForState = props.resources.invalidLargeCustomAmountText.replace('{maxAmount}', formatedAmountLimit);\n }\n }\n\n callbacks.updateErrorState({\n errorHost: 'ADDTOCART',\n quantityError: quantityErrorForState,\n configureErrors:\n result.failureReason === 'MISSINGDIMENSION'\n ? getConfigureErrors(result.missingDimensions, props.resources, product?.IsGiftCard)\n : {},\n customAmountError: customAmountErrorForState,\n otherError: otherErrorForState\n });\n};\n\n/**\n * On Item Add To Cart function.\n * @param typeName -Type name.\n * @param callbacks -Buybox Callbacks.\n * @returns Change modal open.\n */\nconst onItemAddedToCart = (typeName: string, callbacks: IBuyboxCallbacks) => (result: ICartActionResult) => {\n if (typeName === 'quickview') {\n callbacks.changeModalOpen(false);\n }\n};\n\nexport function getBuyboxAddToCart(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n defaultMinimumKeyInPrice: number,\n defaultMaximumKeyInPrice: number,\n productDetails?: IProductDetails,\n hasAvailableProducts?: boolean\n): IBuyboxAddToCartViewProps {\n const { id, typeName, context, resources } = props;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ?? productDetails?.product;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const cart = props.data.cart?.result ?? productDetails?.cart;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const productAvailableQuantity = props.data.productAvailableQuantity?.result ?? productDetails?.productAvailableQuantity;\n\n const {\n quantity,\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\n selectedProduct,\n isUpdatingDimension,\n isUpdatingDeliveryOptions,\n isServiceItem\n } = state;\n\n const productAvailability = state.productAvailableQuantity\n ? state.productAvailableQuantity.ProductAvailableQuantity\n : productAvailableQuantity && productAvailableQuantity.length > 0\n ? productAvailableQuantity[0].ProductAvailableQuantity\n : undefined;\n\n const dialogStrings: IAddToCartResources = {\n goToCartText: resources.buyBoxGoToCartText,\n continueShoppingText: resources.buyBoxContinueShoppingText,\n closeNotificationLabel: resources.closeNotificationLabel,\n headerItemOneText: resources.buyBoxSingleItemText,\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\n headerMessageText: resources.buyBoxHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n addedQuantityText: resources.addedQuantityText\n };\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const isProductQuantityLoading = typeName !== 'quickview' && props.data.productAvailableQuantity.status === 'LOADING';\n if (isProductQuantityLoading) {\n callbacks.changeUpdatingDimension(false);\n }\n\n const isLoadingDeliveryOptions = typeName !== 'quickview' && props.data.deliveryOptions?.status === 'LOADING';\n if (isLoadingDeliveryOptions && callbacks.changeUpdatingDeliveryOptions) {\n callbacks.changeUpdatingDeliveryOptions(false);\n }\n\n telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.typeName, props.telemetry);\n\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n // from quickview we are not getting deliveryoptions in props.data hence getting it from quickview state\n const deliveryOptions = typeName === 'quickview' ? state.productDeliveryOptions : props.data.deliveryOptions?.result;\n const isEmailDelivery =\n ArrayExtensions.hasElements(deliveryOptions?.DeliveryOptions) && deliveryOptions!.DeliveryOptions[0].Code === emailDeliveryModeCode;\n const className = _getClassNamePrefix(typeName);\n const isDisabled = isUpdatingDimension && typeName === 'quickview';\n const { enableHidePdpRepeatingErrors } = props.context.request.features;\n return {\n ContainerProps: {\n className: `${className}__add-to-cart-container`\n },\n button: product && (\n <AddToCartComponent\n addToCartText={resources.addToCartText}\n outOfStockText={resources.outOfStockText}\n navigationUrl={getUrlSync('cart', context.actionContext)}\n quantity={quantity}\n data={{ product, price: state.productPrice }}\n context={context}\n disabled={isDisabled}\n id={id}\n hasAvailableProducts={hasAvailableProducts}\n typeName={typeName}\n onError={onAddToCartFailed(\n props,\n state,\n callbacks,\n defaultMinimumKeyInPrice,\n defaultMaximumKeyInPrice,\n cart!,\n product,\n productAvailability\n )}\n getSelectedProduct={selectedProduct}\n productAvailability={productAvailability}\n isProductQuantityLoading={isProductQuantityLoading}\n isUpdatingDimension={isUpdatingDimension}\n changeUpdatingDimension={callbacks.changeUpdatingDimension}\n isLoadingDeliveryOptions={isLoadingDeliveryOptions}\n isUpdatingDeliveryOptions={isUpdatingDeliveryOptions}\n changeUpdatingDeliveryOptions={callbacks.changeUpdatingDeliveryOptions}\n dialogStrings={dialogStrings}\n gridSettings={props.context.request.gridSettings}\n imageSettings={defaultImageSettings}\n telemetryContent={telemetryContent}\n isAddServiceItemToCart={isServiceItem}\n isPriceKeyedIn={state.isPriceKeyedIn}\n customPriceAmount={state.keyInPriceAmount}\n isCustomPriceSelected={state.isCustomPriceSelected}\n maximumKeyInPrice={props.config.maximumKeyInPrice}\n minimumKeyInPrice={props.config.minimumKeyInPrice}\n defaultMinimumKeyInPrice={defaultMinimumKeyInPrice}\n defaultMaximumKeyInPrice={defaultMaximumKeyInPrice}\n isOrderQuantityLimitsFeatureEnabled={_isOrderQuantityLimitsFeatureEnabled(props) || _isChannelLimitsFeatureEnabled(props)}\n isAddEmailDeliveryItemToCart={isEmailDelivery}\n onAdd={onItemAddedToCart(typeName, callbacks)}\n isNavigationToCartPageDisabled={typeName === 'quickview'}\n />\n ),\n errorBlock: (\n <BuyboxErrorBlock\n configureErrors={configureErrors}\n quantityError={quantityError}\n customAmountError={customAmountError}\n otherError={otherError}\n resources={resources}\n showError={errorHost === 'ADDTOCART'}\n enableHidePdpRepeatingErrors={enableHidePdpRepeatingErrors}\n />\n )\n };\n}\n\n/**\n * Get the React.ReactElement contains price.\n * @param props - The IBuyboxExtentedProps.\n * @param state - The buybox state.\n * @returns The React.ReactElement.\n */\nexport function getBuyboxProductPrice(props: IBuyboxExtentedProps<IBuyboxCommonData>, state: IBuyboxState): React.ReactElement | undefined {\n const { id, typeName, context, resources } = props;\n\n return (\n state.productPrice && (\n <PriceComponent\n id={id}\n typeName={typeName}\n context={context}\n data={{ price: state.productPrice }}\n product={props.data.product?.result}\n isPriceMinMaxEnabled={\n props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n )?.IsEnabled\n }\n isSalesAgreementPriceFeatureEnabled={\n props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSalesAgreementPriceSupportFeature'\n )?.IsEnabled\n }\n priceResources={{\n priceRangeSeparator: resources.priceRangeSeparator,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n salesAgreementExpirationDatePrompt: resources.salesAgreementExpirationDatePrompt,\n salesAgreementCommittedQuantityPrompt: resources.salesAgreementCommittedQuantityPrompt,\n salesAgreementRemainingQuantityPrompt: resources.salesAgreementRemainingQuantityPrompt\n }}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n />\n )\n );\n}\n\nexport function getBuyboxProductRating(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n productDetails?: IProductDetails\n): React.ReactElement | undefined {\n const { id, typeName, context, resources } = props;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const ratingsSummary = props.data.ratingsSummary?.result ?? productDetails?.ratingsSummary;\n if (!ratingsSummary || !ratingsSummary.averageRating) {\n return <div />;\n }\n const ratingComponent = (\n <RatingComponent\n avgRating={ratingsSummary.averageRating || 0}\n readOnly\n ariaLabel={format(resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n ratingCount={`${ratingsSummary.reviewsCount}`}\n data={{}}\n context={context}\n id={id}\n typeName={typeName}\n />\n );\n\n return ratingComponent;\n}\n\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n}\n\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxCommonResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n}\n\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n}\n\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: IBuyboxCommonResources\n): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n}\n\n/**\n * Add to order template failed function.\n * @param callbacks -Buybox callbacks.\n * @param resources -Buybox common resources.\n * @param product -Simple product.\n * @returns Update error state.\n */\nconst onAddToOrderTemplateFailed = (callbacks: IBuyboxCallbacks, resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (\n result: IOrderTemplateActionErrorResult\n) => {\n callbacks.updateErrorState({\n errorHost: 'ORDER_TEMPLATE',\n configureErrors:\n result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\n });\n};\n\nexport function getBuyboxProductAddToOrderTemplate(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n isMultipleCatalogsFeatureEnabled?: boolean,\n catalogId?: number\n): IBuyboxAddToOrderTemplateViewProps | undefined {\n const {\n id,\n typeName,\n context,\n data: {\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n resources\n } = props;\n\n const product = props.data.product?.result;\n\n const {\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\n quantity\n } = state;\n\n // If custom amount is selected, add-to-orderTemplate is disabled\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n const className = _getClassNamePrefix(typeName);\n const { enableHidePdpRepeatingErrors } = props.context.request.features;\n\n return {\n ContainerProps: {\n className: `${className}__add-to-order-template-container`\n },\n button: product && orderTemplates && (\n <AddToOrderTemplateComponent\n className='msc-add-to-cart-extra-actions'\n addToOrderTemplateButtonText={resources.addToOrderTemplateButtonText}\n addToOrderTemplateButtonTooltip={resources.addToOrderTemplateButtonTooltip}\n addToOrderTemplateDialogResources={generateAddToOrderTemplateDialogResources(resources)}\n createOrderTemplateDialogResources={generateOrderTemplateNameDialogResources(resources)}\n itemAddedToOrderTemplateDialogResources={generateItemAddedToOrderTemplateDialogResources(resources)}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n )}\n data={{ product, quantity, orderTemplates, customerInformation }}\n context={context}\n id={id}\n typeName={typeName}\n onError={onAddToOrderTemplateFailed(callbacks, resources, product)}\n shouldShowButtonFailedTooltip={state.isCustomPriceSelected}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n {...(isMultipleCatalogsFeatureEnabled && { catalogId: catalogId })}\n />\n ),\n errorBlock: (\n <BuyboxErrorBlock\n configureErrors={configureErrors}\n quantityError={quantityError}\n customAmountError={customAmountError}\n otherError={otherError}\n resources={resources}\n showError={errorHost === 'ORDER_TEMPLATE'}\n enableHidePdpRepeatingErrors={enableHidePdpRepeatingErrors}\n />\n )\n };\n}\n\n/**\n * Renders add to comparison button for the given product.\n * @param productComparisonButton - React element of the button.\n * @param product - Product information.\n * @param catalogId - Current catalog.\n * @param state - Buybox state.\n * @returns React element of the button.\n */\nexport function getBuyboxProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: SimpleProduct,\n catalogId: number,\n state: IBuyboxState\n): JSX.Element | undefined {\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Add to wishlist failed function.\n * @param callbacks -Buybox callbacks.\n * @param resources -Buybox resources.\n * @param product -Simple product.\n * @returns Update error state.\n */\nconst onAddToWishlistFailed = (callbacks: IBuyboxCallbacks, resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (\n result: IWishlistActionErrorResult\n) => {\n callbacks.updateErrorState({\n errorHost: 'WISHLIST',\n configureErrors:\n result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\n });\n};\n\nexport function getBuyboxProductAddToWishlist(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n productDetails?: IProductDetails\n): IBuyboxAddToWishlistViewProps | undefined {\n const {\n id,\n typeName,\n context,\n data: {\n wishlists: { result: wishlists }\n },\n resources\n } = props;\n\n const product = props.data.product?.result ? props.data.product.result : productDetails?.product;\n\n const {\n errorState: { configureErrors, quantityError, customAmountError, otherError, errorHost },\n selectedProduct\n } = state;\n\n // If custom amount is selected, add-to-wishlist is disabled\n if (state.isCustomPriceSelected) {\n return undefined;\n }\n\n const className = _getClassNamePrefix(typeName);\n const { enableHidePdpRepeatingErrors } = props.context.request.features;\n return {\n ContainerProps: {\n className: `${className}__add-to-wishlist-container`\n },\n button: product && (\n <AddToWishlistComponent\n className='msc-add-to-cart-extra-actions'\n addToWishlistButtonText={resources.addToWishlistButtonText}\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\n addToWishlistMessage={resources.addToWishlistMessage}\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\n addItemToWishlistError={resources.addItemToWishlistError}\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\n nameOfWishlist={resources.nameOfWishlist}\n data={{ product, wishlists }}\n context={context}\n id={id}\n ariaRole='button'\n typeName={typeName}\n onError={onAddToWishlistFailed(callbacks, resources, product)}\n getSelectedProduct={selectedProduct}\n />\n ),\n errorBlock: (\n <BuyboxErrorBlock\n configureErrors={configureErrors}\n quantityError={quantityError}\n customAmountError={customAmountError}\n otherError={otherError}\n resources={resources}\n showError={errorHost === 'WISHLIST'}\n enableHidePdpRepeatingErrors={enableHidePdpRepeatingErrors}\n />\n )\n };\n}\n\n/**\n * On quantity change function.\n * @param callbacks -Buybox callbacks.\n * @returns Update quantity.\n */\nconst onQuantityChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number) => {\n if (callbacks.updateQuantity) {\n callbacks.updateQuantity(newValue);\n }\n};\n\nexport function getBuyboxProductQuantity(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n): IBuyboxProductQuantityViewProps {\n const { resources, typeName } = props;\n\n const {\n quantity,\n min,\n max,\n errorState: { quantityError }\n } = state;\n\n const className = _getClassNamePrefix(typeName);\n\n return {\n ContainerProps: {\n className: `${className}__quantity`\n },\n LabelContainerProps: {\n tag: 'label',\n className: `${className}__product-quantity-label`,\n htmlFor: `${className}__product-quantity-input`\n },\n heading: <div className={`${className}__product-quantity-label-heading`}>{resources.productQuantityHeading}</div>,\n errors: quantityError && (\n <span className='msc-alert msc-alert-noborder msc-alert-danger'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n <span>{quantityError}</span>\n </span>\n ),\n input: (\n <Quantity\n id={`${className}__product-quantity-input`}\n min={min}\n max={max}\n currentCount={quantity}\n onChange={onQuantityChangeHandler(callbacks)}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n telemetryContent={telemetryContent}\n />\n )\n };\n}\n\nexport function getBuyboxShopSimilarButton(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n buttonType: ShopSimiliarButtonType\n): IBuyboxShopSimilarLookViewProps {\n const { resources, context, typeName } = props;\n const product = props.data.product?.result;\n\n const className = _getClassNamePrefix(typeName);\n const navigationUrl = (shopSimiliarButtonType: ShopSimiliarButtonType) => () => {\n const searchURL = getUrlSync('search', context && context.actionContext);\n const separator = searchURL!.includes('?') ? '&' : '?';\n document.location.href = `${searchURL}${separator}productId=${product &&\n product.RecordId}&recommendation=${shopSimiliarButtonType}`;\n };\n const telemetryText =\n buttonType === ShopSimiliarButtonType.Looks ? TelemetryConstant.ShopSimliarLooks : TelemetryConstant.ShopSimliarDescription;\n const payLoad = getPayloadObject('click', telemetryContent, telemetryText);\n const attribute = getTelemetryAttributes(telemetryContent, payLoad);\n const text = buttonType === ShopSimiliarButtonType.Looks ? resources.shopSimilarLooksText : resources.shopSimilarDescriptionText;\n\n return {\n ContainerProps: {\n className: `${className}__shopsimilar${buttonType}`\n },\n input: (\n <Button\n title={text}\n className={`${className}__shop-similar-${buttonType}-button`}\n aria-label={text}\n onClick={navigationUrl(buttonType)}\n {...attribute}\n >\n {text}\n </Button>\n )\n };\n}\n\n/**\n * On price change function.\n * @param callbacks -Buybox callbacks.\n * @returns Update key in price.\n */\nconst onPriceChangeHandler = (callbacks: IBuyboxCallbacks) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.currentTarget.value;\n callbacks.updateKeyInPrice(value.length > 0 ? Number(value) : Number.parseFloat(value));\n};\n\nexport function getBuyboxKeyInPrice(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n): IBuyboxKeyInPriceViewProps {\n const { config, resources } = props;\n\n const {\n errorState: {}\n } = state;\n\n const className = _getClassNamePrefix(props.typeName);\n\n return {\n ContainerProps: {\n className: `${className}__key_in_price`\n },\n LabelContainerProps: {\n tag: 'label',\n className: `${className}__key_in_price-label`,\n htmlFor: `${className}__key_in_price`\n },\n heading: <div className={`${className}__key_in_price-label-heading`}>{resources.buyboxKeyInPriceLabelHeading}</div>,\n input: (\n <input\n type='number'\n className={`${className}__key_in_price_custom-amount__input`}\n onChange={onPriceChangeHandler(callbacks)}\n aria-label={resources.buyboxKeyInPriceLabelHeading}\n aria-valuemin={config.minimumKeyInPrice}\n aria-valuemax={config.minimumKeyInPrice}\n aria-valuenow={state.keyInPriceAmount}\n value={state.keyInPriceAmount}\n min={config.minimumKeyInPrice}\n max={config.minimumKeyInPrice}\n />\n )\n };\n}\n\nexport const BuyboxErrorBlock: React.FC<IBuyboxErrorBlockProps> = ({\n showError,\n configureErrors,\n quantityError,\n customAmountError,\n otherError,\n resources,\n enableHidePdpRepeatingErrors\n}) => {\n let errorMessages: (string | undefined)[] = [];\n\n // skip configuration repeating errors when flight is enabled\n if (!enableHidePdpRepeatingErrors) {\n errorMessages = Object.values(configureErrors).filter(message => message !== undefined);\n }\n\n // skip quantity repeating errors when flight is enabled\n if (quantityError && !enableHidePdpRepeatingErrors) {\n errorMessages.push(quantityError);\n }\n\n if (customAmountError) {\n errorMessages.push(customAmountError);\n }\n\n if (otherError) {\n errorMessages.push(otherError);\n }\n\n return (\n <Alert isOpen={showError && errorMessages.length > 0} color='danger' assertive aria-label={resources.buyboxErrorMessageHeader}>\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>{resources.buyboxErrorMessageHeader}</span>\n </div>\n {errorMessages.map((message, index) => {\n return (\n <div key={index} className='msc-alert__line'>\n {message}\n </div>\n );\n })}\n </Alert>\n );\n};\n\nexport function getQuantityLimitsMessages(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState\n): React.ReactElement | undefined {\n const { resources } = props;\n\n const { min, max } = state;\n\n if (!_isOrderQuantityLimitsFeatureEnabled(props) && !_isChannelLimitsFeatureEnabled(props)) {\n return undefined;\n }\n\n return (\n <Node className='quantity_text_message'>\n {_renderMaxLabel(props, max, resources.maxQuantityText)}\n {_renderMinLabel(props, min, resources.minQuantityText)}\n </Node>\n );\n}\n\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\nexport const EcommerceQuantityLimitConfigurationsFeatureName: string =\n 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature';\nexport const RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName: string = 'RevertToSiteBuilderOrderQuantityLimitsSettings';\n\nconst _renderMaxLabel = (\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n max: number | undefined,\n maxQuantityText: string\n): React.ReactElement | undefined => {\n const { resources, typeName } = props;\n const className = _getClassNamePrefix(typeName);\n if (max && max !== 0 && max !== Number.MAX_VALUE) {\n return (\n <p className={`${className}__minmax_label_text`}>\n <span className='sr-only'>{resources.informationIconText}</span>\n <i className='msi-InfoCircle' aria-hidden='true' />\n {maxQuantityText.replace('{max}', max.toString())}\n </p>\n );\n }\n return undefined;\n};\n\nconst _renderMinLabel = (\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n min: number | undefined,\n minQuantityText: string\n): JSX.Element | undefined => {\n const { resources, typeName } = props;\n const className = _getClassNamePrefix(typeName);\n if (min && min > 1) {\n return (\n <p className={`${className}__minmax_label_text`}>\n <span className='sr-only'>{resources.informationIconText}</span>\n <i className='msi-InfoCircle' aria-hidden='true' />\n {minQuantityText.replace('{min}', min.toString())}\n </p>\n );\n }\n return undefined;\n};\n\nconst _isOrderQuantityLimitsFeatureEnabled = (props: IBuyboxExtentedProps<IBuyboxCommonData>): boolean | undefined => {\n const featureStatuses = props.data.featureState.result;\n\n const isFeatureEnabledInHq = featureStatuses?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\n ?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n\n const customerInfo = props.data.customerInformation.result;\n return (\n customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } else {\n const cartConfiguration = props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n};\n\nconst _isChannelLimitsFeatureEnabled = (props: IBuyboxExtentedProps<IBuyboxCommonData>): boolean => {\n const featureStatuses = props.data.featureState.result;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core-internal';\nimport { ProductDimension, ProductDimensionType } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertProductDimensionTypeToDimensionTypes,\n DimensionTypes,\n getDimensionValuesFromQuery,\n getInventoryLevelCodeFromDimensionValue,\n IDimensionForSelectedVariant,\n IDimensionsApp,\n IDimensionValueForSelectedVariant,\n InventoryLevelValues,\n ObjectExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getTelemetryObject, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport {\n IBuyboxCallbacks,\n IBuyboxCommonData,\n IBuyboxCommonResources,\n IBuyboxExtentedProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxState,\n IProductDetails\n} from './buyboxInterface';\nimport {\n Dropdown,\n IDropdownItemProps,\n IDropdownOnInitializeNotification,\n IDropdownOnSelectionChangeNotification,\n SelectionType\n} from './dropdown';\n\nlet telemetryContent: ITelemetryContent;\n\n/**\n * Dimension pre-processing info.\n */\ninterface IProductDimensionInfo {\n dropdownName: string;\n dropdownId: string;\n dropdownList: IDropdownItemProps[];\n}\n\n/**\n * Props for rendering a dropdown.\n */\ninterface IProductDimensionDropdownProps extends IProductDimensionInfo {\n resources: IBuyboxCommonResources;\n className: string;\n context: ICoreContext<IDimensionsApp>;\n\n configureErrors: { [configureId: string]: string | undefined };\n\n getDropdownName(dimensionType: number, resources: IBuyboxCommonResources): string;\n dropdownCallback(notification: IDropdownOnSelectionChangeNotification): Promise<void>;\n initializeCallback(notification: IDropdownOnInitializeNotification): void;\n}\n\nconst mapProductDimensionFullToDropdownViewProps = (props: IProductDimensionDropdownProps): IBuyboxProductConfigureDropdownViewProps => {\n const dimensionId = Number.parseInt(props.dropdownId, 10) as ProductDimensionType;\n const dropdownToggleName = format(props.resources.selectDimensionFormatString, props.dropdownName);\n\n const errorMessage = props.configureErrors[props.dropdownId];\n\n let dimensionSelectionType = SelectionType.dropdown;\n\n const dimensionType = convertProductDimensionTypeToDimensionTypes(dimensionId);\n\n const dimensionsAsSwatchConfiguration = props.context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsAsSwatchConfiguration) &&\n !dimensionsAsSwatchConfiguration.includes(DimensionTypes.none) &&\n dimensionsAsSwatchConfiguration.includes(dimensionType)\n ) {\n dimensionSelectionType = SelectionType.swatch;\n }\n\n return {\n ContainerProps: {\n className: `${props.className}__dropdown`\n },\n LabelContainerProps: {\n tag: 'label',\n className: `${props.className}__dropdown-quantity-label`,\n htmlFor: `${props.className}__dropown-quantity-input-${props.dropdownId}`\n },\n errors: errorMessage && (\n <span className='msc-alert msc-alert-noborder msc-alert-danger' role='alert' aria-live='assertive'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n <span>{errorMessage}</span>\n </span>\n ),\n heading: <div>{props.dropdownName}</div>,\n select: (\n <Dropdown\n dropdownId={props.dropdownId}\n dropdownName={props.dropdownName}\n dropdownToggleName={dropdownToggleName}\n dropdownList={props.dropdownList}\n onChange={props.dropdownCallback}\n onInitialize={props.initializeCallback}\n telemetryContent={telemetryContent}\n selectionType={dimensionSelectionType}\n apiSettings={props.context.request.apiSettings}\n />\n )\n };\n};\n\nexport function getBuyboxProductConfigure(\n props: IBuyboxExtentedProps<IBuyboxCommonData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n productDetails?: IProductDetails,\n selectedDimensions?: ProductDimension[]\n): IBuyboxProductConfigureViewProps | undefined {\n const { resources, typeName } = props;\n\n const {\n errorState: { configureErrors }\n } = state;\n\n const { getDropdownName } = callbacks;\n\n const context = props.context as ICoreContext<IDimensionsApp>;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const product = props.data.product?.result ? props.data.product.result : productDetails?.product;\n\n // Since the data action can return no value, and the type is non-nullable due to backward compatibility reasons, the null check is required.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const productDimensionsData = props.data.productDimensions?.result ?? productDetails?.productDimensions;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = props.context.app.config.enableStockCheck;\n\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensionsData);\n\n if (!product || !hasProductDimensions) {\n return undefined;\n }\n\n const className = _getClassNamePrefix(typeName);\n\n const onChanged = async (notification: IDropdownOnSelectionChangeNotification) =>\n _onChanged(notification, callbacks.dimensionSelectedAsync);\n\n const onInitializedDimension = async (notification: IDropdownOnInitializeNotification) =>\n _onInitializedDimension(notification, callbacks.initializeDimension);\n\n telemetryContent = getTelemetryObject(context.request.telemetryPageName!, props.typeName, props.telemetry);\n\n const inventoryLevel = context.app.config.inventoryLevel;\n\n let dimensionsInfo: IProductDimensionInfo[] = [];\n\n const productDimensions = productDimensionsData as IDimensionForSelectedVariant[];\n\n dimensionsInfo = productDimensions.map(productDimensionFull => {\n const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\n const dropdownId = productDimensionFull.DimensionTypeValue.toString();\n\n const dimensions = (productDimensionFull.dimensionValuesWithInventory ??\n productDimensionFull.DimensionValues ??\n []) as IDimensionValueForSelectedVariant[];\n const validProductDimensionsFull = dimensions.filter(\n value => !ObjectExtensions.isNullOrUndefined(value.DimensionValue?.RecordId ?? value.RecordId)\n );\n\n const dropdownList: IDropdownItemProps[] = validProductDimensionsFull.map<IDropdownItemProps>(dimensionValuesWithInventory => {\n const dimensionValue = dimensionValuesWithInventory.DimensionValue ?? dimensionValuesWithInventory;\n const inventoryLevelCode = getInventoryLevelCodeFromDimensionValue(dimensionValuesWithInventory, inventoryLevel);\n return {\n value: dimensionValue.Value ?? '',\n id: dimensionValue.RecordId.toString(),\n colorHexCode: dimensionValue.ColorHexCode,\n imageUrl: dimensionValue.ImageUrl,\n isDisabled: enableStockCheck && inventoryLevelCode === InventoryLevelValues.outOfStock,\n swatchItemAriaLabel: resources.swatchItemAriaLabel ? resources.swatchItemAriaLabel : ''\n };\n });\n return {\n dropdownName,\n dropdownId,\n dropdownList\n };\n });\n\n const matchedDimensions = selectedDimensions ?? getDimensionValuesFromQuery(context.request.url.requestUrl);\n for (const dimensionInfo of dimensionsInfo) {\n const currentDimensionsFromQuery = matchedDimensions.filter(\n dimensionFromQuery => dimensionFromQuery.DimensionTypeValue.toString() === dimensionInfo.dropdownId\n );\n if (!ArrayExtensions.hasElements(currentDimensionsFromQuery)) {\n continue;\n }\n const currentDimensionFromQuery = currentDimensionsFromQuery[0];\n const selectedDimensionItem = dimensionInfo.dropdownList.filter(\n dimensionItem =>\n dimensionItem.value.toLocaleLowerCase() === currentDimensionFromQuery.DimensionValue?.Value?.toLocaleLowerCase()\n );\n if (!ArrayExtensions.hasElements(selectedDimensionItem)) {\n continue;\n }\n selectedDimensionItem[0].isDefault = true;\n }\n\n const dropdowns: IBuyboxProductConfigureDropdownViewProps[] = dimensionsInfo.map(dimensionInfo => {\n return mapProductDimensionFullToDropdownViewProps({\n ...dimensionInfo,\n resources,\n configureErrors,\n getDropdownName,\n dropdownCallback: onChanged,\n initializeCallback: onInitializedDimension,\n className,\n context\n });\n });\n\n return {\n ContainerProps: {\n className: `${className}__configure`\n },\n dropdowns\n };\n}\n\nconst _onChanged = async (\n notification: IDropdownOnSelectionChangeNotification,\n dimensionChanged: (newValue: number, selectedDimensionValue: string, initializedDimension?: string) => Promise<void>\n): Promise<void> => {\n await dimensionChanged(+notification.dropdownId, notification.selectId);\n};\n\nconst _onInitializedDimension = (\n notification: IDropdownOnInitializeNotification,\n initializeDimension?: (initializedDimension: string | undefined) => void\n): void => {\n if (initializeDimension) {\n initializeDimension(notification.initializedDimension);\n }\n};\n\nconst _getClassNamePrefix = (typeName: string): string => {\n return typeName.toLocaleLowerCase() === 'quickview' ? 'ms-quickView' : 'ms-buybox';\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull, RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CommerceList,\n Customer,\n FeatureState,\n ProductDeliveryOptions,\n ProductPrice,\n SimpleProduct,\n CartConfiguration\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n IDimensionForSelectedVariant,\n IProductInventoryInformation,\n ISelectedProduct,\n OrderTemplate\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\n\nexport interface IBuyboxState {\n quantity: number;\n min: number | undefined;\n max: number | undefined;\n errorState: IErrorState;\n selectedProduct?: Promise<SimpleProduct | null>;\n productAvailableQuantity?: IProductInventoryInformation;\n productPrice?: ProductPrice;\n productDeliveryOptions?: ProductDeliveryOptions;\n modalOpen?: boolean;\n isUpdatingDimension?: boolean;\n isUpdatingDeliveryOptions?: boolean;\n isServiceItem?: boolean;\n isPriceKeyedIn?: boolean;\n keyInPriceAmount?: number;\n isCustomPriceSelected?: boolean;\n activeIndex?: number;\n animating?: boolean;\n lastUpdate?: number;\n mediaGalleryItems?: Msdyn365.IImageData[] | undefined;\n isPriceApiCalled?: boolean;\n}\n\nexport interface IBuyboxCommonData {\n deliveryOptions: AsyncResult<ProductDeliveryOptions | undefined> | undefined;\n product: AsyncResult<SimpleProduct>;\n productDimensions: AsyncResult<ProductDimensionFull[]>;\n productPrice: AsyncResult<ProductPrice>;\n ratingsSummary: AsyncResult<RatingsSummary>;\n storeSelectorStateManager: AsyncResult<IStoreSelectorStateManager>;\n wishlists: AsyncResult<CommerceList[]>;\n orderTemplates: AsyncResult<OrderTemplate[]>;\n cart: AsyncResult<ICartState>;\n productAvailableQuantity: AsyncResult<IProductInventoryInformation[]>;\n customerInformation: AsyncResult<Customer>;\n featureState: AsyncResult<FeatureState[]>;\n cartConfiguration?: AsyncResult<CartConfiguration>;\n}\nexport declare type IBuyboxErrorHost = 'ADDTOCART' | 'FINDINSTORE' | 'WISHLIST' | 'SHOPSIMILARITEM' | 'ORDER_TEMPLATE';\n\nexport interface IErrorState {\n errorHost?: IBuyboxErrorHost;\n configureErrors: { [configureId: string]: string | undefined };\n quantityError?: string;\n customAmountError?: string;\n otherError?: string;\n}\n\nexport interface IBuyboxAddToCartViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nexport interface IBuyboxAddToOrderTemplateViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nexport interface IBuyboxProductQuantityViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n\n heading: React.ReactNode;\n errors?: React.ReactNode;\n\n input: React.ReactNode;\n}\n\nexport interface IBuyboxAddToWishlistViewProps {\n ContainerProps: INodeProps;\n errorBlock?: React.ReactNode;\n button?: React.ReactNode;\n}\n\nexport interface IBuyboxShopSimilarLookViewProps {\n ContainerProps: INodeProps;\n errors?: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport enum ShopSimiliarButtonType {\n Looks = 'looks',\n Description = 'descriptions'\n}\n\nexport interface IBuyboxKeyInPriceViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n heading: React.ReactNode;\n input: React.ReactNode;\n}\n\nexport interface IBuyboxErrorBlockProps {\n configureErrors: { [configureId: string]: string | undefined };\n quantityError?: string;\n customAmountError?: string;\n otherError?: string;\n resources: IBuyboxCommonResources;\n showError: boolean;\n enableHidePdpRepeatingErrors?: boolean;\n}\n\nexport interface IBuyboxProductConfigureProps {\n product: SimpleProduct;\n productDimensions: ProductDimensionFull[];\n resources: IBuyboxCommonResources;\n channelId: number;\n actionContext: Msdyn365.IActionContext;\n errors: { [configureId: string]: string | undefined };\n\n dimensionChanged?(newValue: number): void;\n}\n\nexport interface IBuyboxProductConfigureDropdownViewProps {\n ContainerProps: INodeProps;\n LabelContainerProps: INodeProps;\n\n heading: React.ReactNode;\n errors?: React.ReactNode;\n\n select: React.ReactNode;\n}\n\nexport interface IBuyboxProductConfigureViewProps {\n ContainerProps: INodeProps;\n\n dropdowns: IBuyboxProductConfigureDropdownViewProps[];\n}\n\nexport interface IBuyboxCallbacks {\n updateQuantity(newQuantity: number): boolean;\n updateKeyInPrice(keyInPrice: number): void;\n updateErrorState(newErrorState: IErrorState): void;\n updateSelectedProduct(\n selectedProduct: Promise<SimpleProduct | null>,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined\n ): void;\n getDropdownName(dimensionType: number, resources: IBuyboxCommonResources): string;\n dimensionSelectedAsync(selectedDimensionId: number, selectedDimensionValueId: string): Promise<void>;\n changeModalOpen(isModalOpen: boolean): void;\n changeUpdatingDimension(isUpdatingDimension: boolean): void;\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\n\n initializeDimension?(initializedDimension: string | undefined): void;\n}\n\nexport interface IBuyboxExtentedProps<T> extends Msdyn365.IModule<T> {\n resources: IBuyboxCommonResources;\n config: IBuyboxCommonConfig;\n slots: {};\n}\n\nexport interface IBuyboxCommonConfig {\n titleHeadingTag?: titleHeadingTag;\n className?: string;\n enableShopSimilarLooks?: boolean;\n enableShopSimilarDescription?: boolean;\n enableKeyInPrice?: boolean;\n minimumKeyInPrice?: number;\n maximumKeyInPrice?: number;\n}\n\nexport interface IProductDetails {\n product?: ISelectedProduct | null;\n productPrice?: ProductPrice | null;\n ratingsSummary?: RatingsSummary;\n productAvailableQuantity?: IProductInventoryInformation[];\n cart?: ICartState | undefined;\n productDimensions?: IDimensionForSelectedVariant[] | null;\n}\n\nexport enum titleHeadingTag {\n h1 = 'h1',\n h2 = 'h2',\n h3 = 'h3',\n h4 = 'h4',\n h5 = 'h5',\n h6 = 'h6'\n}\n\nexport interface IBuyboxCommonResources {\n priceFree: string;\n invalidSmallCustomAmountText: string;\n invalidLargeCustomAmountText: string;\n buyBoxGoToCartText: string;\n buyBoxContinueShoppingText: string;\n closeNotificationLabel: string;\n buyBoxSingleItemText: string;\n buyBoxMultiLineItemFormatText: string;\n buyBoxHeaderMessageText: string;\n originalPriceText: string;\n currentPriceText: string;\n addedQuantityText: string;\n addToCartText: string;\n outOfStockText: string;\n averageRatingAriaLabel: string;\n addToOrderTemplateHeader: string;\n noOrderTemplatesMessage: string;\n noOrderTemplatesDescription: string;\n createAnOrderTemplateButtonText: string;\n createNewOrderTemplateButtonText: string;\n cancelOrderTemplateCreationButtonText: string;\n selectTemplatesText: string;\n addToTemplateButtonText: string;\n lineItemsText: string;\n createOrderTemplateHeader: string;\n orderTemplateTitle: string;\n orderTemplateNameAriaLabel: string;\n createOrderTemplateDescription: string;\n defaultOrderTemplateName: string;\n createOrderTemplateButtonText: string;\n cancelNewOrderTemplateCreationButtonText: string;\n viewOrderTemplateButtonText: string;\n continueShoppingButtonText: string;\n itemAddedToOrderTemplateHeaderItemOneText: string;\n itemAddedToOrderTemplateHeaderItemFormatText: string;\n itemAddedToOrderTemplateHeaderMessageText: string;\n duplicatedProductsHeader: string;\n duplicatedProductsDescription: string;\n updateQuantityButtonText: string;\n cancelDuplicateItemsButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n addToWishlistMessage: string;\n removedFromWishlistMessage: string;\n addItemToWishlistError: string;\n removeItemFromWishlistError: string;\n nameOfWishlist: string;\n productQuantityHeading: string;\n inputQuantityAriaLabel: string;\n buyboxKeyInPriceLabelHeading: string;\n buyboxErrorMessageHeader: string;\n maxQuantityText: string;\n minQuantityText: string;\n selectDimensionFormatString: string;\n errorMessageOutOfStock: string;\n errorMessageOutOfRangeOneLeft: string;\n errorMessageOutOfRangeFormat: string;\n addToOrderTemplateButtonText: string;\n addedToCartFailureMessage: string;\n maxQuantityLimitText: string;\n productDimensionTypeColorErrorMessage: string;\n productDimensionTypeConfigurationErrorMessage: string;\n productDimensionTypeSizeErrorMessage: string;\n productDimensionTypeAmountErrorMessage: string;\n productDimensionTypeStyleErrorMessage: string;\n shopSimilarLooksText?: string;\n shopSimilarDescriptionText?: string;\n addToOrderTemplateButtonTooltip: string;\n loadingText?: string;\n informationIconText?: string;\n priceRangeSeparator?: string;\n swatchItemAriaLabel?: string;\n salesAgreementPricePrompt?: string;\n salesAgreementExpirationDatePrompt?: string;\n salesAgreementCommittedQuantityPrompt?: string;\n salesAgreementRemainingQuantityPrompt?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISwatchItem, SwatchComponent } from '@msdyn365-commerce/components';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IDropdownItemProps, IDropdownProps, SelectionType } from './dropdown.props';\n\n/**\n * State for a dropdown component.\n */\ninterface IDropdownState {\n /**\n * @friendlyName selectedIndex\n * @description Selected index.\n */\n selectedIndex: string;\n}\n\n/**\n *\n * DropDown component.\n * @extends {React.PureComponent<IDropdownProps, IDropdownState>}\n */\nexport class Dropdown extends React.PureComponent<IDropdownProps, IDropdownState> {\n private readonly selectMenu: React.RefObject<HTMLSelectElement> = React.createRef<HTMLSelectElement>();\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n\n if (this.props.onInitialize) {\n this.props.onInitialize({\n initializedDimension: this.props.dropdownId\n });\n }\n\n const selectedItem = this.props.dropdownList.find(item => item.isDefault);\n if (selectedItem) {\n this.state = {\n selectedIndex: selectedItem.id.toString()\n };\n if (this.props.onChange) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Update for default.\n this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: selectedItem.id,\n selectedValue: selectedItem.value\n });\n }\n } else {\n this.state = {\n selectedIndex: ''\n };\n }\n this.payLoad = getPayloadObject('click', props.telemetryContent!, this.props.dropdownName);\n }\n\n public render(): JSX.Element {\n if (this.props.apiSettings && this.props.selectionType === SelectionType.swatch) {\n return this._renderSwatch();\n }\n\n return this._renderDropdown();\n }\n\n private _renderDropdown(): JSX.Element {\n const { dropdownId, dropdownList, dropdownName, dropdownToggleName } = this.props;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <select\n id={`msc-dropdown__entry-${dropdownId}`}\n ref={this.selectMenu}\n aria-label={dropdownName}\n className='msc-dropdown__select'\n onChange={this._onChanged}\n {...attribute}\n >\n <option value='' aria-selected={this.state.selectedIndex === ''} selected={this.state.selectedIndex === ''} hidden disabled>\n {dropdownToggleName}\n </option>\n {dropdownList.map(\n (item: IDropdownItemProps) =>\n item && (\n <option\n value={item.id}\n key={item.id}\n selected={this.state.selectedIndex === item.id.toString()}\n aria-selected={this.state.selectedIndex === item.id.toString()}\n className={item.isDisabled ? 'msc-dropdown__select__disabled' : undefined}\n >\n {item.value}\n </option>\n )\n )}\n </select>\n );\n }\n\n private _renderSwatch(): JSX.Element {\n const swatchItems = this.props.dropdownList.map<ISwatchItem>(item => {\n return {\n ...item,\n itemId: item.id,\n dimensionType: this.props.dropdownName as DimensionTypes\n };\n });\n return <SwatchComponent list={swatchItems} apiSettings={this.props.apiSettings!} onSelectItem={this._selectSwatch} />;\n }\n\n /**\n * Updates state on swatch selection.\n * @param item - Selected swatch item.\n */\n private readonly _selectSwatch = async (item: ISwatchItem) => {\n this.setState({ selectedIndex: item.itemId });\n\n if (this.props.onChange) {\n await this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: item.itemId,\n selectedValue: item.value\n });\n }\n };\n\n private readonly _onChanged = async (event: React.ChangeEvent<HTMLSelectElement>) => {\n this.setState({ selectedIndex: event.target.value });\n\n if (this.props.onChange) {\n await this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\n });\n }\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\n\n/**\n * Specifies the type of selection.\n */\nexport enum SelectionType {\n dropdown = 0,\n swatch = 1\n}\n\n/**\n * Copyright (c) 2018 Microsoft Corporation.\n */\nexport interface IDropdownProps {\n /**\n * Specifies the type of selection. Dropdown by default.\n */\n selectionType?: SelectionType;\n\n /**\n * @friendlyName dropdownId\n * @description Id for dropdown component.\n */\n dropdownId: string;\n\n /**\n * @friendlyName dropdownName\n * @description Name of the dropdown component.\n */\n dropdownName: string;\n\n /**\n * @friendlyName dropdownList\n * @description List of items in dropdown.\n */\n dropdownList: IDropdownItemProps[];\n\n /**\n * @friendlyName dropdownToggleName\n * @description Name to use for the toggle when nothing is selected.\n */\n dropdownToggleName: string;\n\n /**\n * @telemetryContent telemetryContent\n * @description Telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n apiSettings?: ICommerceApiSettings;\n\n /**\n * @friendlyName onChange\n * @description Callback that gets fired when when a selected dimension changes.\n */\n onChange?(notification: IDropdownOnSelectionChangeNotification): Promise<void>;\n\n /**\n * @friendlyName onInitialize\n * @description Callback that gets fired when dimension is initialized.\n */\n onInitialize?(notification: IDropdownOnInitializeNotification): void;\n}\n\nexport interface IDropdownItemProps {\n value: string;\n id: string;\n colorHexCode?: string;\n imageUrl?: string;\n isDisabled?: boolean;\n isDefault?: boolean;\n}\n\nexport interface IDropdownOnSelectionChangeNotification {\n dropdownId: string;\n selectId: string;\n selectedValue: string;\n}\n\nexport interface IDropdownOnInitializeNotification {\n initializedDimension: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IAddToCartFailureResult } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { OrgUnitLocation, ProductAvailableQuantity, ProductDimension, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IBuyboxCommonResources } from '../buyboxInterface';\n\n/**\n * Get the quantity limit.\n * @param context - The context.\n * @param productAvailability - The product availability.\n * @returns The quantity limit.\n */\nexport function getQuantityLimit(context: ICoreContext<IGeneric<IAny>>, productAvailability: ProductAvailableQuantity | undefined): number {\n // Get the quantity limit for the product\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- need read from config.\n const maxQuantityForCartLineItem: number | undefined = context.app.config.maxQuantityForCartLineItem;\n const availableQty = productAvailability?.AvailableQuantity;\n const defaultQuantityLimit = 10;\n\n let quantityLimit: number;\n\n if (maxQuantityForCartLineItem === undefined && availableQty === undefined) {\n quantityLimit = defaultQuantityLimit;\n } else if (availableQty === undefined) {\n quantityLimit = maxQuantityForCartLineItem ?? defaultQuantityLimit;\n } else if (maxQuantityForCartLineItem === undefined) {\n quantityLimit = availableQty;\n } else {\n quantityLimit = Math.min(maxQuantityForCartLineItem, availableQty);\n }\n\n return quantityLimit;\n}\n\n/**\n * Get the element index.\n * @param cart - The cart.\n * @param product - The product.\n * @param location - The location.\n * @returns The index of the element.\n */\nexport function getElementIndex(\n cart: ICartState | undefined,\n product: SimpleProduct | undefined,\n location: OrgUnitLocation | undefined\n): number {\n // Get the quantity of the product in cart\n let elementFoundAt: number = -1;\n\n const productIdToFind = product?.RecordId;\n\n for (let index = 0; index < cart!.cart.CartLines!.length; index++) {\n if (\n cart!.cart.CartLines![index].ProductId === productIdToFind &&\n (cart!.cart.CartLines![index].FulfillmentStoreId || '') === (location?.OrgUnitNumber || '')\n ) {\n elementFoundAt = index;\n\n break;\n }\n }\n\n return elementFoundAt;\n}\n\nexport function getQuantityError(stockLeft: number | undefined, resources: IBuyboxCommonResources): string | undefined {\n if (!stockLeft || stockLeft <= 0) {\n return resources.errorMessageOutOfStock;\n } else if (stockLeft === 1) {\n return resources.errorMessageOutOfRangeOneLeft;\n }\n return resources.errorMessageOutOfRangeFormat.replace('{numLeft}', stockLeft.toString());\n}\n\nexport function getGenericError(\n result: IAddToCartFailureResult,\n cart: ICartState | undefined,\n resources: IBuyboxCommonResources,\n context: ICoreContext<IGeneric<IAny>>,\n product: SimpleProduct | undefined,\n productAvailability: ProductAvailableQuantity | undefined,\n location: OrgUnitLocation | undefined\n): string | undefined {\n if (result.failureReason === 'EMPTYINPUT') {\n return resources.addedToCartFailureMessage;\n } else if (result.failureReason === 'CARTACTIONFAILED') {\n if (result.cartActionResult && result.cartActionResult.substatus === 'MAXQUANTITY') {\n // Get the quantity of the product in cart\n const elementFoundAt: number = getElementIndex(cart, product, location);\n\n let currentQuantity: number = 0;\n if (elementFoundAt !== -1) {\n const cartLineToUpdate = { ...cart!.cart.CartLines![elementFoundAt] };\n currentQuantity = cartLineToUpdate.Quantity ?? 0;\n }\n\n // Get the quantity limit for the product\n const quantityLimit = getQuantityLimit(context, productAvailability);\n return resources.maxQuantityLimitText\n .replace('{curQuantity}', currentQuantity.toString())\n .replace('{maxQuantity}', quantityLimit.toString());\n } else if (\n result.cartActionResult &&\n (result.cartActionResult.substatus === 'QUANTITYLIMITS' || result.cartActionResult.substatus === 'INVOICEINCART')\n ) {\n return result.cartActionResult.errorDetails?.LocalizedMessage;\n }\n\n if (result.cartActionResult?.validationResults && ArrayExtensions.hasElements(result.cartActionResult.validationResults)) {\n return result.cartActionResult.validationResults\n .map(item => {\n return StringExtensions.isNullOrEmpty(item.LocalizedMessage)\n ? item.ErrorContext ?? item.ErrorResourceId\n : item.LocalizedMessage;\n })\n .toString();\n }\n\n return resources.addedToCartFailureMessage;\n }\n\n return undefined;\n}\n\nexport function getConfigureErrors(\n result: ProductDimension[] | undefined,\n resources: IBuyboxCommonResources,\n isGiftCard?: boolean\n): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n\n const dimensions: { [configureId: string]: string | undefined } = {};\n\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n\n return dimensions;\n}\n\nexport function getDimensionErrorString(dimensionTypeValue: number, resources: IBuyboxCommonResources, isGiftCard?: boolean): string {\n switch (dimensionTypeValue) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColorErrorMessage;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfigurationErrorMessage;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSizeErrorMessage;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmountErrorMessage : resources.productDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToCartBehavior,\n IAddToCartFailureResult,\n IAddToCartResources,\n ItemSuccessfullyAddedToCartNotification,\n PriceComponent\n} from '@msdyn365-commerce/components';\nimport { getUrlSync, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\nimport { DeliveryOption, FeatureState, OrgUnitLocation, ProductAvailableQuantity, ProductDimension } from '@msdyn365-commerce/retail-proxy';\nimport { NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport {\n ArrayExtensions,\n DeliveryMode,\n IProductInventoryInformation,\n isAggregatedInventory\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, Heading, INodeProps, IPopupProps, Popup } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { BuyboxErrorBlock } from '../../../common/buybox-components';\nimport { IBuyboxCallbacks, IBuyboxState } from '../../../common/buyboxInterface';\nimport { getConfigureErrors, getGenericError } from '../../../common/utilities/error-utilities';\nimport { IBuyboxData } from '../buybox.data';\nimport { IBuyboxProps, IBuyboxResources } from '../buybox.props.autogenerated';\n\nconst modalCloseButtonReference: React.RefObject<HTMLButtonElement> = React.createRef();\n\n/**\n * FindinStore failure Interface.\n */\nexport interface IFindInStoreFailureResult {\n missingDimensions?: ProductDimension[];\n}\n\n/**\n * BuyBoxFindinStore View Props Interface.\n */\nexport interface IBuyboxFindInStoreViewProps {\n storeSelector?: React.ReactNode;\n heading?: React.ReactNode;\n description?: React.ReactNode;\n errors?: React.ReactNode;\n button?: React.ReactNode;\n productPickupOptionList?: React.ReactNode;\n\n modal?: React.ReactNode;\n\n ContainerProps: INodeProps;\n\n openFindInStoreDialog(): Promise<void>;\n}\n\n/**\n * On click find store handler.\n * @param props -Buybox data.\n * @param state -Buybox state.\n * @param callbacks -Buybox callbacks.\n * @returns Find in store.\n */\nconst onClickFindInStoreHandler = (props: IBuyboxProps<IBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks) => async () => {\n await findInStoreOnClick(props, state, callbacks);\n};\n\n/**\n * Inventory settings based on the inventory policy for aggregated availability.\n */\ninterface IInventorySettingsProps {\n isSectionDisabled: boolean;\n description: string;\n buttonText: string;\n}\n\n/**\n * The function defines the settings values for a given inventory configuration.\n * @param context - The context.\n * @param isStockCheck - Flag to enable inventory validation.\n * @param productAvailability - The product inventory information.\n * @param buyboxResources - The buybox string resources.\n * @param isLoading - Is loading.\n * @returns Boolean.\n */\nfunction getFindInStoreInventorySettings(\n context: ICoreContext,\n isStockCheck: boolean,\n productAvailability: IProductInventoryInformation[] | undefined,\n buyboxResources: IBuyboxResources,\n isLoading?: boolean\n): IInventorySettingsProps {\n // If shouldValidateAggregation is true then is required to check for the product inventory, based on this the messaging will change\n // and the find in store button will be ensbled or disabled\n\n let isSectionDisabled: boolean;\n let buttonText;\n let description: string;\n\n let pickupInventory: IProductInventoryInformation | undefined;\n\n if (!isStockCheck || isLoading) {\n return {\n isSectionDisabled: false,\n buttonText: buyboxResources.findInStoreLinkText,\n description: buyboxResources.findInStoreDescriptionText\n };\n }\n\n if (productAvailability) {\n pickupInventory = productAvailability.find(pickup => pickup.deliveryType === DeliveryMode.pickup);\n }\n\n // If aggregated is enabled, then we need to validate the inventor check for find in store.\n // If an individual is selected, then we will always show a find in store button.\n if (isAggregatedInventory(context.actionContext)) {\n if (productAvailability && pickupInventory?.IsProductAvailable) {\n isSectionDisabled = false;\n buttonText = buyboxResources.findInStoreLinkText;\n description = buyboxResources.findInStoreDescriptionText;\n } else {\n isSectionDisabled = true;\n buttonText = buyboxResources.findInStoreNotAvailableTextButton;\n description = buyboxResources.findInStoreNotAvailableDescription;\n }\n } else {\n isSectionDisabled = false;\n buttonText = buyboxResources.findInStoreLinkText;\n description = buyboxResources.findInStoreDescriptionText;\n }\n\n return {\n isSectionDisabled,\n description,\n buttonText\n };\n}\n\n/**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\nconst matchDeliveryOptions = (\n productdeliveryOptions: DeliveryOption[] | undefined,\n storePickUpOptionList: string[] | undefined\n): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n};\n\nexport function getBuyboxFindInStore(\n props: IBuyboxProps<IBuyboxData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n): IBuyboxFindInStoreViewProps | undefined {\n const {\n data,\n slots: { storeSelector },\n resources: {\n priceFree,\n originalPriceText,\n currentPriceText,\n findInStoreHeaderText,\n buyBoxGoToCartText,\n buyBoxContinueShoppingText,\n closeNotificationLabel,\n buyBoxSingleItemText,\n buyBoxMultiLineItemFormatText,\n buyBoxHeaderMessageText,\n descriptionTextToShowAllPickupOptions\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n }\n } = props;\n\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const product = data?.product?.result;\n const price = data?.productPrice?.result;\n const cart = data?.cart?.result;\n const deliveryOptions = data?.deliveryOptions?.result;\n const productAvailability = data.productAvailableQuantity?.result;\n const retailMulitplePickupMFeatureState = data?.featureState?.result?.find(\n (featureState: FeatureState) => featureState.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n const channelDeliveryOptionConfig = data?.channelDeliveryOptionConfig?.result;\n\n const missingDimensions = product?.Dimensions?.filter(dimension => !dimension.DimensionValue?.Value);\n\n const {\n errorState: { configureErrors, quantityError, otherError, errorHost },\n modalOpen,\n quantity\n } = state;\n\n const { isSectionDisabled, buttonText, description } = getFindInStoreInventorySettings(\n props.context,\n props.context.app.config.enableStockCheck,\n productAvailability,\n props.resources,\n props.data.productAvailableQuantity.status === 'LOADING' || ArrayExtensions.hasElements(missingDimensions)\n );\n\n if (!product || !ArrayExtensions.hasElements(storeSelector)) {\n return undefined;\n }\n\n if (!deliveryOptions || !deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (retailMulitplePickupMFeatureState && channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(deliveryOptions.DeliveryOptions, channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !PickupDeliveryModeCode ||\n !deliveryOptions.DeliveryOptions.find((option: DeliveryOption) => option.Code === PickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n const dialogStrings = {\n goToCartText: buyBoxGoToCartText,\n continueShoppingText: buyBoxContinueShoppingText,\n closeNotificationLabel,\n headerItemOneText: buyBoxSingleItemText,\n headerItemFormatText: buyBoxMultiLineItemFormatText,\n headerMessageText: buyBoxHeaderMessageText,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n };\n\n const priceComponent = price ? (\n <PriceComponent\n data={{ price }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n freePriceText={dialogStrings.freePriceText}\n originalPriceText={dialogStrings.originalPriceText}\n currentPriceText={dialogStrings.currentPriceText}\n />\n ) : (\n ''\n );\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const popupProps: IPopupProps = {\n context: props.context,\n className: 'ms-buybox',\n id: props.id,\n typeName: props.typeName,\n data: { product: props.data.product?.result, price: props.data.productPrice?.result },\n dialogStrings,\n imageSettings: defaultImageSettings,\n gridSettings: props.context.request.gridSettings,\n productQuantity: quantity,\n priceComponent,\n navigationUrl: getUrlSync('cart', props.context.actionContext),\n modalOpen,\n setModalOpen: callbacks.changeModalOpen\n };\n const renderModalPopup = <Popup {...popupProps} />;\n const { enableHidePdpRepeatingErrors } = props.context.request.features;\n return {\n ContainerProps: {\n className: 'ms-buybox__find-in-store'\n },\n\n storeSelector: storeSelector[0],\n\n openFindInStoreDialog: onClickFindInStoreHandler(props, state, callbacks),\n\n heading: <Heading className='ms-buybox__find-in-store-heading' headingTag='h4' text={findInStoreHeaderText} />,\n\n description: <p className='ms-buybox__find-in-store-description'>{description}</p>,\n productPickupOptionList:\n retailMulitplePickupMFeatureState && !isSectionDisabled ? (\n <>\n <p className='ms-buybox__find-in-store-description'>{descriptionTextToShowAllPickupOptions}</p>\n <ul className='ms-buybox__find-in-store-pickup' aria-label={descriptionTextToShowAllPickupOptions}>\n {deliveryOptions.DeliveryOptions.map((item: DeliveryOption) => {\n return (\n <li className='ms-buybox__find-in-store-pickup-option' aria-label={item.Description} key={item.Code}>\n {item.Description}\n </li>\n );\n })}\n </ul>\n </>\n ) : null,\n errors: (\n <BuyboxErrorBlock\n configureErrors={configureErrors}\n quantityError={quantityError}\n otherError={otherError}\n resources={props.resources}\n showError={errorHost === 'FINDINSTORE'}\n enableHidePdpRepeatingErrors={enableHidePdpRepeatingErrors}\n />\n ),\n\n button: (\n <button\n className='ms-buybox__find-in-store-button'\n onClick={onClickFindInStoreHandler(props, state, callbacks)}\n color='secondary'\n ref={modalCloseButtonReference}\n aria-label={buttonText}\n disabled={cart === undefined || isSectionDisabled}\n title={buttonText}\n >\n {buttonText}\n </button>\n ),\n\n modal: renderModalPopup\n };\n}\n\n/**\n * Handler for find in store button.\n * @param props - BuyBox data.\n * @param state - BuyBox state.\n * @param callbacks - BuyBox callbacks.\n * @returns - Promise.\n */\nasync function findInStoreOnClick(props: IBuyboxProps<IBuyboxData>, state: IBuyboxState, callbacks: IBuyboxCallbacks): Promise<void> {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager },\n cart: { result: cart },\n productAvailableQuantity: { result: productAvailableQuantity }\n },\n resources,\n context,\n modules\n } = props;\n\n const { selectedProduct, quantity } = state;\n\n let dataProduct = props.data.product.result;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const retailMulitplePickupMFeatureState = props.data?.featureState?.result?.find(\n (featureState: FeatureState) => featureState.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n if (selectedProduct) {\n dataProduct = (await selectedProduct) || dataProduct;\n }\n\n if (!dataProduct || !storeSelectorStateManager) {\n return;\n }\n\n const product = dataProduct;\n\n const missingDimensions =\n product.Dimensions &&\n product.Dimensions.filter((dimension: ProductDimension) => !(dimension.DimensionValue && dimension.DimensionValue.Value));\n\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n if (missingDimensions && missingDimensions.length > 0) {\n if (callbacks.updateErrorState) {\n callbacks.updateErrorState({\n errorHost: 'FINDINSTORE',\n configureErrors: getConfigureErrors(missingDimensions, resources)\n });\n }\n } else {\n storeSelectorStateManager\n .openDialog({\n product,\n id: storeSelectorId,\n parentElementRef: modalCloseButtonReference,\n deliveryOptions: retailMulitplePickupMFeatureState ? props.data.deliveryOptions.result : undefined,\n onLocationSelected: async (orgUnitLocation: OrgUnitLocation, deliveryMode: string) => {\n if (!cart) {\n return Promise.resolve();\n }\n\n const behavior = props.context?.app?.config?.addToCartBehavior;\n\n return cart\n .addProductToCart({ product, count: quantity, location: orgUnitLocation, deliveryMode })\n .then((result: ICartActionResult) => {\n if (result.status === 'FAILED' && result.substatus === 'MAXQUANTITY') {\n callbacks.changeModalOpen(false);\n let productAvailability: ProductAvailableQuantity | undefined;\n if (state.productAvailableQuantity) {\n productAvailability = state.productAvailableQuantity.ProductAvailableQuantity;\n } else if (productAvailableQuantity && ArrayExtensions.hasElements(productAvailableQuantity)) {\n const shippingInventory = productAvailableQuantity.find(\n shipping => shipping.deliveryType === DeliveryMode.pickup\n );\n productAvailability = shippingInventory?.ProductAvailableQuantity;\n } else {\n productAvailability = undefined;\n }\n const failureResult: IAddToCartFailureResult = {\n failureReason: 'CARTACTIONFAILED',\n cartActionResult: { status: result.status, substatus: result.substatus }\n };\n callbacks.updateErrorState({\n errorHost: 'ADDTOCART',\n configureErrors: {},\n otherError: getGenericError(\n failureResult,\n cart,\n resources,\n context,\n product,\n productAvailability,\n orgUnitLocation\n )\n });\n } else {\n callbacks.updateErrorState({\n configureErrors: {}\n });\n const navigationUrl = getUrlSync('cart', context.actionContext);\n if (behavior === undefined || behavior === AddToCartBehavior.goToCart) {\n if (result.status === 'SUCCESS' && navigationUrl) {\n window.location.assign(navigationUrl);\n }\n } else if (behavior === AddToCartBehavior.showModal) {\n callbacks.changeModalOpen(true);\n } else if (behavior === AddToCartBehavior.showNotification) {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n const telemetryContent = getTelemetryObject(\n props.context.request.telemetryPageName!,\n props.friendlyName,\n props.telemetry\n );\n const dialogStrings: IAddToCartResources = {\n goToCartText: resources.buyBoxGoToCartText,\n continueShoppingText: resources.buyBoxContinueShoppingText,\n closeNotificationLabel: resources.closeNotificationLabel,\n headerItemOneText: resources.buyBoxSingleItemText,\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\n headerMessageText: resources.buyBoxHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n addedQuantityText: resources.addedQuantityText\n };\n const notification = new ItemSuccessfullyAddedToCartNotification(\n props.context,\n dialogStrings,\n defaultImageSettings,\n props.context.request.gridSettings,\n product,\n props.data.productPrice?.result,\n quantity,\n navigationUrl,\n telemetryContent,\n props.id,\n props.typeName\n );\n NotificationsManager.instance().addNotification(notification);\n }\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.exception(error);\n props.telemetry.debug('Unable to add product to cart');\n }\n });\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to find in store');\n }\n });\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getCatalogId, ICoreContext, msdyn365Commerce } from '@msdyn365-commerce/core-internal';\nimport {\n CommerceProperty,\n ProductCatalog,\n ProductDeliveryOptions,\n ProductDimensionValue,\n ProductDimensionValueInventoryAvailability,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { BulkPurchase } from '@msdyn365-commerce-modules/bulk-purchase';\nimport {\n ArrayExtensions,\n DeliveryMode,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDeliveryOptionsForSelectedVariant,\n GetDeliveryOptionsForSelectedVariantInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getDimensionValuesFromQuery,\n getInventoryLevelCodeFromDimensionValue,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IDimensionsApp,\n IDimensionValueForSelectedVariant,\n InventoryLevelValues,\n IProductInventoryInformation,\n IPromiseQueue,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput,\n setDimensionValuesToQuery,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n getBuyboxAddToCart,\n getBuyBoxInventoryLabel,\n getBuyboxKeyInPrice,\n getBuyboxProductAddToOrderTemplate,\n getBuyboxProductAddToWishlist,\n getBuyboxProductComparisonButton,\n getBuyboxProductDescription,\n getBuyboxProductPrice,\n getBuyboxProductQuantity,\n getBuyboxProductRating,\n getBuyboxProductTitle,\n getBuyboxProductUnitOfMeasure,\n getBuyboxShopSimilarButton,\n getQuantityLimitsMessages,\n RetailDefaultOrderQuantityLimitsFeatureName,\n EcommerceQuantityLimitConfigurationsFeatureName,\n RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\n} from '../../common/buybox-components';\nimport { getBuyboxProductConfigure } from '../../common/buybox-product-configure';\nimport {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonData,\n IBuyboxExtentedProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps,\n IBuyboxState,\n IErrorState,\n ShopSimiliarButtonType\n} from '../../common/buyboxInterface';\nimport { IBuyboxData } from './buybox.data';\nimport { IBuyboxProps, IBuyboxResources } from './buybox.props.autogenerated';\nimport { getBuyboxFindInStore, IBuyboxFindInStoreViewProps } from './components/buybox-find-in-store';\nimport { RecentlyViewedState } from '../recently-viewed';\n\nexport interface IBuyboxViewProps extends IBuyboxProps<IBuyboxData> {\n state: IBuyboxState;\n ModuleProps: IModuleProps;\n ProductInfoContainerProps: INodeProps;\n MediaGalleryContainerProps: INodeProps;\n callbacks: IBuyboxCallbacks;\n mediaGallery?: React.ReactNode;\n title?: React.ReactNode;\n description?: React.ReactNode;\n rating?: React.ReactNode;\n price?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n bulkPurchaseLink?: React.ReactNode;\n addToOrderTemplate?: IBuyboxAddToOrderTemplateViewProps;\n addToWishlist?: IBuyboxAddToWishlistViewProps;\n min?: number | undefined;\n max: number | undefined;\n addToCart: IBuyboxAddToCartViewProps;\n findInStore?: IBuyboxFindInStoreViewProps;\n quantity?: IBuyboxProductQuantityViewProps;\n configure?: IBuyboxProductConfigureViewProps;\n inventoryLabel?: React.ReactNode;\n shopSimilarLook?: IBuyboxShopSimilarLookViewProps;\n shopSimilarDescription?: IBuyboxShopSimilarLookViewProps;\n quantityLimitsMessages: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n keyInPrice?: IBuyboxKeyInPriceViewProps;\n unitOfMeasure?: React.ReactNode;\n catalogs?: ProductCatalog[] | undefined;\n isChannelMultipleCatalogsFeatureEnabled?: boolean;\n currentCatalogId?: number;\n applyDefaultOrderSettings?: boolean;\n}\n\n/**\n * Buybox Module.\n */\nclass Buybox extends React.PureComponent<IBuyboxProps<IBuyboxData>, IBuyboxState> {\n /**\n * A queue of tasks of processing the changes in the dimensions.\n * Limit to two processes:\n * 1 - for the current process, which is under execution at the moment.\n * 2 - next process, which will process the latest version of data.\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\n */\n private readonly dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(2);\n\n private dimensions: { [id: number]: string } = {};\n private initializedDimensions: Set<string> = new Set();\n\n private readonly buyboxCallbacks: IBuyboxCallbacks = {\n updateQuantity: (newQuantity: number): boolean => {\n const errorState = { ...this.state.errorState };\n errorState.quantityError = undefined;\n errorState.otherError = undefined;\n\n this.setState({ quantity: newQuantity, errorState });\n return true;\n },\n updateErrorState: (newErrorState: IErrorState): void => {\n this.setState({ errorState: newErrorState });\n },\n updateSelectedProduct: (\n newSelectedProduct: Promise<SimpleProduct | null>,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined\n ): void => {\n this.setState({\n selectedProduct: newSelectedProduct,\n productAvailableQuantity: newInventory,\n productDeliveryOptions: newDeliveryOptions\n });\n this._updatePrice(newPrice);\n },\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this.initializedDimensions.add(initializedDimension);\n }\n },\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n // Only trigger _updateDimensions when all dimensions are initialized\n if (this.initializedDimensions.size === (this.props.data.product.result?.Dimensions?.length || 0)) {\n return this.dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: unknown) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n }\n },\n getDropdownName: (dimensionType: number, resources: IBuyboxResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n changeModalOpen: (isModalOpen: boolean): void => {\n this.setState({ modalOpen: isModalOpen });\n },\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n },\n\n /**\n * Update isUpdatingDeliveryOptions state.\n *\n * @param isUpdatingDeliveryOptions - The status of updating delivery options.\n */\n changeUpdatingDeliveryOptions: (isUpdatingDeliveryOptions: boolean): void => {\n this.setState({ isUpdatingDeliveryOptions });\n },\n\n updateKeyInPrice: (customPrice: number): void => {\n // Remove custom amount error when updating the custom price\n const errorState = { ...this.state.errorState };\n errorState.customAmountError = undefined;\n\n this.setState({ isPriceKeyedIn: true, keyInPriceAmount: customPrice, errorState });\n this._updatePrice(this.state.productPrice, customPrice);\n }\n };\n\n private readonly telemetryContent: ITelemetryContent;\n\n public constructor(props: IBuyboxProps<IBuyboxData>, state: IBuyboxState) {\n super(props);\n this.state = {\n errorState: {\n configureErrors: {}\n },\n quantity: 1,\n min: undefined,\n max: undefined,\n selectedProduct: undefined,\n productPrice: undefined,\n productDeliveryOptions: undefined,\n\n modalOpen: false,\n isUpdatingDimension: false,\n isUpdatingDeliveryOptions: false,\n isPriceApiCalled: false\n };\n this.telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n }\n\n public async componentDidMount(): Promise<void> {\n const {\n data: {\n product: { result: product },\n productPrice\n },\n context\n } = this.props;\n\n // There are multiple sources triggering the callback function dimensionSelectedAsync calling the GetActivePrice api before componentDidMount and after componentDidMount.\n // Set isPriceApiCalled to false here to prevent redundant API call after componentDidMount:\n // If the price has not been hydrated before, this means the component was just loaded for the first time with variant selected.\n // We will skip calling RS API in this case as the price data has already been fetched via module data action in node server.\n\n const matchedDimensions = getDimensionValuesFromQuery(this.props.context.request.url.requestUrl);\n\n // Set isPriceApiCalled to false only when variant is there\n if (matchedDimensions.length > 0) {\n this.setState({ isPriceApiCalled: false });\n } else {\n this.setState({ isPriceApiCalled: true });\n }\n\n productPrice.then(async result => {\n this._updatePrice(result);\n });\n\n if (product) {\n // Check if the product is service or not by product type\n if (product.ItemTypeValue === ReleasedProductType.Service) {\n this.setState({ isServiceItem: true });\n }\n await this._updateQuantitiesInState(product);\n }\n\n if (product && context.app.config.maxRecentlyViewedItemsCount > 0) {\n RecentlyViewedState.instance(this.props.context, context.app.config.maxRecentlyViewedItemsCount, product.RecordId);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n slots: { mediaGallery, productComparisonButton },\n data: {\n product: { result: product }\n },\n config: { className = '' }\n } = this.props;\n\n const { min, max } = this.state;\n\n if (!product) {\n this.props.context.telemetry.error('Product content is empty, module wont render');\n return null;\n }\n\n const props = this.props as IBuyboxExtentedProps<IBuyboxCommonData>;\n const defaultMinimumKeyInPrice = 10;\n const defaultMaximumKeyInPrice = 100;\n\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const inventoryLevel = context.app.config.inventoryLevel;\n const dimensionValuesWithInventory = ArrayExtensions.flatten(\n ArrayExtensions.validValues(this.props.data.productDimensions.result?.map(value => value.dimensionValuesWithInventory))\n );\n const applyDefaultOrderSettings =\n (this.props.data.featureState?.result?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)\n ?.IsEnabled ??\n false) &&\n (this.props.data.cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false);\n const hasAvailableProducts =\n !ArrayExtensions.hasElements(dimensionValuesWithInventory) ||\n dimensionValuesWithInventory.some((value: unknown) => {\n const inventoryLevelCode = getInventoryLevelCodeFromDimensionValue(\n value as ProductDimensionValueInventoryAvailability,\n inventoryLevel\n );\n return inventoryLevelCode !== InventoryLevelValues.outOfStock;\n });\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n\n const viewProps: IBuyboxViewProps = {\n ...(this.props as IBuyboxProps<IBuyboxData>),\n state: this.state,\n mediaGallery: mediaGallery && mediaGallery.length > 0 ? mediaGallery[0] : undefined,\n ModuleProps: {\n moduleProps: this.props,\n className: classnames('ms-buybox', className)\n },\n ProductInfoContainerProps: {\n className: 'ms-buybox__content'\n },\n MediaGalleryContainerProps: {\n className: 'ms-buybox__media-gallery'\n },\n telemetryContent: this.telemetryContent,\n callbacks: this.buyboxCallbacks,\n title: getBuyboxProductTitle(props),\n description: getBuyboxProductDescription(props),\n bulkPurchaseLink: this._renderBuyboxBulkPurchaseLink(),\n unitOfMeasure: getBuyboxProductUnitOfMeasure(props),\n configure: getBuyboxProductConfigure(props, this.state, this.buyboxCallbacks),\n findInStore: getBuyboxFindInStore(this.props, this.state, this.buyboxCallbacks),\n price: getBuyboxProductPrice(props, this.state),\n addToCart: getBuyboxAddToCart(\n props,\n this.state,\n this.buyboxCallbacks,\n defaultMinimumKeyInPrice,\n defaultMaximumKeyInPrice,\n undefined,\n hasAvailableProducts\n ),\n productComparisonButton: ArrayExtensions.hasElements(productComparisonButton)\n ? getBuyboxProductComparisonButton(\n productComparisonButton[0],\n product,\n getCatalogId(this.props.context.request),\n this.state\n )\n : undefined,\n addToOrderTemplate: getBuyboxProductAddToOrderTemplate(\n props,\n this.state,\n this.buyboxCallbacks,\n this._isChannelMultipleCatalogsFeatureEnabled(),\n catalogId\n ),\n addToWishlist: getBuyboxProductAddToWishlist(props, this.state, this.buyboxCallbacks),\n rating: !props.context.app.config.hideRating && getBuyboxProductRating(props),\n quantity: product.IsGiftCard ? undefined : getBuyboxProductQuantity(props, this.state, this.buyboxCallbacks),\n inventoryLabel: getBuyBoxInventoryLabel(props),\n shopSimilarLook:\n this.props.config.enableShopSimilarLooks && !product.IsGiftCard\n ? getBuyboxShopSimilarButton(props, ShopSimiliarButtonType.Looks)\n : undefined,\n shopSimilarDescription:\n this.props.config.enableShopSimilarDescription && !product.IsGiftCard\n ? getBuyboxShopSimilarButton(props, ShopSimiliarButtonType.Description)\n : undefined,\n keyInPrice:\n this.props.config.enableKeyInPrice && this.state.isCustomPriceSelected\n ? getBuyboxKeyInPrice(props, this.state, this.buyboxCallbacks)\n : undefined,\n quantityLimitsMessages: getQuantityLimitsMessages(props, this.state),\n min: applyDefaultOrderSettings ? min : 1,\n max,\n applyDefaultOrderSettings: applyDefaultOrderSettings,\n isChannelMultipleCatalogsFeatureEnabled: this._isChannelMultipleCatalogsFeatureEnabled(),\n currentCatalogId: catalogId,\n catalogs: this._validateCatalogDetails(catalogId)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handles anchor click event and scrolls to the given bulk purchase module.\n * @param bulkPurchaseModule - Bulk purchase module.\n * @returns Handler.\n */\n private readonly _onBulkPurchaseLinkClick = (bulkPurchaseModule: Element) => () => {\n const boundingRect = bulkPurchaseModule.getBoundingClientRect();\n const scrollX = boundingRect.left + window.pageXOffset;\n const scrollY = boundingRect.top + window.pageYOffset;\n\n window.scrollTo(scrollX, scrollY);\n };\n private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (this.props.data.featureState) {\n isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n return isMultipleCatalogFeatureEnabledInHq;\n };\n\n private _renderBuyboxBulkPurchaseLink(): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Temporary switch for the feature which is under development.\n if (!this.props.context.app.config.isBulkPurchaseEnabled) {\n return null;\n }\n\n if (!msdyn365Commerce.isBrowser) {\n return null;\n }\n\n const bulkPurchaseModules = Array.from(document.getElementsByClassName(BulkPurchase.className));\n\n if (!ArrayExtensions.hasElements(bulkPurchaseModules)) {\n return null;\n }\n\n return (\n <Button\n className='ms-buybox__bulk-purchase-anchor'\n title={this.props.resources.bulkPurchaseLinkText}\n onClick={this._onBulkPurchaseLinkClick(bulkPurchaseModules[0])}\n >\n {this.props.resources.bulkPurchaseLinkText}\n </Button>\n );\n }\n\n private _updatePrice(newPrice: ProductPrice | undefined, customPrice: number | undefined = this.state.keyInPriceAmount): void {\n if (this.state.isCustomPriceSelected && newPrice) {\n newPrice.CustomerContextualPrice = customPrice;\n }\n this.setState({ productPrice: newPrice });\n }\n\n private _getProductVariant(dimensionsToUpdate: { [id: number]: string }) {\n const {\n data: {\n product: { result: product }\n },\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n\n const productDimensions = this.props.data.productDimensions.result!;\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n .map(dimension => {\n const dimensions = (dimension.dimensionValuesWithInventory ??\n dimension.DimensionValues ??\n []) as IDimensionValueForSelectedVariant[];\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n dimensions.find(\n value => value.DimensionValue?.RecordId.toString() === dimensionsToUpdate[dimension.DimensionTypeValue]\n )?.DimensionValue ?? dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => dimension.DimensionValue);\n setDimensionValuesToQuery(this.props.context.actionContext.requestContext.url.requestUrl, mappedDimensions);\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n const selectedProductPromise = getSelectedVariant(\n new SelectedVariantInput(\n product!.MasterProductId ? product!.MasterProductId : product!.RecordId,\n channelId,\n undefined,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n this.setState({ selectedProduct: selectedProductPromise });\n\n return { productVariantPromise: selectedProductPromise, mappedDimensions };\n }\n\n private readonly _updateDimensions = async (): Promise<void> => {\n const product = this.props.data.product.result;\n\n const productDimensions = this.props.data.productDimensions.result;\n\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n\n if (!product || !hasProductDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n\n this.setState({ isUpdatingDimension: true, isUpdatingDeliveryOptions: true });\n\n // Step 1: Clear error state to display relevant errors\n if (this.state.errorState.otherError || this.state.errorState.quantityError) {\n const clearErrorState = { ...this.state.errorState };\n clearErrorState.otherError = undefined;\n if (this.state.errorState.errorHost === 'ADDTOCART') {\n clearErrorState.quantityError = undefined;\n clearErrorState.errorHost = undefined;\n }\n this.setState({ errorState: clearErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.errorState.configureErrors[key]) {\n this.setState(previousState => {\n const errorState = previousState.errorState;\n errorState.configureErrors[key] = undefined;\n return { errorState };\n });\n }\n }\n\n const data = this._getProductVariant(dimensionsToUpdate);\n const productVariant: SimpleProduct | null = await data.productVariantPromise;\n\n if (!productVariant) {\n return;\n }\n\n const promises: Promise<void>[] = [\n this._getDimensionsForSelectedVariant(productVariant, data.mappedDimensions),\n this._hydrateInventoryInfo(productVariant),\n this._hydratePrice(productVariant),\n this._hydrateDeliveryOptions(productVariant),\n this._updateQuantitiesInState(productVariant)\n ];\n\n await Promise.all(promises);\n };\n\n private async _getDimensionsForSelectedVariant(\n productVariant: SimpleProduct,\n mappedDimensions: {\n /* eslint-disable @typescript-eslint/naming-convention -- Retail proxy values */\n DimensionTypeValue: number;\n DimensionValue: ProductDimensionValue | undefined;\n ExtensionProperties: CommerceProperty[] | undefined;\n /* eslint-enable @typescript-eslint/naming-convention -- Retail proxy values */\n }[]\n ): Promise<void> {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n productVariant.MasterProductId ? productVariant.MasterProductId : productVariant.RecordId,\n this.props.context.request.apiSettings.channelId,\n mappedDimensions,\n this.props.context.request\n ),\n this.props.context.actionContext\n );\n }\n\n private async _hydrateInventoryInfo(productVariant: SimpleProduct): Promise<void> {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(\n productVariant.RecordId,\n this.props.context.request.apiSettings.channelId,\n productVariant\n ),\n this.props.context.actionContext\n );\n\n const newShippingQuantity = newAvailableQuantity?.find(\n // @ts-expect-error\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (shipping: { deliveryType: any }) => shipping.deliveryType === DeliveryMode.shipping\n );\n const isCustomPriceSelected = productVariant.Dimensions?.find(\n dimension =>\n dimension.DimensionTypeValue === 4 && dimension.DimensionValue && dimension.DimensionValue.Value?.toLowerCase() === 'custom'\n );\n if (isCustomPriceSelected) {\n this.setState({ isCustomPriceSelected: true });\n } else {\n this.setState(previousState => {\n const errorState = previousState.errorState;\n errorState.customAmountError = undefined;\n return { isCustomPriceSelected: false, isPriceKeyedIn: false, errorState };\n });\n }\n\n if (newShippingQuantity) {\n this.setState({ productAvailableQuantity: newShippingQuantity });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n }\n\n private async _hydratePrice(productVariant: SimpleProduct): Promise<void> {\n // This function is invoked when dimensionSelectedAsync get called.\n // If the price has not been hydrated before, this means the component was just loaded for the first time with variant selected.\n // We will skip calling RS API in this case as the price data has already been fetched via module data action in node server.\n if (!this.state.isPriceApiCalled) {\n this.setState({ isPriceApiCalled: true });\n return;\n }\n\n // Step 6. Use these dimensions hydrate the product price.\n const newPrice = await getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(productVariant.RecordId, this.props.context.request.apiSettings.channelId, productVariant),\n this.props.context.actionContext\n );\n\n if (newPrice) {\n this._updatePrice(newPrice);\n }\n }\n\n private async _hydrateDeliveryOptions(productVariant: SimpleProduct): Promise<void> {\n const retailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n\n // Step 7. Use these dimensions hydrate the product delivery options.\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\n new GetDeliveryOptionsForSelectedVariantInput(\n productVariant.RecordId,\n this.props.context.request.apiSettings.channelId,\n productVariant,\n undefined,\n retailMultiplePickupFeatureState?.IsEnabled\n ),\n this.props.context.actionContext\n );\n\n if (newDeliveryOptions) {\n this.setState({ productDeliveryOptions: newDeliveryOptions });\n }\n }\n\n private async _updateQuantitiesInState(product: SimpleProduct): Promise<void> {\n const isOrderQuantityLimitsFeatureEnabled = await this._isOrderQuantityLimitsFeatureEnabled();\n const isChannelLimitsFeatureEnabled = await this._isChannelLimitsFeatureEnabled();\n\n const min: number = this._getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled, product);\n const max: number = this._getMaxQuantityForCartLineItem(\n isChannelLimitsFeatureEnabled || isOrderQuantityLimitsFeatureEnabled,\n product\n );\n let quantity: number = this._getQuantity(product, isOrderQuantityLimitsFeatureEnabled);\n quantity = Math.max(quantity, min);\n\n this.setState({\n min,\n max,\n quantity\n });\n }\n\n private _getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (\n isOrderQuantityLimitsFeatureEnabled &&\n this._getIgnoreOrderSettings() &&\n product?.Behavior?.MinimumQuantity &&\n product.Behavior.MinimumQuantity > 0\n ) {\n return product.Behavior.MinimumQuantity;\n }\n\n return 1;\n }\n\n private _getMaxQuantityForCartLineItem(isQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (\n isQuantityLimitsFeatureEnabled &&\n this._getIgnoreOrderSettings() &&\n product?.Behavior?.MaximumQuantity &&\n product.Behavior.MaximumQuantity > 0\n ) {\n return product.Behavior.MaximumQuantity;\n }\n\n return updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem);\n }\n\n /**\n * Retrieves the value of the IgnoreOrderSettings property from the cart configuration.\n * If the property is not present, it defaults to false.\n * @returns {boolean} The value of the IgnoreOrderSettings property.\n */\n private _getIgnoreOrderSettings(): boolean {\n const cartConfiguration = this.props.data.cartConfiguration;\n return !(cartConfiguration?.result?.IgnoreOrderSettings ?? false);\n }\n\n private _getQuantity(product: SimpleProduct, isOrderQuantityLimitsFeatureEnabled: boolean): number {\n const { quantity } = this.state;\n let defaultQuantity = 1;\n\n if (quantity !== defaultQuantity || !isOrderQuantityLimitsFeatureEnabled) {\n return quantity;\n }\n\n const cartConfiguration = this.props.data.cartConfiguration;\n const applyDefaultOrderSettingsForCartLine = cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n if (!applyDefaultOrderSettingsForCartLine) {\n return quantity;\n }\n\n if (product?.Behavior?.DefaultQuantity && product.Behavior.DefaultQuantity > 0) {\n defaultQuantity = product.Behavior.DefaultQuantity;\n }\n\n return defaultQuantity;\n }\n\n private readonly _getDropdownName = (dimensionType: number, resources: IBuyboxResources): string => {\n const isGiftCard = this.props.data.product.result?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private async _isOrderQuantityLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName\n )?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n let customerInfo;\n try {\n customerInfo = await this.props.data.customerInformation;\n } catch (error) {\n this.props.telemetry.information(error);\n this.props.telemetry.debug('Unable to receive Customer Information. May be user is not authorized');\n return false;\n }\n\n return (\n customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private _validateCatalogDetails(catalogId: number): ProductCatalog[] | undefined {\n const catalogs = this.props.data.catalogs?.result?.filter(item => item.RecordId === catalogId);\n if (ArrayExtensions.hasElements(catalogs) && catalogs[0].RecordId === 0) {\n return;\n }\n\n return catalogs;\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n}\n\nexport default Buybox;\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 {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxShopSimilarLookViewProps\n} from '../../common';\nimport { IBuyboxViewProps } from './buybox';\nimport { IBuyboxFindInStoreViewProps } from './components/buybox-find-in-store';\n\nconst BuyboxView: React.FC<IBuyboxViewProps> = props => {\n const {\n ModuleProps,\n MediaGalleryContainerProps,\n ProductInfoContainerProps,\n addToCart,\n addToOrderTemplate,\n addToWishlist,\n configure,\n description,\n findInStore,\n quantity,\n price,\n title,\n rating,\n inventoryLabel,\n shopSimilarLook,\n keyInPrice,\n shopSimilarDescription,\n unitOfMeasure,\n productComparisonButton\n } = props;\n\n return (\n <Module {...ModuleProps}>\n <Node {...MediaGalleryContainerProps}>{props.mediaGallery}</Node>\n <Node {...ProductInfoContainerProps}>\n {title}\n {price}\n {unitOfMeasure}\n {props.bulkPurchaseLink}\n {description}\n {rating}\n {configure && _renderConfigure(configure)}\n {keyInPrice && _renderKeyInPrice(keyInPrice)}\n {quantity && _renderQuantity(quantity)}\n {inventoryLabel}\n {addToCart && _renderAddToCart(addToCart)}\n {findInStore && _renderFindInStore(findInStore)}\n {addToOrderTemplate && _renderAddToOrderTemplate(addToOrderTemplate)}\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\n {_renderSocialShare(props.slots && props.slots.socialShare)}\n {productComparisonButton}\n {shopSimilarLook && _renderShopSimilarItem(shopSimilarLook)}\n {shopSimilarDescription && _renderShopSimilarItem(shopSimilarDescription)}\n </Node>\n </Module>\n );\n};\n\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToCart;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderAddToOrderTemplate = (addToOrderTemplate: IBuyboxAddToOrderTemplateViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToOrderTemplate;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderAddToWishlist = (addToWishlist: IBuyboxAddToWishlistViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToWishlist;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\n const { ContainerProps, dropdowns } = configure;\n\n return <Node {...ContainerProps}>{dropdowns.map(_renderConfigureDropdown)}</Node>;\n};\n\nconst _renderSocialShare = (socialShare: React.ReactNode[]): JSX.Element | undefined => {\n if (!socialShare || socialShare.length === 0) {\n return undefined;\n }\n\n return <>{socialShare[0]}</>;\n};\n\nconst _renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n {select}\n </Node>\n );\n};\n\nconst _renderFindInStore = (findInStore: IBuyboxFindInStoreViewProps): JSX.Element => {\n const { ContainerProps, storeSelector, heading, description, errors, button, modal, productPickupOptionList } = findInStore;\n\n return (\n <Node {...ContainerProps}>\n {storeSelector}\n {heading}\n {productPickupOptionList}\n {description}\n {errors}\n {button}\n {modal}\n </Node>\n );\n};\n\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n {input}\n </Node>\n );\n};\n\nconst _renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {input}\n </Node>\n );\n};\n\nconst _renderShopSimilarItem = (shopSimilarItem: IBuyboxShopSimilarLookViewProps): JSX.Element => {\n const { ContainerProps, errors, input } = shopSimilarItem;\n\n return (\n <Node {...ContainerProps}>\n {errors}\n {input}\n </Node>\n );\n};\nexport default BuyboxView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IRequestContext } from '@msdyn365-commerce/core';\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param context Current request context.\n * @param shouldUseCmsAltText Should use CMS alt text.\n * @param productName Product name.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { commerceApiRequest, getCatalogId, IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(async mediaLocation => validateMediaLocaionAsync(mediaLocation, imageSettings))).then(\n pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n }\n );\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unused-vars-experimental -- .\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings?: IImageSettings): Promise<[IImageData, boolean]> {\n const imageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\nimport msdyn365Commerce, { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport {\n ProductDeliveryOptions,\n ProductDimension,\n ProductDimensionValue,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertProductDimensionTypeToDimensionTypes,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDeliveryOptionsForSelectedVariant,\n GetDeliveryOptionsForSelectedVariantInput,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getProductPageUrlSync,\n getSelectedVariant,\n IProductInventoryInformation,\n IPromiseQueue,\n ISelectedProduct,\n ObjectExtensions,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n QueryResultSettingsProxy,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IComponentNodeProps,\n IModuleProps,\n IncrementalQuantity,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n ITelemetryContent,\n KeyCodes,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n NodeTag,\n onTelemetryClick,\n SingleSlideCarousel,\n TelemetryConstant,\n updateMaxQuantityForCartLineItem,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport React, { ReactNode } from 'react';\n\nimport {\n getBuyboxAddToCart,\n getBuyBoxInventoryLabel,\n getBuyboxKeyInPrice,\n getBuyboxProductAddToWishlist,\n getBuyboxProductDescription,\n getBuyboxProductPrice,\n getBuyboxProductRating,\n getBuyboxProductTitle,\n getBuyboxProductUnitOfMeasure,\n getQuantityLimitsMessages,\n IBuyboxAddToCartViewProps,\n IBuyboxAddToOrderTemplateViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonData,\n IBuyboxExtentedProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxState,\n IErrorState,\n IProductDetails,\n RetailDefaultOrderQuantityLimitsFeatureName,\n EcommerceQuantityLimitConfigurationsFeatureName,\n RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\n} from '../../common';\nimport { getBuyboxProductConfigure } from '../../common/buybox-product-configure';\nimport { IQuickviewData } from './quickview.data';\nimport { IQuickviewProps, IQuickviewResources } from './quickview.props.autogenerated';\nimport { getProductDetails } from './utilities/get-product-details';\nimport { getProductImages, getValidProductImages } from './utilities/get-valid-product-images';\nimport { RecentlyViewedState } from '../recently-viewed';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\n\n/**\n * QuickView props Interface.\n */\nexport interface IQuickviewViewProps extends IQuickviewProps<IQuickviewData> {\n quickView: IModuleProps;\n quickViewButton: React.ReactNode;\n ModalContainer: IModuleProps;\n ModalHeaderContainer: INodeProps;\n ModalHeaderContent: React.ReactNode;\n ModalFooterContainer: INodeProps;\n ModalBodyContainer: INodeProps;\n cartContainerProps: INodeProps;\n state: IBuyboxState;\n ModuleProps?: IModuleProps;\n ProductInfoContainerProps: INodeProps;\n MediaGalleryContainerProps: INodeProps;\n callbacks?: IBuyboxCallbacks;\n title?: React.ReactNode;\n description?: React.ReactNode;\n configure?: IBuyboxProductConfigureViewProps;\n inventoryLabel?: React.ReactNode;\n rating?: React.ReactNode;\n price?: React.ReactNode;\n addToCart?: IBuyboxAddToCartViewProps;\n addToOrderTemplate?: IBuyboxAddToOrderTemplateViewProps;\n addToWishlist?: IBuyboxAddToWishlistViewProps;\n max: number | undefined;\n keyInPrice?: IBuyboxKeyInPriceViewProps;\n quantity?: IBuyboxProductQuantityViewProps;\n quantityLimitsMessages?: React.ReactNode;\n CarouselProps: INodeProps;\n Thumbnails: IQuickViewThumbnailsViewProps;\n seeDetailsbutton: React.ReactNode;\n isModalOpen: boolean;\n loading?: React.ReactNode;\n unitOfMeasure?: React.ReactNode;\n productDetails?: IProductDetails | undefined;\n isMobileDevice?: boolean;\n}\n\n/**\n * QuickView extend props Interface.\n */\nexport interface IQuickviewExtentedProps<T> extends IQuickviewProps<IQuickviewData> {\n selectedProductId?: number;\n selectedDimensions?: ProductDimension[];\n}\n\n/**\n * QuickView thumbnails props Interface.\n */\nexport interface IQuickViewThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IQuickViewThumbnailItemViewProps[];\n}\n\n/**\n * QuickView thumbnail item view props Interface.\n */\nexport interface IQuickViewThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * QuickView state Interface.\n */\nexport interface IQuickViewState extends IBuyboxState {\n isDataLoaded: boolean;\n}\n\n/**\n *\n * Quickview component.\n * @extends {React.Component<IQuickviewProps<IQuickviewData>>}\n */\nclass Quickview extends React.Component<IQuickviewExtentedProps<IQuickviewData>, IQuickViewState> {\n /**\n * A queue of tasks of processing the changes in the dimensions.\n * Limit to two processes:\n * 1 - for the current process, which is under execution at the moment.\n * 2 - next process, which will process the latest version of data.\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\n */\n private readonly dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(2);\n\n private dimensions: { [id: number]: string } = {};\n\n private initializedDimensions: Set<string> = new Set();\n\n private readonly telemetryContent: ITelemetryContent;\n\n private productDetails: IProductDetails | undefined;\n\n private readonly quickViewCallbacks: IBuyboxCallbacks = {\n updateQuantity: (newQuantity: number): boolean => {\n const errorState = { ...this.state.errorState };\n errorState.quantityError = undefined;\n errorState.otherError = undefined;\n\n this.setState({ quantity: newQuantity, errorState });\n return true;\n },\n updateErrorState: (newErrorState: IErrorState): void => {\n this.setState({ errorState: newErrorState });\n },\n updateSelectedProduct: (\n newSelectedProduct: Promise<SimpleProduct | null>,\n newInventory: IProductInventoryInformation | undefined,\n newPrice: ProductPrice | undefined,\n newDeliveryOptions: ProductDeliveryOptions | undefined\n ): void => {\n this.setState({\n selectedProduct: newSelectedProduct,\n productAvailableQuantity: newInventory,\n productDeliveryOptions: newDeliveryOptions\n });\n this._updatePrice(newPrice);\n },\n initializeDimension: (initializedDimension: string): void => {\n if (initializedDimension) {\n this.initializedDimensions.add(initializedDimension);\n }\n },\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\n // Only trigger _updateDimensions when all dimensions are initialized\n if (this.initializedDimensions.size === this.productDetails?.product?.Dimensions?.length) {\n return this.dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: unknown) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw error;\n }\n });\n }\n },\n getDropdownName: (dimensionType: number, resources: IQuickviewResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n changeModalOpen: (isModalOpen: boolean): void => {\n this._hideQuickViewDialog();\n },\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n },\n updateKeyInPrice: (customPrice: number): void => {\n // Remove custom amount error when updating the custom price\n const errorState = { ...this.state.errorState };\n errorState.customAmountError = undefined;\n\n this.setState({ isPriceKeyedIn: true, keyInPriceAmount: customPrice, errorState });\n this._updatePrice(this.state.productPrice, customPrice);\n }\n };\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n public constructor(props: IQuickviewProps<IQuickviewData>) {\n super(props);\n this.state = {\n modalOpen: false,\n quantity: 1,\n min: undefined,\n max: undefined,\n errorState: {\n configureErrors: {}\n },\n selectedProduct: undefined,\n productPrice: undefined,\n productDeliveryOptions: undefined,\n isUpdatingDimension: false,\n activeIndex: 0,\n animating: false,\n mediaGalleryItems: undefined,\n isDataLoaded: false\n };\n\n this._quickViewCloseButtonclick = this._quickViewCloseButtonclick.bind(this);\n this.telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n }\n\n /**\n * React should component udpate function.\n * @param nextProps - Next Props.\n * @param nextState - Next State.\n * @returns Boolean - Whether the module will rerender or not.\n */\n public shouldComponentUpdate(nextProps: IQuickviewProps<IQuickviewData>, nextState: IBuyboxState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const {\n config: { className = '' },\n resources\n } = this.props;\n const { max } = this.state;\n const product = this.productDetails?.product ? this.productDetails.product : undefined;\n const props = this.props as IBuyboxExtentedProps<IBuyboxCommonData>;\n const defaultMinimumKeyInPrice = 10;\n const defaultMaximumKeyInPrice = 100;\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n const viewprops: IQuickviewViewProps = {\n ...(this.props as IQuickviewExtentedProps<IQuickviewData>),\n state: this.state,\n productDetails: this.productDetails,\n isModalOpen: this.state.modalOpen!,\n quickView: {\n moduleProps: this.props,\n className: classnames('ms-quickView', className),\n tag: 'div'\n },\n isMobileDevice,\n quickViewButton: (\n <button className='ms-quickView__button' onClick={this.onClickHandler} aria-label={resources.quickViewbuttonText}>\n {resources.quickViewbuttonText}\n </button>\n ),\n ModalContainer: {\n moduleProps: this.props,\n tag: Modal,\n className: 'ms-quickView__dialog',\n isOpen: this.state.modalOpen,\n 'aria-label': format(resources.quickViewAriaLabel, this.productDetails?.product?.Name),\n toggle: this._quickViewCloseButtonclick,\n modalTransition: { timeout: 0 },\n shouldUpdateFocusToFirstElement: this.state.isDataLoaded\n },\n ModalHeaderContainer: {\n tag: ModalHeader,\n className: 'ms-quickView__header',\n toggle: this._quickViewCloseButtonclick\n },\n ModalFooterContainer: {\n tag: ModalFooter,\n className: 'ms-quickView__footer'\n },\n ModalHeaderContent: '',\n ModalBodyContainer: {\n tag: ModalBody,\n className: 'ms-quickView__body'\n },\n cartContainerProps: {\n className: 'ms-quickView__product-add-to-cart'\n },\n ProductInfoContainerProps: {\n className: 'ms-quickView__content'\n },\n MediaGalleryContainerProps: {\n className: 'ms-quickView__media-gallery'\n },\n seeDetailsbutton: this._renderSeeDetailButton(product),\n loading: !this.state.isDataLoaded && (\n <Spinner className='ms-quickView__loading__icon' label={resources.loadingText} size={SpinnerSize.large} />\n ),\n callbacks: this.quickViewCallbacks,\n title: this.state.isDataLoaded && getBuyboxProductTitle(props, this.productDetails),\n description: this.state.isDataLoaded && getBuyboxProductDescription(props, this.productDetails),\n configure: this.state.isDataLoaded\n ? getBuyboxProductConfigure(props, this.state, this.quickViewCallbacks, this.productDetails, this.props.selectedDimensions)\n : undefined,\n price: this.state.isDataLoaded && getBuyboxProductPrice(props, this.state),\n unitOfMeasure: this.state.isDataLoaded && getBuyboxProductUnitOfMeasure(props, this.productDetails),\n rating:\n this.state.isDataLoaded && !this.props.context.app.config.hideRating && getBuyboxProductRating(props, this.productDetails),\n addToCart: this.state.isDataLoaded\n ? getBuyboxAddToCart(\n props,\n this.state,\n this.quickViewCallbacks,\n defaultMinimumKeyInPrice,\n defaultMaximumKeyInPrice,\n this.productDetails\n )\n : undefined,\n keyInPrice:\n this.state.isDataLoaded && this.props.config.enableKeyInPrice && this.state.isCustomPriceSelected\n ? getBuyboxKeyInPrice(props, this.state, this.quickViewCallbacks)\n : undefined,\n quantity: product?.IsGiftCard ? undefined : this._renderQuantity(this.props, this.state, this.quickViewCallbacks),\n inventoryLabel: this.state.isDataLoaded && getBuyBoxInventoryLabel(props, this.productDetails),\n addToWishlist: this.state.isDataLoaded\n ? getBuyboxProductAddToWishlist(props, this.state, this.quickViewCallbacks, this.productDetails)\n : undefined,\n quantityLimitsMessages: this.state.isDataLoaded && getQuantityLimitsMessages(props, this.state),\n max,\n CarouselProps: this._renderCarousel(),\n Thumbnails: this._renderThumbnails()\n };\n\n return this.props.renderView(viewprops) as React.ReactElement;\n }\n\n /**\n * Method to render detail button on quick view.\n * @param product - Simple product object.\n * @returns JSX element.\n */\n private readonly _renderSeeDetailButton = (product: SimpleProduct | undefined): JSX.Element => {\n const { config } = this.props;\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.seeDetails, '');\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n\n return (\n <Button\n className='ms-quickView__seeDetailsbutton'\n onClick={onTelemetryClick(this.telemetryContent, payLoad, TelemetryConstant.seeDetails)}\n {...attributes}\n aria-label={config.seeDetailsLinkText}\n href={this._getProductURL(product)}\n >\n {config.seeDetailsLinkText}\n </Button>\n );\n };\n\n /**\n * Method to return carousel.\n * @returns Node props.\n */\n private readonly _renderCarousel = (): INodeProps => {\n const { config, resources } = this.props;\n let mediaGalleryItems: ReactNode[];\n let keys: (string | undefined)[];\n const galleryImageSettings = config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n if (ArrayExtensions.hasElements(this.state.mediaGalleryItems)) {\n mediaGalleryItems = this.state.mediaGalleryItems.map((item: IImageData, index: number) => {\n return this._renderCarouselItemImageView(item, galleryImageSettings || this.defaultGalleryImageSettings, index);\n });\n keys = [...this.state.mediaGalleryItems.map(item => item.src)];\n } else {\n mediaGalleryItems = [this._renderEmptyImage(galleryImageSettings)];\n keys = ['empty'];\n }\n\n const props: IComponentNodeProps<ICarouselProps> = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryItems,\n activeIndex: this.state.activeIndex ?? 0,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n indicatorAriaText: resources.ariaLabelForSlide,\n onIndicatorsClickHandler: this.goToIndex,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: keys\n };\n\n return props;\n };\n\n /**\n * Method to render thumbnails.\n * @returns QuickView Thumbnails view props.\n */\n private readonly _renderThumbnails = (): IQuickViewThumbnailsViewProps => {\n const { config, id, resources } = this.props;\n\n const thumbnailImageSettings = config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n let mediaGalleryItems: IQuickViewThumbnailItemViewProps[];\n let keys: (string | undefined)[];\n if (ArrayExtensions.hasElements(this.state.mediaGalleryItems)) {\n mediaGalleryItems = this.state.mediaGalleryItems.map((item: IImageData, index: number) => {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex!\n );\n });\n keys = [...this.state.mediaGalleryItems.map(item => item.src)];\n } else {\n mediaGalleryItems = [];\n keys = [];\n }\n\n return {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(keys)\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n items: mediaGalleryItems\n };\n };\n\n private _updateMediaItems(lastUpdatedTime: number): void {\n const product = this.productDetails?.product;\n if (!this.state.mediaGalleryItems && product?.PrimaryImageUrl) {\n this.setState({\n mediaGalleryItems: [this._mapProductToImageData(product)],\n lastUpdate: lastUpdatedTime\n });\n }\n }\n\n private _updatePrice(newPrice: ProductPrice | undefined, customPrice: number | undefined = this.state.keyInPriceAmount): void {\n if (this.state.isCustomPriceSelected && newPrice) {\n newPrice.CustomerContextualPrice = customPrice;\n }\n this.setState({ productPrice: newPrice });\n }\n\n private readonly _updateDimensions = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n\n const { product, productDimensions } = this.productDetails!;\n\n if (!product || !productDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // Step 1: Clear error state to display relevant errors\n if (this.state.errorState.otherError || this.state.errorState.quantityError) {\n const clearErrorState = { ...this.state.errorState };\n clearErrorState.otherError = undefined;\n if (this.state.errorState.errorHost === 'ADDTOCART') {\n clearErrorState.quantityError = undefined;\n clearErrorState.errorHost = undefined;\n }\n this.setState({ errorState: clearErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const key of Object.keys(dimensionsToUpdate)) {\n if (this.state.errorState.configureErrors[key]) {\n const errorState = { ...this.state.errorState };\n errorState.configureErrors[key] = undefined;\n\n this.setState({ errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n .map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension && dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n const selectedProduct = new Promise<ISelectedProduct | null>(async resolve => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n // @ts-expect-error\n this.productDetails.productDimensions = await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n this.setState({ selectedProduct });\n const variantProduct = await selectedProduct;\n\n if (variantProduct && this.productDetails) {\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\n // so that places like add to cart can await it\n this.productDetails.product = variantProduct;\n let images: IImageData[] = await this.getImagesForProduct(product, variantProduct);\n images = this._filterMasterImageFromVariant(images, variantProduct);\n this.setState({\n mediaGalleryItems: [...images],\n activeIndex: 0,\n lastUpdate: Date.now()\n });\n\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\n new ProductAvailabilitiesForSelectedVariantInput(variantProduct.RecordId, channelId),\n actionContext\n );\n\n this.productDetails.productAvailableQuantity = newAvailableQuantity!;\n\n const isCustompriceSelected = variantProduct.Dimensions?.find(\n dimension => dimension.DimensionTypeValue === 4 && dimension.DimensionValue?.Value?.toLowerCase() === 'custom'\n );\n\n if (isCustompriceSelected) {\n this.setState({ isCustomPriceSelected: true });\n } else {\n // Remove custom amount error when unselect the custom amount\n const errorState = { ...this.state.errorState };\n errorState.customAmountError = undefined;\n\n this.setState({ isCustomPriceSelected: false, isPriceKeyedIn: false, errorState });\n }\n\n if (newAvailableQuantity && newAvailableQuantity.length > 0) {\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\n } else {\n this.setState({ productAvailableQuantity: undefined });\n }\n\n // Step 6. Use these dimensions hydrate the product price.\n const newPrice = await getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(variantProduct.RecordId, channelId),\n actionContext\n );\n\n if (newPrice) {\n this._updatePrice(newPrice);\n }\n\n const RetailMulitplePickupMFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n\n // Step 7. Use these dimensions hydrate the product delivery options.\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\n new GetDeliveryOptionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n undefined,\n undefined,\n RetailMulitplePickupMFeatureState?.IsEnabled\n ),\n actionContext\n );\n\n if (newDeliveryOptions) {\n this.setState({ productDeliveryOptions: newDeliveryOptions });\n }\n\n this.setState({ isUpdatingDimension: false });\n await this._updateQuantitiesInState(variantProduct);\n }\n };\n\n private _getProductURL(product: SimpleProduct | undefined): string {\n if (!product || !msdyn365Commerce.isBrowser) {\n return '';\n }\n\n let productUrl = '';\n productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, this.props.context.actionContext, undefined);\n\n const fullUrl = new URL(productUrl, window.location.href);\n product.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n return fullUrl.href;\n }\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n\n private async _updateQuantitiesInState(product: SimpleProduct): Promise<void> {\n const isOrderQuantityLimitsFeatureEnabled = await this._isOrderQuantityLimitsFeatureEnabled();\n const isChannelLimitsFeatureEnabled = await this._isChannelLimitsFeatureEnabled();\n\n const min: number = this._getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled, product);\n const max: number = this._getMaxQuantityForCartLineItem(\n isChannelLimitsFeatureEnabled || isOrderQuantityLimitsFeatureEnabled,\n product\n );\n let quantity: number = this._getQuantity(product, isOrderQuantityLimitsFeatureEnabled);\n quantity = Math.max(quantity, min);\n\n this.setState({\n min,\n max,\n quantity\n });\n }\n\n private _getMinQuantityForCartLineItem(isOrderQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (\n isOrderQuantityLimitsFeatureEnabled &&\n this._getIgnoreOrderSettings() &&\n product?.Behavior?.MinimumQuantity &&\n product.Behavior.MinimumQuantity > 0\n ) {\n return product.Behavior.MinimumQuantity;\n }\n\n return 1;\n }\n\n private _getMaxQuantityForCartLineItem(isQuantityLimitsFeatureEnabled: boolean, product: SimpleProduct): number {\n if (\n isQuantityLimitsFeatureEnabled &&\n this._getIgnoreOrderSettings() &&\n product?.Behavior?.MaximumQuantity &&\n product.Behavior.MaximumQuantity > 0\n ) {\n return product.Behavior.MaximumQuantity;\n }\n\n return updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem);\n }\n\n /**\n * Retrieves the value of the IgnoreOrderSettings property from the cart configuration.\n * If the property is not present, it defaults to false.\n * @returns {boolean} The value of the IgnoreOrderSettings property.\n */\n private _getIgnoreOrderSettings(): boolean {\n const cartConfiguration = this.props.data.cartConfiguration;\n return !(cartConfiguration?.result?.IgnoreOrderSettings ?? false);\n }\n\n private _getQuantity(product: SimpleProduct, isOrderQuantityLimitsFeatureEnabled: boolean): number {\n const { quantity } = this.state;\n let defaultQuantity = 1;\n\n if (quantity !== defaultQuantity || !isOrderQuantityLimitsFeatureEnabled) {\n return quantity;\n }\n\n const cartConfiguration = this.props.data.cartConfiguration;\n const applyDefaultOrderSettingsForCartLine = cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n if (!applyDefaultOrderSettingsForCartLine) {\n return quantity;\n }\n\n if (product?.Behavior?.DefaultQuantity && product.Behavior.DefaultQuantity > 0) {\n defaultQuantity = product.Behavior.DefaultQuantity;\n }\n\n return defaultQuantity;\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[], product?: ISelectedProduct | null): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(product?.MasterProductId) || !ObjectExtensions.isNullOrUndefined(product?.productVariant);\n const itemId = product?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _updateDimensionValue = (\n productDimensionFull: ProductDimensionFull,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IQuickviewResources): string => {\n const isGiftCard = this.productDetails?.product?.IsGiftCard;\n\n switch (dimensionType) {\n case 1: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case 2: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case 4: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private async _isOrderQuantityLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName\n )?.IsEnabled;\n if (!isFeatureEnabledInHq) {\n return false;\n }\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n let customerInfo;\n try {\n customerInfo = await this.props.data.customerInformation;\n } catch (error) {\n this.props.telemetry.information(error);\n this.props.telemetry.debug('Unable to receive Customer Information. May be user is not authorized');\n return false;\n }\n\n return (\n customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === EcommerceQuantityLimitConfigurationsFeatureName\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n private readonly next = (): void => {\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex! + 1;\n this.goToIndex(nextIndex);\n };\n\n private readonly previous = (): void => {\n const nextIndex = this.isFirstItem()\n ? this.state.mediaGalleryItems\n ? this.state.mediaGalleryItems.length - 1\n : 0\n : this.state.activeIndex! - 1;\n this.goToIndex(nextIndex);\n };\n\n private readonly goToIndex = (index: number): void => {\n this.setState({ activeIndex: index });\n };\n\n private _renderCarouselItemImageView(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return <>{this._getCarouselItem(image, imageSettings, index)}</>;\n }\n\n private readonly _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item'\n {...image}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n role='tabpanel'\n key={image.src}\n id={`${this.props.id}__carousel-item__${index}`}\n />\n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IQuickViewThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n key={image.src}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings}\n loadFailureBehavior='default'\n />\n )\n };\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent<HTMLLIElement>) => {\n event.preventDefault();\n this.goToIndex(index);\n };\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl || '',\n altText: product.Name\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\n\n private readonly onClickHandler = async (event: React.MouseEvent<HTMLElement>) => {\n return this._onClick(event, this.props);\n };\n\n private readonly _onClick = async (_event: React.MouseEvent<HTMLElement>, props: IQuickviewExtentedProps<IQuickviewData>) => {\n if (!ObjectExtensions.isNullOrUndefined(props.selectedProductId)) {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n\n if (this.props.selectedProductId) {\n this.setState({ modalOpen: true });\n const productId = this.props.selectedProductId;\n const selectedDimensions = this.props.selectedDimensions;\n this.productDetails = await getProductDetails(productId, channelId, actionContext, selectedDimensions);\n const { product, productPrice } = this.productDetails;\n const currentTime: number = Date.now();\n this._updateMediaItems(currentTime);\n if (productPrice) {\n this._updatePrice(productPrice);\n }\n\n if (product) {\n const { context } = this.props;\n if (context.app.config.maxRecentlyViewedItemsCount > 0) {\n RecentlyViewedState.instance(this.props.context, context.app.config.maxRecentlyViewedItemsCount, product.RecordId);\n }\n // Check if the product is service or not by product type\n if (product.ItemTypeValue === ReleasedProductType.Service) {\n this.setState({ isServiceItem: true });\n }\n await this._updateQuantitiesInState(product);\n let images = await this.getImagesForProduct(product, product);\n images = this._filterMasterImageFromVariant(images);\n this.setState({\n mediaGalleryItems: [...images],\n activeIndex: 0,\n lastUpdate: currentTime\n });\n // update product delivery options on product on quickview popUp load\n const newDeliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(\n this.props.context.actionContext\n )\n },\n [this.props.selectedProductId]\n );\n if (newDeliveryOptions && newDeliveryOptions.length > 0) {\n this.setState({ productDeliveryOptions: newDeliveryOptions[0] });\n }\n }\n this.setState({ isDataLoaded: true });\n }\n }\n };\n\n private getImagesForProduct = async (product: ISelectedProduct, variantProduct: ISelectedProduct): Promise<IImageData[]> => {\n let images: IImageData[];\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n product.productVariant ?? variantProduct\n );\n } else {\n images = await getValidProductImages(\n product.RecordId || 0,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant ?? variantProduct\n );\n }\n return images;\n };\n\n private readonly _quickViewCloseButtonclick = () => {\n this._hideQuickViewDialog();\n };\n\n private _hideQuickViewDialog(): void {\n this.dimensions = [];\n this.setState({\n modalOpen: false,\n quantity: 1,\n min: undefined,\n max: undefined,\n errorState: {\n configureErrors: {}\n },\n selectedProduct: undefined,\n productPrice: undefined,\n productDeliveryOptions: undefined,\n isUpdatingDimension: false,\n productAvailableQuantity: undefined,\n lastUpdate: undefined,\n activeIndex: undefined,\n animating: undefined,\n mediaGalleryItems: [],\n isDataLoaded: false\n });\n }\n\n /**\n * Quantity Change Handler.\n * @param callbacks -Buybox callbacks.\n * @returns Update quantity.\n */\n private readonly onChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number): boolean => {\n if (callbacks.updateQuantity) {\n return callbacks.updateQuantity(newValue);\n }\n return true;\n };\n\n private readonly _renderQuantity = (\n props: IQuickviewExtentedProps<IQuickviewData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n ): IBuyboxProductQuantityViewProps => {\n const { resources } = props;\n\n const {\n quantity,\n min,\n max,\n errorState: { quantityError }\n } = state;\n\n return {\n ContainerProps: {\n className: 'ms-quickView__quantity'\n },\n LabelContainerProps: {\n tag: 'label',\n className: 'ms-quickView__product-quantity-label',\n htmlFor: 'ms-quickView__product-quantity-input'\n },\n heading: <div className='ms-quickView__product-quantity-label-heading'>{resources.productQuantityHeading}</div>,\n errors: quantityError && (\n <span className='msc-alert msc-alert-noborder msc-alert-danger'>\n <span className='msi-exclamation-triangle' aria-hidden='true' />\n <span>{quantityError}</span>\n </span>\n ),\n input: (\n <IncrementalQuantity\n id='ms-buybox__product-quantity-input'\n min={min}\n max={max}\n currentCount={quantity}\n onChange={this.onChangeHandler(callbacks)}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n minQuantityText={resources.minQuantityText}\n maxQuantityText={resources.maxQuantityText}\n telemetryContent={this.telemetryContent}\n disabled={this.state.isUpdatingDimension}\n />\n )\n };\n };\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n <div className='ms-media-gallery__item'>\n <Image\n requestContext={this.props.context.actionContext.requestContext}\n className='ms-media-gallery__item__image'\n src='empty'\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={imageSettings ?? this.defaultGalleryImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n }\n}\nexport default Quickview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { getCartStateData, GetCartStateDataInput } from '@msdyn365-commerce/global-state';\nimport { ProductDimension } from '@msdyn365-commerce/retail-proxy';\nimport {\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getRatingsSummary,\n GetRatingsSummaryInput,\n getRnrEndpointId,\n getRnrPartnerId,\n getSelectedVariant,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IProductDetails } from '../../../common/buyboxInterface';\n\n/**\n * Calls the Retail API and returns the product details.\n * @param productId\n * @param channelId\n * @param ctx\n * @param selectedDimensions - Dimensions previously selected for the product variant.\n */\nexport async function getProductDetails(\n productId: number,\n channelId: number,\n ctx: IActionContext,\n selectedDimensions?: ProductDimension[]\n): Promise<IProductDetails> {\n const productDetails: IProductDetails = {};\n\n if (productId > 0 && channelId > 0) {\n const tenantId = getRnrPartnerId(ctx);\n const serviceEndPoint = getRnrEndpointId(ctx);\n\n // Get Product Details\n await getSelectedVariant(new SelectedVariantInput(productId, channelId, selectedDimensions, 'get', ctx.requestContext), ctx)\n .then(async productResult => {\n if (productResult) {\n productDetails.product = productResult;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get Product Availability\n await getProductAvailabilitiesForSelectedVariant(new ProductAvailabilitiesForSelectedVariantInput(productId, channelId), ctx)\n .then(productAvailabilities => {\n if (productAvailabilities) {\n productDetails.productAvailableQuantity = productAvailabilities;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get Product Price\n await getPriceForSelectedVariant(new PriceForSelectedVariantInput(productId, channelId, undefined), ctx)\n .then(productPrice => {\n if (productPrice) {\n productDetails.productPrice = productPrice;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get product dimensions\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(productId, channelId, selectedDimensions, ctx.requestContext),\n ctx\n )\n .then(productDimensions => {\n if (productDimensions) {\n productDetails.productDimensions = productDimensions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get Cart State\n await getCartStateData(new GetCartStateDataInput(ctx.requestContext.apiSettings, ctx.requestContext), ctx)\n .then(cartState => {\n productDetails.cart = cartState;\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n\n // Get Product Ratings\n if (tenantId && serviceEndPoint) {\n await getRatingsSummary(new GetRatingsSummaryInput(productId.toString(), tenantId, serviceEndPoint), ctx)\n .then(ratingsSummaryData => {\n if (ratingsSummaryData) {\n productDetails.ratingsSummary = ratingsSummaryData;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n });\n }\n }\n\n return productDetails;\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 {\n IBuyboxAddToCartViewProps,\n IBuyboxAddToWishlistViewProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps\n} from '../../common';\nimport { IQuickviewViewProps } from './quickview';\n\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToCart;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderAddToWishlist = (addToWishlist: IBuyboxAddToWishlistViewProps): JSX.Element => {\n const { ContainerProps, errorBlock, button } = addToWishlist;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\nconst _renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n {select}\n </Node>\n );\n};\n\nconst _renderQuickViewPopup = (props: IQuickviewViewProps): JSX.Element => {\n const {\n ModalContainer,\n ModalHeaderContainer,\n ModalFooterContainer,\n ModalHeaderContent,\n ModalBodyContainer,\n addToWishlist,\n addToCart,\n cartContainerProps\n } = props;\n\n return (\n <Module {...ModalContainer}>\n <Node {...ModalHeaderContainer}>{ModalHeaderContent}</Node>\n <Node {...ModalBodyContainer}>{_renderBodyContent(props)}</Node>\n <Node {...ModalFooterContainer}>\n <Node {...cartContainerProps}>\n {addToCart && _renderAddToCart(addToCart)}\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst _renderQuantity = (quantity: IBuyboxProductQuantityViewProps, quantityLimitsMessages: React.ReactNode): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n {input}\n {quantityLimitsMessages}\n </Node>\n );\n};\n\nconst _renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {input}\n </Node>\n );\n};\n\nconst _renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\n const { ContainerProps, dropdowns } = configure;\n\n return <Node {...ContainerProps}>{dropdowns.map(_renderConfigureDropdown)}</Node>;\n};\n\nconst _renderBodyContent = (props: IQuickviewViewProps): JSX.Element => {\n const {\n title,\n price,\n rating,\n keyInPrice,\n quantity,\n configure,\n inventoryLabel,\n quantityLimitsMessages,\n seeDetailsbutton,\n loading,\n ProductInfoContainerProps,\n MediaGalleryContainerProps,\n CarouselProps,\n unitOfMeasure\n } = props;\n if (loading) {\n return <>{loading}</>;\n }\n return (\n <>\n <Node {...MediaGalleryContainerProps}>\n <Node {...CarouselProps} />\n </Node>\n <Node {...ProductInfoContainerProps}>\n {title}\n {price}\n {unitOfMeasure}\n {rating}\n {configure && _renderConfigure(configure)}\n {keyInPrice && _renderKeyInPrice(keyInPrice)}\n {quantity && _renderQuantity(quantity, quantityLimitsMessages)}\n {seeDetailsbutton}\n {inventoryLabel}\n </Node>\n </>\n );\n};\n\n/**\n * Functional component which renders quick view button and popup based by the given props file.\n * @param {IQuickviewViewProps} props - Configuration for the quick view component.\n * @returns {React.FC<IQuickviewViewProps>} - Functional component of the quick view.\n */\nexport const QuickViewFunctionalComponent: React.FC<IQuickviewViewProps> = (props: IQuickviewViewProps) => {\n const { quickView, quickViewButton, isModalOpen, isMobileDevice } = props;\n return (\n <Module {...quickView}>\n {!isMobileDevice && quickViewButton}\n {isModalOpen && _renderQuickViewPopup(props)}\n </Module>\n );\n};\n\nexport default QuickViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RecentlyViewedItem } from './recently-viewed-item';\n\n/**\n * Represents a product for comparison.\n */\nexport class RecentlyViewedProductItem extends RecentlyViewedItem<string> {\n public readonly productId: number;\n\n public readonly catalogId: number;\n\n public static getItemId(productId: number, catalogId: number): string {\n return `${productId}-${catalogId}`;\n }\n\n public constructor(productId: number, catalogId: number) {\n const itemId = RecentlyViewedProductItem.getItemId(productId, catalogId);\n super(itemId);\n\n this.productId = productId;\n this.catalogId = catalogId;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/**\n * Represents an item for recently viewed.\n */\nexport abstract class RecentlyViewedItem<ItemId> {\n public readonly itemId: ItemId;\n\n public constructor(itemId: ItemId) {\n this.itemId = itemId;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getCatalogId, ICookieContext, ICoreContext } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { RecentlyViewedProductItem } from './base';\nimport { RecentlyViewedManager } from './recently-viewed-manager';\n\n/**\n * Represents a recently viewed product which operates a list of products and cookies to store the list.\n */\nexport class RecentlyViewedState extends RecentlyViewedManager<string, RecentlyViewedProductItem> {\n private static readonly _recentlyViewedLocalStorageKey: string = '_msdyn365___recently_viewed_products';\n\n public static instance(context: ICoreContext, maxRecentlyViewedItemsCount: number, productId: number): void {\n const cookieContext: ICookieContext = context.request.cookies;\n let items = RecentlyViewedState._retrieveItemsFromCookies(cookieContext);\n\n const catalogId = getCatalogId(context.request);\n\n const item = new RecentlyViewedProductItem(productId, catalogId);\n const max: number = maxRecentlyViewedItemsCount + 1 || 11;\n const index: number = items.map(object => object.productId).indexOf(item.productId);\n if (item && index === -1) {\n items.push(item);\n } else {\n items.splice(items.length - 1, 0, items.splice(index, 1)[0]);\n }\n if (items.length > max) {\n items = items.slice(Math.max(items.length - max, 0));\n }\n\n RecentlyViewedState._writeToCookie(cookieContext, RecentlyViewedState._recentlyViewedLocalStorageKey, items);\n }\n\n private static _retrieveItemsFromCookies(cookieContext: ICookieContext): RecentlyViewedProductItem[] {\n const items = RecentlyViewedState._readFromCookie(cookieContext, RecentlyViewedState._recentlyViewedLocalStorageKey);\n if (!ArrayExtensions.hasElements(items)) {\n return [];\n }\n return items;\n }\n\n private static _readFromCookie(cookieContext: ICookieContext, cookieKey: string): RecentlyViewedProductItem[] | undefined | null {\n if (!cookieKey) {\n return undefined;\n }\n\n if (!cookieContext.isConsentGiven()) {\n return undefined;\n }\n\n const cookieValue = cookieContext.get<RecentlyViewedProductItem[] | undefined | null>(cookieKey);\n\n return cookieValue.value;\n }\n\n private static _writeToCookie(cookieContext: ICookieContext, cookieKey: string, value: RecentlyViewedProductItem[]): void {\n if (!cookieKey) {\n return;\n }\n\n cookieContext.set(cookieKey, value, { secure: true, maxAge: 5_184_000 });\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RecentlyViewedItem } from './base';\n\n/**\n * Represents base functionality of a recently viewed manager which operates a list of items for recently viewed.\n */\nexport class RecentlyViewedManager<ItemId, Item extends RecentlyViewedItem<ItemId> = RecentlyViewedItem<ItemId>> {\n private _recentlyViewedItems: Item[];\n\n public get items(): Item[] {\n return this._recentlyViewedItems;\n }\n\n public constructor(...items: Item[]) {\n this._recentlyViewedItems = items;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToOrderTemplateComponent,\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateActionErrorResult,\n IOrderTemplateNameDialogResources\n} from '@msdyn365-commerce/components';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n getConfigureErrors,\n IBuyboxCallbacks,\n IBuyboxCommonResources,\n IBuyboxData,\n IBuyboxState,\n IBuyboxViewProps\n} from '@msdyn365-commerce-modules/buybox';\nimport * as React from 'react';\n\nimport { IBuyboxProps as IBuyboxExtentionProps } from '../../definition-extensions/buybox.ext.props.autogenerated';\n\n/**\n * To generate AddToOrderTemplateDialog resources.\n * @param resources - The resources.\n * @returns -- Returns the list of AddToOrderTemplateDialog resources..\n */\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n}\n\n/**\n * To generate OrderTemplateNameDialog resources.\n * @param resources - The resources.\n * @returns -- Returns the list of OrderTemplateNameDialog resources..\n */\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxCommonResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n}\n\n/**\n * To generate ItemAddedToOrderTemplateDialog resources.\n * @param resources - The resources.\n * @returns -- Returns the list of ItemAddedToOrderTemplateDialog resources..\n */\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.priceFree,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n}\n\n/**\n * To generate DuplicateItemsWhenAddingToOrderTemplateDialog resources.\n * @param resources - The resources.\n * @returns -- Returns the list of DuplicateItemsWhenAddingToOrderTemplateDialog resources..\n */\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: IBuyboxCommonResources\n): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n}\n\n/**\n * Add to wishlist failed function.\n * @param callbacks -Buybox callbacks.\n * @param resources -Buybox resources.\n * @param product -Simple product.\n * @returns Update error state.\n */\nconst onAddToOrderTemplateFailed = (callbacks: IBuyboxCallbacks, resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (\n result: IOrderTemplateActionErrorResult\n) => {\n callbacks.updateErrorState({\n errorHost: 'ORDER_TEMPLATE',\n configureErrors:\n result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\n });\n};\n\n/**\n * RenderAddToOrderTemplateButton.\n * @param props - Buybox view props.\n * @param state - Buybox state.\n * @param callbacks - Buybox callbacks.\n * @param product - Product data.\n * @returns -- Returns JSX element.\n */\nexport const renderAddToOrderTemplateButton = (\n props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n product: SimpleProduct\n): React.ReactNode => {\n const {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from module file.\n id,\n typeName,\n context,\n data: {\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n resources,\n config\n } = props;\n\n const { quantity } = state;\n\n const isShowButtonText = true;\n const isMultipleCatalogsFeatureEnabled = props.isChannelMultipleCatalogsFeatureEnabled || false;\n return (\n orderTemplates && (\n <AddToOrderTemplateComponent\n className='msc-add-to-cart-extra-actions'\n addToOrderTemplateButtonText={resources.addToOrderTemplateButtonText}\n addToOrderTemplateButtonTooltip={resources.addToOrderTemplateButtonTooltip}\n addToOrderTemplateDialogResources={generateAddToOrderTemplateDialogResources(resources)}\n createOrderTemplateDialogResources={generateOrderTemplateNameDialogResources(resources)}\n itemAddedToOrderTemplateDialogResources={generateItemAddedToOrderTemplateDialogResources(resources)}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n )}\n data={{ product, quantity, orderTemplates, customerInformation }}\n context={context}\n id={id}\n typeName={typeName}\n onError={onAddToOrderTemplateFailed(callbacks, resources, product)}\n shouldShowButtonFailedTooltip={state.isCustomPriceSelected}\n showButtonTooltip={false}\n showButtonText={isShowButtonText}\n imageSettings={config && config.imageSettings !== undefined ? config.imageSettings : undefined}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n {...(isMultipleCatalogsFeatureEnabled && { catalogId: props.currentCatalogId })}\n />\n )\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToWishlistComponent, IWishlistActionErrorResult } from '@msdyn365-commerce/components';\nimport { format, ItemAvailability, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { IStoreInfo } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n getConfigureErrors,\n IBuyboxAddToCartViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonResources,\n IBuyboxData,\n IBuyboxFindInStoreViewProps,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxResources as IBuyboxExtentionResources,\n IBuyboxShopSimilarLookViewProps,\n IBuyboxState,\n IBuyboxViewProps\n} from '@msdyn365-commerce-modules/buybox';\nimport {\n ArrayExtensions,\n getFullAvailableInventoryNearby,\n GetFullAvailableInventoryNearbyInput,\n IFullOrgUnitAvailability\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { IncrementalQuantity, INodeProps, ITelemetryContent, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IBuyboxProps as IBuyboxExtentionProps, IBuyboxProps } from '../definition-extensions/buybox.ext.props.autogenerated';\nimport { renderAddToOrderTemplateButton } from './components/buybox-add-to-order-template';\n\n/**\n * BuyBoxConstants enum.\n */\nexport enum BuyBoxConstants {\n zero = 0\n}\n\n/**\n * On Change function.\n * @param callbacks -Callbacks.\n * @returns Update quantity.\n */\nconst onChangeHandler = (callbacks: IBuyboxCallbacks) => (newValue: number): boolean => {\n if (callbacks.updateQuantity) {\n return callbacks.updateQuantity(newValue);\n }\n return true;\n};\n\n/**\n * RenderQuantity.\n * @param quantityComponent - QuantityComponent.\n * @param callbacks - Callbacks.\n * @param props - Props.\n * @param state - State.\n * @param extentionResources - ExtentionResources.\n * @param quantityLimitsMessages - QuantityLimitsMessages.\n * @param max - Max.\n * @param telemetryContent - TelemetryContent.\n * @param unitOfMeasure - Unit Of Measure.\n * @returns -- Returns.\n */\nconst renderQuantity = (\n quantityComponent: IBuyboxProductQuantityViewProps,\n callbacks: IBuyboxCallbacks,\n props: IBuyboxProps<IBuyboxData>,\n state: IBuyboxState,\n extentionResources: IBuyboxExtentionResources,\n quantityLimitsMessages: React.ReactNode,\n\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n min: number | undefined,\n max: number | undefined,\n applyDefaultOrderSettings?: boolean,\n telemetryContent?: ITelemetryContent,\n unitOfMeasure?: React.ReactNode\n): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n const { ContainerProps, LabelContainerProps, heading, errors } = quantityComponent;\n\n const { resources } = props;\n\n const { quantity } = state;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>\n {heading}\n {errors}\n </Node>\n\n <IncrementalQuantity\n id='ms-buybox__product-quantity-input'\n min={min}\n max={max}\n applyDefaultOrderSettings={applyDefaultOrderSettings}\n currentCount={quantity}\n onChange={onChangeHandler(callbacks)}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n minQuantityText={extentionResources.minQuantityText}\n maxQuantityText={extentionResources.maxQuantityText}\n telemetryContent={telemetryContent}\n />\n {unitOfMeasure}\n {quantityLimitsMessages}\n </Node>\n );\n};\n\n/**\n * Render key in price function.\n * @param keyInPrice - KeyInPrice.\n * @returns -- Returns.\n */\nconst renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {input}\n </Node>\n );\n};\n\n/**\n * RenderAddToCart.\n * @param addToCart - AddToCart.\n * @returns -- Returns.\n */\nconst renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n const { ContainerProps, errorBlock, button } = addToCart;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\n/**\n * RenderFindInStore.\n * @param findInStore - FindInStore.\n * @returns -- Returns.\n */\nconst renderFindInStore = (findInStore: IBuyboxFindInStoreViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n const { ContainerProps, storeSelector, heading, description, errors, button, modal, productPickupOptionList } = findInStore;\n\n return (\n <Node {...ContainerProps}>\n {storeSelector}\n {heading}\n {productPickupOptionList}\n {description}\n {errors}\n {button}\n {modal}\n </Node>\n );\n};\n\n/**\n * RenderAddToOrderTemplate.\n * @param props - Buybox view props.\n * @param state - Buybox state.\n * @param callbacks - Buybox callbacks.\n * @returns -- Returns.\n */\nconst renderAddToOrderTemplate = (\n props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n): JSX.Element | null => {\n const product = props.data.product.result;\n if (!props.addToOrderTemplate || !product) {\n return null;\n }\n\n const orderTemplateButton = renderAddToOrderTemplateButton(props, state, callbacks, product);\n\n return (\n <Node {...props.addToOrderTemplate.ContainerProps}>\n {props.addToOrderTemplate.errorBlock}\n {orderTemplateButton}\n </Node>\n );\n};\n\n/**\n * Add to wishlist failed function.\n * @param callbacks -Buybox callbacks.\n * @param resources -Buybox resources.\n * @param product -Simple product.\n * @returns Update error state.\n */\nconst onAddToWishlistFailed = (callbacks: IBuyboxCallbacks, resources: IBuyboxCommonResources, product: SimpleProduct | undefined) => (\n result: IWishlistActionErrorResult\n) => {\n callbacks.updateErrorState({\n errorHost: 'WISHLIST',\n configureErrors:\n result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\n });\n};\n\n/**\n * RenderAddToWishlist.\n * @param props - Buybox view props.\n * @param state - Buybox state.\n * @param callbacks - Buybox callbacks.\n * @param product - Product data.\n * @returns -- Returns.\n */\nconst renderAddtoWishlistButton = (\n props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks,\n product: SimpleProduct\n): React.ReactNode => {\n const { context, resources } = props;\n const wishlists = props.data.wishlists.result;\n const isShowWishlitButtonText = true;\n return (\n <AddToWishlistComponent\n className='msc-add-to-cart-extra-actions'\n addToWishlistButtonText={resources.addToWishlistButtonText}\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\n addToWishlistMessage={resources.addToWishlistMessage}\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\n addItemToWishlistError={resources.addItemToWishlistError}\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\n nameOfWishlist={resources.nameOfWishlist}\n data={{ product, wishlists }}\n context={context}\n ariaRole='button'\n id={props.id}\n typeName={props.typeName}\n onError={onAddToWishlistFailed(callbacks, resources, product)}\n getSelectedProduct={state.selectedProduct}\n showButtonText={isShowWishlitButtonText}\n showButtonTooltip={false}\n />\n );\n};\n\n/**\n * RenderAddToWishlist.\n * @param props - Buybox viewprops.\n * @param state - Buybox state.\n * @param callbacks - Buybox callbacks.\n * @returns -- Returns.\n */\nconst renderAddToWishlist = (\n props: IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks\n): JSX.Element | null => {\n const product = props.data.product.result;\n if (!props.addToWishlist || !product) {\n return null;\n }\n\n if (!props.config.enableWishlist) {\n return null;\n }\n\n const wishlistButton = renderAddtoWishlistButton(props, state, callbacks, product);\n return (\n <Node {...props.addToWishlist.ContainerProps}>\n {props.addToWishlist.errorBlock}\n {wishlistButton}\n </Node>\n );\n};\n\n/**\n * RRenderShopSimilarItem.\n * @param shopSimilarItem - ShopSimilarItem.\n * @returns -- Returns.\n */\nconst renderShopSimilarItem = (shopSimilarItem: IBuyboxShopSimilarLookViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n const { ContainerProps, errors, input } = shopSimilarItem;\n\n return (\n <Node {...ContainerProps}>\n {errors}\n {input}\n </Node>\n );\n};\n\n/**\n * RenderSocialShare.\n * @param socialShare - Social share react node array.\n * @returns -- Returns.\n */\nconst _renderSocialShare = (socialShare: React.ReactNode[]): JSX.Element | undefined => {\n if (!socialShare || socialShare.length === 0) {\n return undefined;\n }\n\n return <>{socialShare[0]}</>;\n};\n\n/**\n * RenderConfigureDropdown.\n * @param dropdown - Buybox product configure dropdown view props.\n * @returns -- Returns JSX.Element.\n */\nconst renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {select}\n {errors}\n </Node>\n );\n};\n\n/**\n * RenderConfigure.\n * @param configure - Buybox product configure view props.\n * @returns -- Returns JSX.Element.\n */\nconst renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\n const { ContainerProps, dropdowns } = configure;\n\n return <Node {...ContainerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n};\n\n/**\n * BuyboxView.\n * @param props - Props.\n * @returns -- Returns.\n */\nconst BuyboxView: React.FC<IBuyboxViewProps & IBuyboxExtentionProps<IBuyboxData>> = props => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n const {\n ModuleProps,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n MediaGalleryContainerProps,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n ProductInfoContainerProps,\n addToCart,\n addToOrderTemplate,\n addToWishlist,\n productComparisonButton,\n configure,\n description,\n findInStore,\n quantity,\n price,\n title,\n rating,\n inventoryLabel,\n shopSimilarLook,\n keyInPrice,\n shopSimilarDescription,\n min,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Buybox.tsx file\n max,\n applyDefaultOrderSettings,\n unitOfMeasure,\n callbacks,\n state,\n resources,\n quantityLimitsMessages,\n telemetryContent,\n app: { config: appConfig },\n catalogs\n } = props;\n let skuText: string = props.resources.skuText;\n skuText += props.data.product.result?.ItemId;\n const preferredStoreInfo: IStoreInfo | undefined = props.data.storeSelectorStateManager.result?.preferredStore;\n const preferredStoreId = preferredStoreInfo?.StoreId ? preferredStoreInfo.StoreId : '';\n const preferredStoreName = preferredStoreInfo?.StoreName ? preferredStoreInfo.StoreName : '';\n\n const [availability, setAvailability] = React.useState<string>('');\n const [isStoreChange, setIsStoreChange] = React.useState<boolean>(false);\n\n /**\n * GetStockInventoryLabel.\n * @param availabilityWithHours - Stock availability with hours.\n * @returns -- Returns.\n */\n const getStockInventoryLabel = (availabilityWithHours: IFullOrgUnitAvailability | undefined): string | undefined => {\n if (availabilityWithHours && ArrayExtensions.hasElements(availabilityWithHours.ProductInventoryInformation)) {\n for (const productInventoryInformation of availabilityWithHours.ProductInventoryInformation) {\n if (\n availabilityWithHours.OrgUnitAvailability?.OrgUnitLocation?.InventoryLocationId ===\n productInventoryInformation.InventLocationId\n ) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n }\n\n return undefined;\n };\n\n const getInventory = React.useCallback(async () => {\n const input = new GetFullAvailableInventoryNearbyInput(\n props.data.product.result?.RecordId,\n BuyBoxConstants.zero,\n BuyBoxConstants.zero,\n BuyBoxConstants.zero,\n BuyBoxConstants.zero,\n true\n );\n\n /**\n * IsProductInStock.\n * @param itemAvailabilities - Item availability array.\n * @returns -- Returns.\n */\n const isProductInStock = (itemAvailabilities: ItemAvailability[] | undefined): boolean => {\n if (!appConfig.enableStockCheck) {\n return true;\n }\n\n if (ArrayExtensions.hasElements(itemAvailabilities)) {\n return itemAvailabilities[BuyBoxConstants.zero].AvailableQuantity! > BuyBoxConstants.zero;\n }\n\n return false;\n };\n\n await getFullAvailableInventoryNearby(input, props.context.actionContext)\n .catch((error: Error) => {\n props.telemetry.error(error.message);\n })\n .then(response => {\n if (response && ArrayExtensions.hasElements(response)) {\n const isPreferredStore = (value: IFullOrgUnitAvailability) =>\n value.OrgUnitAvailability?.OrgUnitLocation?.OrgUnitNumber === preferredStoreId;\n const filteredFullOrgUnitAvailability = response.filter(isPreferredStore);\n const preferredStoreAvailability = ArrayExtensions.hasElements(filteredFullOrgUnitAvailability)\n ? filteredFullOrgUnitAvailability[BuyBoxConstants.zero]\n : undefined;\n const stockStatusLabel: string | undefined = getStockInventoryLabel(preferredStoreAvailability);\n const isInStock = isProductInStock(preferredStoreAvailability?.OrgUnitAvailability?.ItemAvailabilities);\n const resourceLabel = isInStock ? props.resources.inStockText : props.resources.outOfStockText;\n const stockText: string | undefined = stockStatusLabel ? stockStatusLabel : resourceLabel;\n const preferredStoreAvailabilityText = `${format(\n props.resources.availabilityAtPreferredStoreText,\n preferredStoreName\n )} ${stockText}`;\n setAvailability(preferredStoreAvailabilityText);\n }\n });\n\n setIsStoreChange(false);\n }, [\n props.data.product.result?.RecordId,\n appConfig.enableStockCheck,\n preferredStoreId,\n preferredStoreName,\n props.context.actionContext,\n props.resources.availabilityAtPreferredStoreText,\n props.resources.inStockText,\n props.resources.outOfStockText,\n props.telemetry\n ]);\n\n React.useEffect(() => {\n if (props.config.displayStockAvailability) {\n getInventory().catch((error: Error) => {\n props.telemetry.error(error.message);\n });\n }\n }, [getInventory, isStoreChange, props.telemetry, props.config.displayStockAvailability]);\n\n reaction(\n () => props.data.storeSelectorStateManager.result?.selectedStoreLocationId,\n () => {\n setIsStoreChange(true);\n }\n );\n\n /**\n * RenderAvailabiltyAtPreferredStore.\n * @returns -- Returns.\n */\n const renderAvailabilityAtPreferredStore = (): JSX.Element | undefined => {\n const hasProductDimensions = ArrayExtensions.hasElements(props.data.product.result?.Dimensions);\n if (hasProductDimensions && props.data.product.result?.MasterProductId === undefined) {\n return undefined;\n }\n const containerProps: INodeProps = {\n className: 'ms-buybox__preferred-store-availability',\n tag: 'span'\n };\n\n return <Node {...containerProps}>{availability}</Node>;\n };\n return (\n <Module {...ModuleProps}>\n <Node {...MediaGalleryContainerProps}>{props.mediaGallery}</Node>\n <Node {...ProductInfoContainerProps}>\n {catalogs && catalogs[0].Name}\n {title}\n <Node className='msc-buybox__ratings-section'>\n <div className='msc-buybox__ratings-section-sku-text'>{skuText}</div>\n {rating}\n </Node>\n <Node className='msc-buybox__price-section'>\n <div className='msc-buybox__price-section-text'>{props.resources.priceText}</div>\n {price}\n </Node>\n {configure && renderConfigure(configure)}\n {keyInPrice && renderKeyInPrice(keyInPrice)}\n <Node className='msc-buybox__bulk-purchase-section'>\n <div className='msc-buybox__bulk-purchase-button-text'>\n {quantity &&\n renderQuantity(\n quantity,\n callbacks,\n props,\n state,\n resources,\n quantityLimitsMessages,\n min,\n max,\n applyDefaultOrderSettings,\n telemetryContent,\n unitOfMeasure\n )}\n {props.bulkPurchaseLink}\n </div>\n </Node>\n {props.config.displayStockAvailability && preferredStoreId && renderAvailabilityAtPreferredStore()}\n {inventoryLabel}\n {renderAddToCart(addToCart)}\n {findInStore && renderFindInStore(findInStore)}\n {addToWishlist && renderAddToWishlist(props, state, callbacks)}\n {productComparisonButton}\n {addToOrderTemplate && renderAddToOrderTemplate(props, state, callbacks)}\n {findInStore?.productPickupOptionList ? (\n <div className='msc-buybox__pickup-options'>{findInStore.productPickupOptionList}</div>\n ) : null}\n {_renderSocialShare(props.slots && props.slots.socialShare)}\n <div className='msc-buybox__description-text'>{props.resources.shopText}</div>\n <Node className='msc-buybox__shop-description'>\n {shopSimilarLook && renderShopSimilarItem(shopSimilarLook)}\n {shopSimilarDescription && renderShopSimilarItem(shopSimilarDescription)}\n </Node>\n <Node className='msc-buybox__description-section'>\n <div className='msc-buybox__description-section-text'>{props.resources.descriptionText}</div>\n {description}\n </Node>\n {ArrayExtensions.hasElements(props.slots.productSpecification) ? (\n <Node className='msc-buybox__product-specification'>{props.slots.productSpecification[0]}</Node>\n ) : null}\n </Node>\n </Module>\n );\n};\n\nexport default BuyboxView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToWishlistComponent, IWishlistActionErrorResult } from '@msdyn365-commerce/components';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n getConfigureErrors,\n IBuyboxAddToCartViewProps,\n IBuyboxCallbacks,\n IBuyboxCommonResources,\n IBuyboxKeyInPriceViewProps,\n IBuyboxProductConfigureDropdownViewProps,\n IBuyboxProductConfigureViewProps,\n IBuyboxProductQuantityViewProps,\n IBuyboxState,\n IQuickviewViewProps\n} from '@msdyn365-commerce-modules/buybox';\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { IModuleProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickviewProps as IQuickviewPropsExtend } from '../definition-extensions/quickview.ext.props.autogenerated';\n\n/**\n * RenderAddToCart.\n * @param addToCart - AddToCart.\n * @returns -- Returns.\n */\nconst renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n const { ContainerProps, errorBlock, button } = addToCart;\n\n return (\n <Node {...ContainerProps}>\n {errorBlock}\n {button}\n </Node>\n );\n};\n\n/**\n * Add to wishlist failed function.\n * @param callbacks -Buybox callbacks.\n * @param resources -Buybox resources.\n * @param product -Simple product.\n * @returns Update error state.\n */\nconst onAddToWishlistFailed = (\n callbacks: IBuyboxCallbacks | undefined,\n resources: IBuyboxCommonResources,\n product: SimpleProduct | undefined\n) => (result: IWishlistActionErrorResult) => {\n callbacks?.updateErrorState({\n errorHost: 'WISHLIST',\n configureErrors:\n result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\n });\n};\n\n/**\n * RenderAddToWishlist.\n * @param props - Buybox viewprops.\n * @param state - Buybox state.\n * @param callbacks - Buybox callbacks.\n * @param product - Product data.\n * @returns -- Returns.\n */\nconst renderAddtoWishlistButton = (\n props: IQuickviewViewProps,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks | undefined,\n product: SimpleProduct\n): React.ReactNode => {\n const { context, resources } = props;\n const wishlists = props.data.wishlists.result;\n const isShowWishlitButtonText = true;\n return (\n <AddToWishlistComponent\n className='msc-add-to-cart-extra-actions'\n addToWishlistButtonText={resources.addToWishlistButtonText}\n removeFromWishlistButtonText={resources.removeFromWishlistButtonText}\n addToWishlistMessage={resources.addToWishlistMessage}\n removedFromWishlistMessage={resources.removedFromWishlistMessage}\n addItemToWishlistError={resources.addItemToWishlistError}\n removeItemFromWishlistError={resources.removeItemFromWishlistError}\n nameOfWishlist={resources.nameOfWishlist}\n data={{ product, wishlists }}\n context={context}\n id={props.id}\n typeName={props.typeName}\n onError={onAddToWishlistFailed(callbacks, resources, product)}\n getSelectedProduct={state.selectedProduct}\n showButtonText={isShowWishlitButtonText}\n showButtonTooltip={false}\n />\n );\n};\n\n/**\n * RenderAddToWishlist.\n * @param props - Buybox viewprops.\n * @param state - Buybox state.\n * @param callbacks - Buybox callbacks.\n * @returns -- Returns.\n */\nconst renderAddToWishlist = (\n props: IQuickviewViewProps,\n state: IBuyboxState,\n callbacks: IBuyboxCallbacks | undefined\n): JSX.Element | null => {\n const product = props.productDetails?.product;\n if (!props.addToWishlist || !product) {\n return null;\n }\n\n const wishlistButton = renderAddtoWishlistButton(props, state, callbacks, product);\n return (\n <Node {...props.addToWishlist.ContainerProps}>\n {props.addToWishlist.errorBlock}\n {wishlistButton}\n </Node>\n );\n};\n\n/**\n * RenderQuantity.\n * @param quantity - Quantity.\n * @param quantityLimitsMessages - QuantityLimitsMessages.\n * @param props - Props.\n * @returns -- Returns.\n */\nconst renderQuantity = (\n quantity: IBuyboxProductQuantityViewProps,\n quantityLimitsMessages: React.ReactNode,\n props: IQuickviewViewProps\n): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n const { ContainerProps, LabelContainerProps, heading, input, errors } = quantity;\n const { unitOfMeasure } = props;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {input}\n {unitOfMeasure}\n {quantityLimitsMessages}\n {errors}\n </Node>\n );\n};\n\n/**\n * KenderKeyInPrice.\n * @param keyInPrice - KeyInPrice.\n * @returns -- Returns.\n */\nconst renderKeyInPrice = (keyInPrice: IBuyboxKeyInPriceViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n const { ContainerProps, LabelContainerProps, heading, input } = keyInPrice;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {input}\n </Node>\n );\n};\n\n/**\n * RenderConfigureDropdown.\n * @param dropdown - Buybox product configure dropdown view props.\n * @returns -- Returns JSX.Element.\n */\nconst renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\n const { ContainerProps, LabelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...ContainerProps}>\n <Node {...LabelContainerProps}>{heading}</Node>\n {select}\n {errors}\n </Node>\n );\n};\n\n/**\n * RenderConfigure.\n * @param configure - Buybox product configure view props.\n * @returns -- Returns JSX.Element.\n */\nconst renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\n const { ContainerProps, dropdowns } = configure;\n\n return <Node {...ContainerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n};\n\n/**\n * RenderBodyContent.\n * @param props - Props.\n * @returns -- Returns.\n */\nconst renderBodyContent = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>): JSX.Element => {\n const {\n price,\n keyInPrice,\n quantity,\n inventoryLabel,\n quantityLimitsMessages,\n loading,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n ProductInfoContainerProps,\n MediaGalleryContainerProps,\n CarouselProps,\n addToWishlist,\n configure,\n callbacks,\n state\n } = props;\n if (loading) {\n return <>{loading}</>;\n }\n\n return (\n <>\n <Node {...MediaGalleryContainerProps}>\n <Node {...CarouselProps} />\n </Node>\n <Node {...ProductInfoContainerProps}>\n <Node className='msc-quickview__price-section'>\n <Node className='msc-quickview__price-section-text'>\n {props.resources.priceText}\n {price}\n </Node>\n {addToWishlist && renderAddToWishlist(props, state, callbacks)}\n </Node>\n {configure && renderConfigure(configure)}\n {keyInPrice && renderKeyInPrice(keyInPrice)}\n {quantity && renderQuantity(quantity, quantityLimitsMessages, props)}\n {inventoryLabel}\n </Node>\n </>\n );\n};\n\n/**\n * RenderQuickViewPopup.\n * @param props - Props.\n * @returns -- Returns.\n */\nconst renderQuickViewPopup = (props: IQuickviewViewProps & IQuickviewPropsExtend<{}>): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from Quickview.tsx file\n const {\n ModalContainer,\n ModalHeaderContainer,\n ModalFooterContainer,\n ModalHeaderContent,\n ModalBodyContainer,\n addToCart,\n cartContainerProps,\n seeDetailsbutton\n } = props;\n\n return (\n <Module {...ModalContainer}>\n <Node {...ModalHeaderContainer}>\n {ModalHeaderContent}\n <Node className='msc-quickview__heading'>\n {props.title}\n {!props.loading && !StringExtensions.isNullOrEmpty(props.state.productPrice?.ItemId) ? (\n <Node className='msc-quickview__sku-text'>\n {props.resources.skuText}\n {props.state.productPrice?.ItemId}\n </Node>\n ) : (\n ''\n )}\n {props.rating}\n </Node>\n </Node>\n <Node {...ModalBodyContainer}>{renderBodyContent(props)}</Node>\n <Node {...ModalFooterContainer}>\n <Node {...cartContainerProps}>\n {addToCart && seeDetailsbutton}\n {addToCart && renderAddToCart(addToCart)}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Functional component which renders quick view button and popup based by the given props file.\n * @param props - Configuration for the quick view component.\n * @returns - Functional component of the quick view.\n */\nexport const QuickViewFunctionalComponent: React.FC<IQuickviewViewProps & IQuickviewPropsExtend<{}>> = (\n props: IQuickviewViewProps & IQuickviewPropsExtend<{}>\n) => {\n const { quickView, quickViewButton, isModalOpen } = props;\n const quickViewUpdatedProps: IModuleProps = { ...quickView, title: props.resources.quickViewbuttonText };\n return (\n <Module {...quickViewUpdatedProps}>\n {quickViewButton}\n {isModalOpen && renderQuickViewPopup(props)}\n </Module>\n );\n};\n\nexport default QuickViewFunctionalComponent;\n"],"names":["LoginToViewPricingComponent","context","loginText","priceComponent","shouldBlockPricing","className","arguments","length","undefined","user","signInUrl","isAuthenticated","React","href","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","_objectSpread","rangeStart","RightValueBoundString","rangeEnd","push","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","constructor","props","super","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","target","currentTarget","clearAll","getAttribute","includes","selectedRefiner","this","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","telemetryContent","selectedRefinersMap","_this$props$context","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","app","config","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","filter","choice","parent","hierarchy","value","RecordId","map","key","_getKeyForRefinerValue","render","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","items","contentAction","etext","clearAllAttributes","getTelemetryAttributes","classnames","item","attribute","Object","assign","urlBuilder","onClick","role","choiceFormat","choiceRangeValueFormat","telemetry","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","warning","replace","_formatPrice","UnitText","LeftValueBoundLocalizedString","amount","currency","trace","result","cultureFormatter","formatCurrency","Number","error","selected","textContent","trim","__decorate","computed","observer","ErrorMessage","_ref","text","FeatureSearchResultItem","product","imageSettings","resources","recommendation","productName","Name","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","requestContext","apiSettings","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","request","PrimaryImageUrl","title","Link","ariaLabel","ModalToggle","innerRef","id","ref","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","Button","modalCloseButtonText","getInventoryLabel","ArrayExtensions","hasElements","AttributeValues","inventoryAttribute","TextValue","ProductSearchResultItems","products","moduleType","moduleId","allowBackNavigation","quickviewSlot","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","index","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","data","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","state","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","setState","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","event","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","input","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","_this$props","productCountAriaLabel","singleProductCountAriaLabel","children","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","Rating","_renderRating","productText","productCount","Count","refineMenuItemAriaLabel","format","_getRefinerUrl","tabIndex","_renderSwatch","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","dimensionType","toLocaleLowerCase","hasColor","StringExtensions","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","swatchItems","checkIfShouldDisplayAsSwatch","itemId","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","isMobile","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","_props$context$reques","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","catalogId","getCatalogId","isListPageStateUpdated","_updateListPageState","listPageState","_this$props$context$r","_this$props$config$it","_this$props$config$it2","_this$props$context$r2","querySorting","query","sorting","parse","decodeURIComponent","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","totalProductCount","count","activeFilters","hydrateRefinersFromUrl","productId","featureProduct","_getProductsDimensionsAvailabilities","async","_this$props$data$list","_this$props$data$list2","productsList","activeProducts","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","q","category","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","telemetryPageName","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","skipCount","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod","_this$props$data$prod2","inventoryAwareSortableAttributeId","_getChoiceSummary","_this$props$data$prod3","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$slots","_this$props$data$feat","_this$props$data$prod4","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","slots","quickview","isPriceMinMaxFeatureState","featureState","IsEnabled","notification","window","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","option","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","validValues","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","_this$props$data$list6","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","device","Type","_updateViewport","productPrices","pending","validationErrorNotNumber","validationErrorNotRange","getTelemetryObject","friendlyName","static","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","MsDyn365","isBrowser","addEventListener","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","_this$props$context$a","newListPageState","GetFullProductsByCollectionInput","Paging","Top","Skip","Math","Sorting","recordId","ProductId","Recommendation","includeAttributes","productResults","getCollectionProducts","enableAffiliationBasedPricing","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r6","_this$props$context$r7","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","componentWillUnmount","removeEventListener","_listPageState$result","_listPageState$result2","_this$props$context$r8","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","renderView","_getViewport","variant","VariantType","Browser","Viewport","observable","action","DescriptionInterval","renderProductCards","_props$data$listPageS","Node","renderProductCardsDescription","isEnabledProductDescription","_props$data$products$","_props$data$featureSt","isAllowBack","classname","quickviewslot","loginToViewPricingText","loginToViewPricing","renderProducts","_props$data$listPageS2","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","renderTitleCount","renderCategoryHierarchy","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","submenu","renderRefinerMobile","renderRefiner","renderTitle","productCardimageSettings","fallbackImageUrl","viewports","lg","h","w","md","sm","xs","image","cropFocalRegion","getProductPrice","pricing","productRecId","pr","_props$context$action","filterText","partNoHeading","descriptionHeading","availabilityHeading","listPriceHeading","yourPriceHeading","goToCartText","continueShoppingText","addToCartModalHeading","addToCartText","cart","productSearchResults","enableProdutDescription","listView","eligbilityList","setEligbilityList","useState","_props$data$products","_cart$result","itemIds","p","GetProductEligibilityInput","Id","eligibilityData","GetProductEligibilityAction","i","getExtensionPropertyValueByKey","ExtensionProperties","CommercePropertyValueEnum","string","IsEligible","getProductEligibility","setIsExpanded","modalOpen","setModalOpen","addedProduct","setAddedProduct","productPricing","setProductPricing","handleAddToCart","quantity","_productSearchResults","_cart$result2","foundProduct","BasePrice","Price","AdjustedPrice","ProductTypeValue","addProductToCart","then","response","status","addToCartBehavior","getProductSupersessionProperty","extensionKey","properties","_properties$find","Key","Value","StringValue","Module","Popup","price","component","productQuantity","navigationUrl","getUrlSync","dialogStrings","headerItemOneText","headerItemFormatText","headerMessageText","_renderProductsListView","_props$data$cart$resu2","_productSearchResults2","courseInCartText","courseId","cartlines","CartLines","Table","SupersessionKey","SupersededId","SupersededName","Inventory","renderAddtoCartButton","_props$data$cart$resu","hasInvoiceLine","invoiceInCartText","AddToCartListComponent","onAddToCart","addToCartButtonText","colSpan","style","textAlign","productEligibilityText","setModalProps","generateAddToOrderTemplateDialogResources","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","generateOrderTemplateNameDialogResources","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","onAddToOrderTemplateFailed","callbacks","updateErrorState","errorHost","configureErrors","getConfigureErrors","missingDimensions","IsGiftCard","BuyBoxConstants","onChangeHandler","newValue","updateQuantity","renderAddToOrderTemplate","addToOrderTemplate","orderTemplateButton","renderAddToOrderTemplateButton","orderTemplates","customerInformation","AddToOrderTemplateComponent","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","onError","shouldShowButtonFailedTooltip","isCustomPriceSelected","showButtonTooltip","showButtonText","ContainerProps","errorBlock","onAddToWishlistFailed","renderAddToWishlist","addToWishlist","wishlistButton","renderAddtoWishlistButton","wishlists","AddToWishlistComponent","addToWishlistButtonText","removeFromWishlistButtonText","addToWishlistMessage","removedFromWishlistMessage","addItemToWishlistError","removeItemFromWishlistError","nameOfWishlist","ariaRole","getSelectedProduct","selectedProduct","renderShopSimilarItem","shopSimilarItem","errors","renderConfigureDropdown","dropdown","LabelContainerProps","select","_props$data$product$r","_props$data$storeSele","_props$data$product$r4","_enhancedDescription$","ModuleProps","MediaGalleryContainerProps","ProductInfoContainerProps","addToCart","configure","findInStore","rating","shopSimilarLook","keyInPrice","shopSimilarDescription","unitOfMeasure","productUnavailableText","enhancedDescription","quantityLimitsMessages","onlyShowPriceWhenAuthenticated","enableShopSimilarDescription","enableShopSimilarLooks","appConfig","skuText","preferredStoreInfo","storeSelectorStateManager","preferredStore","preferredStoreId","StoreId","preferredStoreName","StoreName","availability","setAvailability","isStoreChange","setIsStoreChange","areInventoryRangesChecked","setAreInventoryRangesChecked","inventoryRangesList","setInventoryRangesList","_props$data$product$r2","resp","getInventoryLevelRangesAsync","callerContext","console","log","getInvProfs","shouldShowShopOptions","getInventory","_props$data$product$r3","GetFullAvailableInventoryNearbyInput","zero","getFullAvailableInventoryNearby","catch","message","_preferredStoreAvaila","isPreferredStore","_value$OrgUnitAvailab","OrgUnitAvailability","OrgUnitLocation","OrgUnitNumber","filteredFullOrgUnitAvailability","preferredStoreAvailability","stockStatusLabel","availabilityWithHours","ProductInventoryInformation","productInventoryInformation","_availabilityWithHour","InventoryLocationId","InventLocationId","StockLevelLabel","getStockInventoryLabel","resourceLabel","itemAvailabilities","ItemAvailabilities","enableStockCheck","AvailableQuantity","inStockText","outOfStockText","stockText","preferredStoreAvailabilityText","availabilityAtPreferredStoreText","displayStockAvailability","_props$data$storeSele2","selectedStoreLocationId","mediaGallery","priceText","dropdowns","renderConfigure","renderKeyInPrice","renderQuantity","quantityComponent","extentionResources","IncrementalQuantity","currentCount","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","minQuantityText","maxQuantityText","bulkPurchaseLink","renderAvailabilityAtPreferredStore","_props$data$product$r5","_props$data$product$r6","Dimensions","renderAddToCart","unavailableText","button","_invProfOos","_invProfOos2","invPropertyValue","currentInvString","currentInventory","invProfOos","ir","_ir$Profile","tempInvRange","Profile","Code","isOutOfStock","hasOwnProperty","UpperBoundInclusive","storeSelector","description","productPickupOptionList","renderFindInStore","socialShare","_renderSocialShare","shopText","descriptionText","RichTextComponent","productSpecification","_renderLoginURL","setQuantity","type","valueAsNumber","getDefaultColorSwatchSelected","productData","_colorAttribute$Swatc","_colorAttribute$Swatc2","_colorAttribute$Swatc3","colorAttribute","attributeValue","_attributeValue$KeyNa","color","defaultSwatch","Swatches","IsDefault","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","search","pathname","renderProductUnitOfMeasure","renderLabel","name","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","roundedRating","toFixed","renderPrice","basePrice","adjustedPrice","savingsText","CustomerContextualPrice","PriceComponent","msdyn365Commerce","createComponentOverride","_product$Name","_product$RecordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","MIN_VALUE","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","updatePageAndImageUrl","swatchItem","setValue","productPageUrlWithSwatch","newUrl","searchParams","delete","swatchProductImageUrl","productImageUrls","newImageUrl","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","AverageRating","TotalRatings","DefaultUnitOfMeasure","Description","attributeValues","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","dimensionTypeValue","shouldDisplayDimension","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","isDefault","_swatchItem$SwatchVal3","some","swatch","ProductComponentSwatchComponent","onSelectDimension","totalRatings","numberRatings","renderRating","inventoryAvailabilityLabel","selectedDimensions","getValues","DimensionTypeValue","convertDimensionTypeToProductDimensionType","DimensionValue","selectedProductId","renderQuickView","_props$productDetails","productDetails","renderBodyContent","loading","CarouselProps","renderQuickViewPopup","_props$state$productP","_props$state$productP2","ModalContainer","ModalHeaderContainer","ModalFooterContainer","ModalHeaderContent","ModalBodyContainer","cartContainerProps","seeDetailsbutton","isNullOrEmpty","productPrice","QuickViewFunctionalComponent","quickView","isModalOpen","quickViewUpdatedProps","quickViewbuttonText","quantityHeading","configurationObject","_configurationObject$","valueType","property","supersessionLabel","eligbility","setEligbility","isProductAvailable","setIsProductAvailable","getProductAvailability","availableQuantities","productAvailableQuantity","isStockAvailable","IsProductAvailable","cartLines","hasCourse","hasInvoice","c","hasCourseErr","courseErr","invoiceErr","_renderSupersessionData","_product$result","productExtensionProperties","supersededName","supersededId","ep","_ep$Value","_product$result2","_ep$Value2","_product$result3","getBuyBoxInventoryLabel","stockLevelLabel","titleProps","enableSearchWrap","location","link","has","refineResultsText","append","expandResultsText","notFindingText","renderExpandOrRefineResults","loginToViewPricingAndAvailabilityText","supersededFromText","priceAndAvailabilityHeading","manufacturerCodes","searchTerm","codes","matchedProducts","unmatchedProducts","_p$ItemId","_p$ItemId2","matched","substring","GDNManufacturerCode","isEligibilityChecked","setEligibilityChecked","_props$data$products2","IsAssorted","_props$data$cart$resu3","_productSearchResults3","BulkPurchase","_errorCssClass","_errorCssGlyphClass","collapseRef","_dimensionDropDownChange","_this$collapseRef$cur","reEvaluateHeight","_onErrorMessage","stateMessage","messageText","statusCssString","messageGlyph","_toggleCollapse","hasDimensionsInProps","productDimensions","hasDimensionsInData","viewProps","container","content","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","isMobileDevice","userMessageNode","Alert","bulkPurchaseDescriptionText","_renderMatrix","_featureState$result","_this$props$data$orde","_this$props$data$cust","isMultipleCatalogsFeatureEnabled","validateCatalogId","ProductDimensionsMatrix","dimensions","dimensionOnChange","onErrorMessage","isMultipleCatalogFeatureEnabledInHq","_getClassNamePrefix","_props$data$productAv","_props$data$productAv2","shippingInventory","shipping","deliveryType","DeliveryMode","inventoryClassName","StockLevelCode","getBuyboxProductTitle","_props$data$product","titleHeadingTag","Heading","headingTag","getBuyboxProductDescription","_props$data$product2","getBuyboxProductUnitOfMeasure","_props$data$product3","onAddToCartFailed","defaultMinimumKeyInPrice","defaultMaximumKeyInPrice","productAvailability","quantityErrorForState","customAmountErrorForState","otherErrorForState","getGenericError","failureReason","getQuantityError","stockLeft","cartActionResult","substatus","keyInPriceAmount","minimumKeyInPrice","formatedAmountLimit","invalidSmallCustomAmountText","maximumKeyInPrice","invalidLargeCustomAmountText","quantityError","customAmountError","otherError","onItemAddedToCart","changeModalOpen","getBuyboxAddToCart","hasAvailableProducts","_props$data$product4","_props$data$cart","_props$data$productAv3","_props$data$productAv4","_props$data$deliveryO","_props$data$deliveryO2","errorState","isUpdatingDimension","isUpdatingDeliveryOptions","isServiceItem","ProductAvailableQuantity","buyBoxGoToCartText","buyBoxContinueShoppingText","closeNotificationLabel","buyBoxSingleItemText","buyBoxMultiLineItemFormatText","buyBoxHeaderMessageText","addedQuantityText","isProductQuantityLoading","changeUpdatingDimension","isLoadingDeliveryOptions","deliveryOptions","changeUpdatingDeliveryOptions","emailDeliveryModeCode","channel","EmailDeliveryModeCode","productDeliveryOptions","isEmailDelivery","DeliveryOptions","enableHidePdpRepeatingErrors","features","AddToCartComponent","disabled","xl","lazyload","isAddServiceItemToCart","isPriceKeyedIn","customPriceAmount","isOrderQuantityLimitsFeatureEnabled","_isOrderQuantityLimitsFeatureEnabled","_isChannelLimitsFeatureEnabled","isAddEmailDeliveryItemToCart","onAdd","isNavigationToCartPageDisabled","BuyboxErrorBlock","showError","getBuyboxProductPrice","_props$data$product5","_props$data$featureSt2","isSalesAgreementPriceFeatureEnabled","salesAgreementPricePrompt","salesAgreementExpirationDatePrompt","salesAgreementCommittedQuantityPrompt","salesAgreementRemainingQuantityPrompt","getBuyboxProductRating","_props$data$ratingsSu","_props$data$ratingsSu2","ratingsSummary","averageRating","averageRatingAriaLabel","reviewsCount","getBuyboxProductAddToOrderTemplate","_props$data$product6","getBuyboxProductComparisonButton","productComparisonButton","getBuyboxProductAddToWishlist","_props$data$product7","onQuantityChangeHandler","getBuyboxProductQuantity","htmlFor","productQuantityHeading","Quantity","getBuyboxShopSimilarButton","buttonType","_props$data$product8","telemetryText","ShopSimiliarButtonType","Looks","TelemetryConstant","ShopSimliarLooks","ShopSimliarDescription","shopSimilarLooksText","shopSimilarDescriptionText","shopSimiliarButtonType","searchURL","onPriceChangeHandler","updateKeyInPrice","parseFloat","getBuyboxKeyInPrice","buyboxKeyInPriceLabelHeading","errorMessages","values","assertive","buyboxErrorMessageHeader","getQuantityLimitsMessages","_renderMaxLabel","_renderMinLabel","RetailDefaultOrderQuantityLimitsFeatureName","EcommerceQuantityLimitConfigurationsFeatureName","RevertToSiteBuilderOrderQuantityLimitsSettingsCRTFeatureName","MAX_VALUE","informationIconText","_featureStatuses$find","_featureStatuses$find2","featureStatuses","_props$context","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","IsB2b","_props$data$cartConfi","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_featureStatuses$find3","isChannelLimitsFeatureEnabledInHq","getBuyboxProductConfigure","_props$data$productDi","_props$data$productDi2","getDropdownName","productDimensionsData","hasProductDimensions","onChanged","_onChanged","dimensionSelectedAsync","onInitializedDimension","_onInitializedDimension","initializeDimension","inventoryLevel","dimensionsInfo","productDimensionFull","_productDimensionFull","dropdownName","dropdownList","dimensionValuesWithInventory","DimensionValues","_value$DimensionValue","_value$DimensionValue2","ObjectExtensions","isNullOrUndefined","_dimensionValuesWithI","_dimensionValue$Value","dimensionValue","inventoryLevelCode","getInventoryLevelCodeFromDimensionValue","ColorHexCode","ImageUrl","InventoryLevelValues","outOfStock","matchedDimensions","getDimensionValuesFromQuery","requestUrl","dimensionInfo","currentDimensionsFromQuery","dimensionFromQuery","currentDimensionFromQuery","selectedDimensionItem","dimensionItem","_currentDimensionFrom","dimensionId","dropdownToggleName","selectDimensionFormatString","dimensionSelectionType","SelectionType","convertProductDimensionTypeToDimensionTypes","dimensionsAsSwatchConfiguration","Dropdown","dropdownCallback","onInitialize","initializeCallback","selectionType","mapProductDimensionFullToDropdownViewProps","dimensionChanged","selectId","initializedDimension","selectMenu","_selectSwatch","selectedIndex","innerText","selectedItem","_renderDropdown","hidden","onSelectItem","errorMessageOutOfStock","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","addedToCartFailureMessage","_result$cartActionRes2","_result$cartActionRes","elementFoundAt","productIdToFind","FulfillmentStoreId","getElementIndex","currentQuantity","_cartLineToUpdate$Qua","cartLineToUpdate","quantityLimit","maxQuantityForCartLineItem","availableQty","getQuantityLimit","maxQuantityLimitText","validationResults","_item$ErrorContext","LocalizedMessage","ErrorContext","ErrorResourceId","errorDetails","isGiftCard","dimension","getDimensionErrorString","productDimensionTypeColorErrorMessage","productDimensionTypeConfigurationErrorMessage","productDimensionTypeSizeErrorMessage","productDimensionTypeAmountErrorMessage","productDimensionTypeStyleErrorMessage","modalCloseButtonReference","onClickFindInStoreHandler","_props$data","modules","dataProduct","multiplePickupStoreSwitchName","retailMulitplePickupMFeatureState","storeSelectorId","keys","openDialog","parentElementRef","onLocationSelected","orgUnitLocation","deliveryMode","Promise","resolve","behavior","pickup","failureResult","AddToCartBehavior","goToCart","showModal","showNotification","_props$data$productPr2","defaultImageSettings","ItemSuccessfullyAddedToCartNotification","NotificationsManager","instance","addNotification","exception","debug","findInStoreOnClick","getBuyboxFindInStore","_data$product","_data$productPrice","_data$cart","_data$deliveryOptions","_data$productAvailabl","_data$featureState","_data$channelDelivery","_product$Dimensions","_props$data$productPr","findInStoreHeaderText","descriptionTextToShowAllPickupOptions","PickupDeliveryModeCode","channelDeliveryOptionConfig","_dimension$DimensionV","isSectionDisabled","buttonText","isStockCheck","buyboxResources","isLoading","pickupInventory","findInStoreLinkText","findInStoreDescriptionText","isAggregatedInventory","_pickupInventory","findInStoreNotAvailableTextButton","findInStoreNotAvailableDescription","getFindInStoreInventorySettings","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","deliveryOption","delivery","deliveryCode","PickupDeliveryModeCodes","popupProps","renderModalPopup","openFindInStoreDialog","Buybox","dimensionUpdateQueue","FinitePromiseQueue","initializedDimensions","Set","buyboxCallbacks","newQuantity","newErrorState","updateSelectedProduct","newSelectedProduct","newInventory","newPrice","newDeliveryOptions","_updatePrice","add","selectedDimensionId","selectedDimensionValueId","size","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","_getDropdownName","customPrice","_onBulkPurchaseLinkClick","bulkPurchaseModule","boundingRect","getBoundingClientRect","scrollX","left","pageXOffset","scrollY","top","pageYOffset","scrollTo","_isChannelMultipleCatalogsFeatureEnabled","feature","dimensionsToUpdate","clearErrorState","previousState","_getProductVariant","productVariant","productVariantPromise","promises","_getDimensionsForSelectedVariant","mappedDimensions","_hydrateInventoryInfo","_hydratePrice","_hydrateDeliveryOptions","_updateQuantitiesInState","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeAmount","productDimensionTypeStyle","isPriceApiCalled","ItemTypeValue","ReleasedProductType","Service","maxRecentlyViewedItemsCount","RecentlyViewedState","_this$props$data$feat2","_this$props$data$feat3","_this$props$data$cart","_this$props$data$cart2","flatten","applyDefaultOrderSettings","ValidateDefaultOrderSettingsPerLine","_renderBuyboxBulkPurchaseLink","enableKeyInPrice","isChannelMultipleCatalogsFeatureEnabled","currentCatalogId","catalogs","_validateCatalogDetails","isBulkPurchaseEnabled","bulkPurchaseModules","Array","from","getElementsByClassName","bulkPurchaseLinkText","channelId","_dimension$dimensionV","_dimensions$find$Dime","_dimensions$find","setDimensionValuesToQuery","selectedProductPromise","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","_productVariant$Dimen","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","newShippingQuantity","getPriceForSelectedVariant","PriceForSelectedVariantInput","_this$props$data$feat4","retailMultiplePickupFeatureState","getDeliveryOptionsForSelectedVariant","GetDeliveryOptionsForSelectedVariantInput","isChannelLimitsFeatureEnabled","_getMinQuantityForCartLineItem","_getMaxQuantityForCartLineItem","_getQuantity","_product$Behavior","_getIgnoreOrderSettings","Behavior","MinimumQuantity","isQuantityLimitsFeatureEnabled","_product$Behavior2","MaximumQuantity","updateMaxQuantityForCartLineItem","_cartConfiguration$re","_cartConfiguration$re2","_cartConfiguration$re3","_cartConfiguration$re4","_product$Behavior3","defaultQuantity","DefaultQuantity","information","_this$props$data$cata","_renderAddToCart","_renderAddToOrderTemplate","_renderAddToWishlist","_renderConfigure","_renderConfigureDropdown","_renderFindInStore","_renderQuantity","_renderKeyInPrice","_renderShopSimilarItem","getAltText","shouldUseCmsAltText","imageAltText","_context$app","OmniChannelMedia","getValidProductImages","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","mediaLocations","mediaLocation","imageData","Uri","AltText","http","XMLHttpRequest","open","send","_unused","validateMediaLocaionAsync","pairs","pair","Quickview","quickViewCallbacks","_this$productDetails","_hideQuickViewDialog","defaultGalleryImageSettings","defaultThumbnailImageSettings","_renderSeeDetailButton","seeDetails","attributes","seeDetailsLinkText","_getProductURL","_renderCarousel","_this$state$activeInd","mediaGalleryItems","galleryImageSettings","_renderCarouselItemImageView","_renderEmptyImage","Carousel","activeIndex","previous","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","indicatorAriaText","ariaLabelForSlide","onIndicatorsClickHandler","goToIndex","handleOnExited","onExited","handleOnExiting","onExiting","_renderThumbnails","thumbnailImageSettings","_getThumbnailItem","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","useTabList","_updateDimensionValue","newProduct","variantProduct","_variantProduct$Dimen","images","getImagesForProduct","_filterMasterImageFromVariant","lastUpdate","Date","now","RetailMulitplePickupMFeatureState","altTextSource","newValueId","_this$productDetails2","animating","isLastItem","nextIndex","isFirstItem","_getCarouselItem","modifiedActiveIndex","ThumbnailItemContainerProps","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","which","KeyCodes","Enter","Space","onClickHandler","_event","ctx","tenantId","getRnrPartnerId","serviceEndPoint","getRnrEndpointId","productResult","productAvailabilities","getCartStateData","GetCartStateDataInput","cartState","getRatingsSummary","GetRatingsSummaryInput","ratingsSummaryData","getProductDetails","currentTime","_updateMediaItems","getDeliveryOptionsAsync","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","isDataLoaded","_product$productVaria","_this$props$config$th","_product$productVaria2","_actionContext$reques","params","isPreview","commerceApiRequest","previewImageData","_mediaLocation$Uri","additionalProperties","IsApplicableForChildEntities","isApplicableForChildEntities","_mediaLocation$Uri2","getProductImages","_quickViewCloseButtonclick","_this$productDetails3","_this$productDetails4","viewprops","quickViewAriaLabel","modalTransition","shouldUpdateFocusToFirstElement","Spinner","loadingText","SpinnerSize","large","Thumbnails","lastUpdatedTime","_this$productDetails5","_mapProductToImageData","_dimension$DimensionV2","dimensionName","set","_this$props$config$sh","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","_item$additionalPrope","_renderQuickViewPopup","_renderBodyContent","RecentlyViewedProductItem","getItemId","_len","_key","_recentlyViewedItems","cookieContext","cookies","_retrieveItemsFromCookies","object","indexOf","slice","_writeToCookie","_recentlyViewedLocalStorageKey","_readFromCookie","cookieKey","isConsentGiven","secure","maxAge","enableWishlist"],"sourceRoot":""}