{"version":3,"file":"static/js/f26feb3dd66611f1eed4.bundle.js","mappings":"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","sources":["webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/choice-summary.component.tsx?70ed","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/common/constants.ts?7326","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/common/utilities.ts?3aff","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/feature-search-result-item.component.tsx?750b","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/product-search-result-items.component.tsx?5da7","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/range-refine-input-item.component.tsx?4bd4","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/range-refine-slider-item.component.tsx?5c19","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/refine-rating-item.component.tsx?2b21","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/refine-submenu.component.tsx?f1a6","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/refiner-item.component.tsx?3508","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/search-result-container-v2/components/utilities.ts?0bca","webpack://@msdyn365-commerce-partners/fabrikam/./src/modules/adventureworks/views/components/product-v2.component.tsx?d155"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemData, isRangeType } from './common';\n\n/**\n * IChoiceSummaryClickNotification Interface.\n */\nexport interface IChoiceSummaryClickNotification {\n selectedRefineItem: IRefineItemData | undefined;\n shouldClearAll: boolean;\n nextItemToFocus: HTMLElement | undefined;\n}\n\n/**\n * IChoiceSummaryComponent Interface.\n */\nexport interface IChoiceSummaryComponent extends IComponent {}\n\n/**\n * IChoiceSummaryData interface.\n */\nexport interface IChoiceSummaryData {\n selectedChoices: IRefineItemData[];\n}\n\n/**\n * IChoiceSummaryProps Interface.\n */\nexport interface IChoiceSummaryProps extends IComponentProps {\n className?: string;\n clearAllText?: string;\n label?: string;\n choiceAriaLabel?: string;\n choiceFormat?: string;\n closeAriaLabel?: string;\n telemetryContent?: ITelemetryContent;\n choiceRangeValueFormat?: string;\n formatPrice(amount: string | undefined, currencyCode: string | undefined): string;\n onChoiceItemClicked(notification: IChoiceSummaryClickNotification): void;\n urlBuilder(isClearAll: boolean, selectedRefiner?: IRefineItemData): string;\n}\n\n/**\n * Choice summary component.\n * @param props - IChoiceSummaryProps.\n * @returns - Renders the choice summary.\n */\nconst ChoiceSummaryFunctionalComponent: React.FC = (props: IChoiceSummaryProps) => {\n const {\n clearAllText,\n label,\n className,\n choiceAriaLabel,\n closeAriaLabel,\n data: { selectedChoices },\n formatPrice,\n choiceFormat,\n choiceRangeValueFormat,\n onChoiceItemClicked,\n urlBuilder\n } = props;\n\n const payLoad: IPayLoad = getPayloadObject('click', props.telemetryContent!, '');\n const closeButtonGlyph: string = 'msi-close-btn';\n\n /**\n * Get choice summary name.\n * @param activeRefinerItem - Active refine Item data.\n * @returns - Returns the tag name.\n */\n const getTagName = (activeRefinerItem: IRefineItemData): string => {\n /* eslint-disable @typescript-eslint/prefer-nullish-coalescing -- Required for string. */\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n const refinerName = activeRefinerItem.name;\n\n let refinerValueName: string;\n if (isRangeType(activeRefinerItem.dataTypeValue)) {\n refinerValueName =\n rangeFormat\n ?.replace('{0}', formatPrice(activeRefinerItem.minValue, activeRefinerItem.unitText))\n .replace('{1}', formatPrice(activeRefinerItem.maxValue, activeRefinerItem.unitText)) || '';\n } else {\n refinerValueName = activeRefinerItem.label || activeRefinerItem.minValue || '';\n }\n\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\n /* eslint-enable @typescript-eslint/prefer-nullish-coalescing -- Required for string. */\n };\n\n const onClick = React.useCallback(\n (selectedRefineItem?: IRefineItemData) => (event: React.MouseEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n\n const targetChoiceItem = event.currentTarget as HTMLElement;\n const shouldClearAll: boolean = targetChoiceItem.getAttribute('class')!.includes('choice-summary__clear-all');\n\n onChoiceItemClicked({\n selectedRefineItem,\n shouldClearAll,\n nextItemToFocus: targetChoiceItem.nextSibling as HTMLElement\n });\n },\n [onChoiceItemClicked]\n );\n\n payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n
\n {ArrayExtensions.hasElements(selectedChoices) && label && {label}}\n
    \n {ArrayExtensions.hasElements(selectedChoices) &&\n selectedChoices.map((choiceItem, index) => {\n const choiceItemName = getTagName(choiceItem);\n payLoad.contentAction.etext = choiceItemName;\n const choiceItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n
  • \n \n {choiceItemName}\n \n \n
  • \n );\n })}\n
\n {ArrayExtensions.hasElements(selectedChoices) && clearAllText && (\n \n {clearAllText}\n \n )}\n
\n );\n};\n\n/**\n * Choice Summary Component.\n */\nexport const ChoiceSummaryComponent: React.FunctionComponent = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IChoiceSummaryComponent\n>('Choice-Summary', { component: ChoiceSummaryFunctionalComponent });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nexport const minLabelClassName = 'ms-refine-submenu__input-range-refiner input-range-label-min';\nexport const maxLabelClassName = 'ms-refine-submenu__input-range-refiner input-range-label-max';\nexport const minInputClassName = 'ms-refine-submenu__input-range-refiner input-range-input-min';\nexport const maxInputClassName = 'ms-refine-submenu__input-range-refiner input-range-input-max';\nexport const minLabelId = 'ms-refine-submenu-range-refiner-label';\nexport const maxLabelId = 'ms-refine-submenu-max-range-refiner-label';\nexport const minInputLabelId = 'ms-refine-submenu-min-range-refiner-input';\nexport const maxInputLabelId = 'ms-refine-submenu-min-range-refiner-input';\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AttributeDataType } from '@msdyn365-commerce/retail-proxy';\nimport { IRefineItemData } from './common';\n\n/**\n * Get input without formatting.\n * @param input - Input string.\n * @returns - Returns number.\n */\nexport function getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNumber = Number(input);\n if (!Number.isNaN(inputAsNumber)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n // const reverseLookupResult = formattedPriceReverseLookup.get(input);\n // return reverseLookupResult || input;\n return input;\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue - Data type value.\n * @returns - Returns boolean.\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue - Product refiner value to match.\n * @param refinementCriterion - Selected refinement criteria.\n * @returns - Boolean.\n */\nexport function isMatchingRefinementCriterion(productRefinerValue: IRefineItemData, refinementCriterion: IRefineItemData): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.refinerItemId === productRefinerValue.refinerItemId &&\n refinementCriterion.sourceValue === productRefinerValue.sourceValue &&\n refinementCriterion.dataTypeValue === productRefinerValue.dataTypeValue &&\n (isRangeType(refinementCriterion.dataTypeValue) || refinementCriterion.name === productRefinerValue.name)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue - Product refiner value to match.\n * @param refinementCriteria - Selected refinement criteria.\n * @returns - Returns the matching refiner.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: IRefineItemData,\n refinementCriteria: IRefineItemData[]\n): IRefineItemData | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: IRefineItemData) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\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 IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n IRequestContext,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IFeatureProduct } from '../models/feature-product';\nimport { ISearchResultContainerV2Resources } from '../search-result-container-v2.props.autogenerated';\n\n/**\n * IFeatureSearchResultData interface.\n */\nexport interface IFeatureSearchResultData {\n product: IFeatureProduct | null;\n context: ICoreContext;\n imageSettings?: IImageSettings;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\n/**\n * Feature Search Result Item view props.\n */\ninterface IFeatureSearchResultItemProps extends IComponentProps {}\n\n/**\n * IFeatureSearchResultComponent Interface.\n */\nexport interface IFeatureSearchResultComponent extends IComponent {}\n\n/**\n * Method to render product title.\n * @param title - Product title.\n * @returns Renders the product title.\n */\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return

{title}

;\n}\n\n/**\n * Method to render product image.\n * @param imageSettings - Image setting for the product image.\n * @param gridSettings - Grid setting for the site.\n * @param imageUrl - Image url.\n * @param altText - Alt text for the image.\n * @param fallbackImage - Fallback image url in case main image is not present.\n * @param context - Current request context.\n * @returns Renders the product image.\n */\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string,\n fallbackImage?: string,\n context?: IRequestContext\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const image: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return ;\n}\n\n// eslint-disable-next-line jsdoc/require-param -- The actual eslint fix is asking for repeated list of same parameter 5 times.\n/**\n * Method to render Feature product.\n * @returns Renders the feature product component.\n */\nconst FeatureSearchResultFunctionalComponent: React.FC = (props: IFeatureSearchResultItemProps) => {\n const {\n data: { product, imageSettings, telemetryContent, recommendation },\n context\n } = props;\n const resources = props.moduleResources as ISearchResultContainerV2Resources;\n if (product === null) {\n return null;\n }\n\n const productName = product.name;\n const productRecordId = product.recordId ? product.recordId : 0;\n const productUrl = getProductPageUrlSync(product.name ?? '', productRecordId, context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(\n product.itemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n
\n \n
\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.primaryImageUrl,\n product.name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n
\n \n
\n

{heading}

\n {renderProductTitle(product.name)}\n
\n
\n );\n};\n\n/**\n * Feature state result component.\n */\nexport const FeatureSearchResultComponent: React.FunctionComponent = msdyn365Commerce.createComponent<\n IFeatureSearchResultComponent\n>('Feature-Search-Result-Item', { component: FeatureSearchResultFunctionalComponent });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, IProductSearchResult, ProductComponentV2 } from '@msdyn365-commerce/components';\nimport { IComponent, IComponentProps, ICoreContext, IImageSettings, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerV2Resources } from '../search-result-container-v2.props.autogenerated';\n\n/**\n * ProductSearchResultItems interface.\n */\ninterface IProductSearchResultItems {\n products: IProductSearchResult[];\n context: ICoreContext;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n shouldAllowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickViewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * IProductSearchResultItemsProps Interface .\n */\nexport interface IProductSearchResultItemsProps extends IComponentProps {}\n\n/**\n * IProductSearchResultItemsComponent Interface .\n */\nexport interface IProductSearchResultItemsComponent extends IComponent {}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(\n channelInventoryConfigurationId: number | undefined,\n product: IProductSearchResult,\n props: IProductSearchResultItemsProps\n): string | undefined {\n const enableStockCheck = props.context.app.config.enableStockCheck;\n if (!enableStockCheck || !channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.attributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.attributeValues.find(attribute => attribute.recordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.textValue;\n }\n return undefined;\n}\n\n/**\n * Product Search Result Items\n * @param props -Invoice table props.\n * @returns On change.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Component name should start with Capital letter\nconst ProductSearchResultItems: React.FC = (props: IProductSearchResultItemsProps) => {\n const {\n products,\n context,\n imageSettings,\n moduleType,\n moduleId,\n shouldAllowBackNavigation,\n telemetryContent,\n quickViewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n } = props.data;\n const resources = props.moduleResources as ISearchResultContainerV2Resources;\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n
    \n {products.map((product: IProductSearchResult, index: number) => (\n
  • \n \n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.masterProductId\n )}\n />\n
  • \n ))}\n
\n );\n};\n\n/**\n * Product Search Result Items component.\n */\nexport const ProductSearchResultItemsComponent: React.FunctionComponent = msdyn365Commerce.createComponent<\n IProductSearchResultItemsComponent\n>('Product-Search-Result-Items', { component: ProductSearchResultItems });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport {\n getInputWithoutFormatting,\n IRefineItemData,\n maxInputClassName,\n maxInputLabelId,\n maxLabelClassName,\n maxLabelId,\n minInputClassName,\n minInputLabelId,\n minLabelClassName,\n minLabelId\n} from './common';\n\n/**\n * Range refine item type.\n */\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine input type.\n */\ntype InputType = 'Min' | 'Max';\n\nlet minInput: React.RefObject;\n\nlet maxInput: React.RefObject;\n\nconst minInputLabel = 'Minimum';\nconst maxInputLabel = 'Maximum';\n\n/**\n * IRangeRefineInputComponent Interface.\n */\nexport interface IRangeRefineInputComponent extends IComponent {}\n\n/**\n * IRangeRefineInput Data interface.\n */\nexport interface IRefinerItemData {\n refinerItemData: IRefineItemData;\n}\n\n/**\n * IRangeRefineInput Item props Interface.\n */\nexport interface IRangeRefineInputProps extends IComponentProps {\n minRangeValue: string;\n maxRangeValue: string;\n className?: string;\n isDisabled?: boolean;\n inputMinLabel?: string;\n inputMaxLabel?: string;\n minInputAriaLabel?: string;\n maxInputAriaLabel?: string;\n validationErrorRange?: string;\n onChangeMinValue?(changeMinValue: string): void;\n onChangeMaxValue?(changeMaxValue: string): void;\n onBlurMinInput?(BlurMinValue: number): void;\n onBlurMaxInput?(BlurMaxValue: number): void;\n formattedSelectedValue?(value: string, isTouched: boolean, validationError: string): string;\n}\n\n/**\n * Range refine input component.\n * @param props - IRangeRefineInputProps.\n * @returns - Renders the Range Refine Input.\n */\nconst RangeRefineInputFunctionalComponent: React.FC = (props: IRangeRefineInputProps) => {\n const {\n minRangeValue,\n maxRangeValue,\n isDisabled,\n inputMinLabel,\n inputMaxLabel,\n validationErrorRange,\n minInputAriaLabel,\n maxInputAriaLabel,\n onChangeMinValue,\n onChangeMaxValue,\n onBlurMinInput,\n onBlurMaxInput\n } = props;\n const [selectedMinValue, setSelectedMinValue] = React.useState(props.minRangeValue);\n const [selectedMaxValue, setSelectedMaxValue] = React.useState(props.maxRangeValue);\n const [validationErrorMessageForRange, setValidationErrorMessageForRange] = React.useState('');\n\n const formAttributes = {\n 'aria-disabled': isDisabled\n };\n\n /**\n * Change Input value.\n * @param event - Focus Event.\n * @param inputType - Input type.\n */\n function changeValue(event: React.FocusEvent, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const selectedFormattedValue = getInputWithoutFormatting(event.currentTarget.value);\n if (selectedKey === 'selectedMin') {\n setSelectedMinValue(selectedFormattedValue);\n onChangeMinValue?.(selectedFormattedValue);\n } else {\n setSelectedMaxValue(selectedFormattedValue);\n onChangeMaxValue?.(selectedFormattedValue);\n }\n }\n\n /**\n * Change min Input value.\n * @param event - Focus Event.\n */\n const changeMinValue = (event: React.FocusEvent): void => {\n changeValue(event, 'Min');\n };\n\n /**\n * Change max Input value.\n * @param event - Focus Event.\n */\n const changeMaxValue = (event: React.FocusEvent): void => {\n changeValue(event, 'Max');\n };\n\n /**\n * VAlidate Range value.\n * @param minimum - Minimum value.\n * @param maximum - Maximum value.\n * @returns - Boolean value to validate range or not.\n */\n function validateRange(minimum: number, maximum: number): boolean {\n if (minimum > maximum) {\n setValidationErrorMessageForRange(validationErrorRange ?? 'Please Enter max value greater than min value');\n return false;\n }\n setValidationErrorMessageForRange('');\n return true;\n }\n\n /**\n * Finish min Input value.\n * @param event - Focus Event.\n */\n const finishChangeMin = (event: React.FocusEvent) => {\n const userSelectedMinValue = getInputWithoutFormatting(event.currentTarget.value);\n setSelectedMinValue(userSelectedMinValue);\n const updatedMinInput = Number(userSelectedMinValue);\n const maximum = maxRangeValue;\n\n const maxNumber = Number(maximum);\n\n if (validateRange(updatedMinInput, maxNumber)) {\n onBlurMinInput?.(updatedMinInput);\n }\n };\n\n /**\n * Finish max Input value.\n * @param event - Focus Event.\n */\n const finishChangeMax = (event: React.FocusEvent) => {\n const userSelectedMaxValue = getInputWithoutFormatting(event.currentTarget.value);\n setSelectedMaxValue(userSelectedMaxValue);\n const updatedMaxInput = Number(userSelectedMaxValue);\n const minNumber = Number(minRangeValue || '0');\n\n if (validateRange(minNumber, updatedMaxInput)) {\n onBlurMaxInput?.(updatedMaxInput);\n }\n };\n\n return (\n
\n \n \n {validationErrorMessageForRange && validationErrorMessageForRange !== '' && (\n \n {validationErrorMessageForRange}\n \n )}\n
\n );\n};\n\n/**\n * Range Refine Input Component.\n */\nexport const RangeRefineInputComponent: React.FunctionComponent = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IRangeRefineInputComponent\n>('Range-Refine-Input-Item', { component: React.memo(RangeRefineInputFunctionalComponent) });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { ISliderChangeNotification, Slider } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nimport { IRefineItemData } from './common';\nimport { getSliderLabels, getSliderThumbs } from './utilities';\n\n/**\n * IRangeRefineSlider Component Interface.\n */\nexport interface IRangeRefineSliderComponent extends IComponent {}\n\n/**\n * IRangeRefineSlider Data interface.\n */\nexport interface IRefinerItemData {\n refinerItemData: IRefineItemData;\n}\n\n/**\n * Refine range slider props Interface.\n */\nexport interface IRefineRangeSliderProps extends IComponentProps {\n sliderClassName?: string;\n sliderRangeMinVal: number;\n sliderRangeMaxVal: number;\n selectedSliderMinVal?: number;\n selectedSliderMaxVal?: number;\n isDisabled?: boolean;\n sliderId?: string;\n sliderKey?: string;\n step?: number;\n shouldShowLabels?: boolean;\n shouldShowTooltip?: boolean;\n\n // This property is added just to make the component rerender in order to fix the slider issue.\n isRefinerExpanded?: boolean;\n orientation?: 'horizontal' | 'vertical';\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n formatLabelString?(selectedRangeValue: string, currencyCode?: string): string;\n formatTooltipValue?(sliderValue: string, currencyCode?: string): string;\n onRangeChange?(firstValue: number, secondValue: number): void;\n}\n\n/**\n * Range refine slider component.\n * @param props - IRefineRangeSliderProps.\n * @returns - Renders the Range Refine slider.\n */\nconst RangeRefineSliderFunctionalComponent: React.FC = (props: IRefineRangeSliderProps) => {\n const {\n isDisabled,\n sliderRangeMinVal,\n formatLabelString,\n sliderRangeMaxVal,\n onRangeChange,\n minValueSliderThumbAriaLabel,\n shouldShowLabels,\n maxValueSliderThumbAriaLabel,\n selectedSliderMinVal,\n selectedSliderMaxVal,\n sliderClassName,\n step,\n orientation,\n shouldShowTooltip,\n sliderKey,\n sliderId,\n data: { refinerItemData }\n } = props;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- For string the check is required.\n const sliderLocalId = sliderId || 'slider_01';\n const formattedMinValue = formatLabelString\n ? formatLabelString(sliderRangeMinVal.toString(), refinerItemData.unitText)\n : sliderRangeMinVal.toString();\n const formattedMaxValue = formatLabelString\n ? formatLabelString(sliderRangeMaxVal.toString(), refinerItemData.unitText)\n : sliderRangeMaxVal.toString();\n const sliderLabels = getSliderLabels(sliderLocalId, formattedMinValue, formattedMaxValue);\n\n const selectedMinValue = (selectedSliderMinVal ?? sliderRangeMinVal).toString();\n const selectedMaxValue = (selectedSliderMaxVal ?? sliderRangeMaxVal).toString();\n\n const sliderThumbs = getSliderThumbs(\n sliderLocalId,\n selectedMinValue,\n formattedMinValue,\n selectedMaxValue,\n formattedMaxValue,\n sliderRangeMaxVal.toString(),\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n );\n\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n /**\n * HandleRangeTooltipText.\n * @param tooltip - Tooltip value.\n * @returns - Formatted tooltip value.\n */\n const handleRangeTooltipText = (tooltip: number): string => {\n return props.formatTooltipValue ? props.formatTooltipValue(tooltip.toString(), refinerItemData.unitText) : `${tooltip}`;\n };\n\n /**\n * HandleRangeTooltipText.\n * @param sliderChangeNotification - Slider change notification value.\n */\n const onRangeUpdate = (sliderChangeNotification: ISliderChangeNotification) => {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n getSliderThumbs(\n sliderLocalId,\n sliderChangeNotification.firstThumbValue.toString(),\n formattedMinValue,\n sliderChangeNotification.secondThumbValue!.toString(),\n formattedMaxValue,\n sliderRangeMaxVal.toString(),\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n );\n onRangeChange?.(sliderChangeNotification.firstThumbValue, sliderChangeNotification.secondThumbValue!);\n }\n };\n\n const onRangeUpdateEnd = (sliderChangeNotification: ISliderChangeNotification) => {\n getSliderThumbs(\n sliderLocalId,\n sliderChangeNotification.firstThumbValue.toString(),\n formattedMinValue,\n sliderChangeNotification.secondThumbValue!.toString(),\n formattedMaxValue,\n sliderRangeMaxVal.toString(),\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n );\n onRangeChange?.(sliderChangeNotification.firstThumbValue, sliderChangeNotification.secondThumbValue!);\n };\n\n return (\n \n );\n};\n\nRangeRefineSliderFunctionalComponent.defaultProps = {\n shouldShowLabels: true,\n shouldShowTooltip: true,\n orientation: 'horizontal',\n step: 1\n};\n\n/**\n * Range Refine Input Component.\n */\nexport const RangeRefineSliderComponent: React.FunctionComponent = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IRangeRefineSliderComponent\n>('Range-Refine-Slider-Item', { component: React.memo(RangeRefineSliderFunctionalComponent) });\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport { IAny, IComponent, IComponentProps, ICoreContext, IGeneric, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * IRefineRatingItemComponent Interface.\n */\nexport interface IRefineRatingItemComponent extends IComponent {}\n\n/**\n * Refine rating item props Interface.\n */\nexport interface IRefineRatingProps extends IComponentProps<{}> {\n context: ICoreContext>;\n avgRatingCount: number;\n ratingCountText?: string;\n className?: string;\n ratingAriaLabel?: string;\n telemetry?: ITelemetry;\n refineItemUrl?: string;\n refineRatingName?: string;\n productCount?: string;\n telemetryContent?: ITelemetryContent;\n isMobileView?: boolean;\n\n onClick(event: React.MouseEvent, avgRatingCount?: number, ratingCountText?: string): void;\n}\n\n/**\n * Refine Rating item.\n * @param props - IRefineRatingProps.\n * @returns - Render rating item.\n */\nconst RefineRatingFunctionalComponent: React.FC = (props: IRefineRatingProps) => {\n const {\n refineItemUrl,\n avgRatingCount,\n ratingCountText,\n ratingAriaLabel,\n refineRatingName,\n context,\n productCount,\n isMobileView,\n id,\n typeName,\n className,\n onClick\n } = props;\n\n const payLoad: IPayLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n /**\n * OnClickHandler Method.\n * @param event - Mouse event.\n */\n const onClickHandler = React.useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n onClick(event, avgRatingCount, ratingCountText);\n }, []);\n payLoad.contentAction.etext = refineRatingName;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n return (\n \n \n \n {`(${productCount})`}\n \n \n );\n};\n\n/**\n * Refine rating item Component.\n */\nexport const RefineRatingItemComponent: React.FunctionComponent = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IRefineRatingItemComponent\n>('Refine-Rating-Item', { component: React.memo(RefineRatingFunctionalComponent) });\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 { IAny, IComponent, IComponentProps, ICoreContext, IGeneric, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { DimensionTypes, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Collapse, format, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport React, { useCallback } from 'react';\n\nimport { RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { findMatchingRefinementCriterion, IRefineItemData, IRefineItemToggleNotification, IRefineSubMenuData, isRangeType } from './common';\nimport { RangeRefineInputComponent } from './range-refine-input-item.component';\nimport { RangeRefineSliderComponent } from './range-refine-slider-item.component';\nimport { RefineRatingItemComponent } from './refine-rating-item.component';\nimport { getRangeType } from './utilities';\nimport { RefinerItemComponent } from './refiner-item.component';\n\n/**\n * IRefineSubmenuComponent Interface.\n */\nexport interface IRefineSubmenuComponent extends IComponent {}\n\n/**\n * IRefineSubmenuData interface.\n */\nexport interface IRefineSubmenuData {\n refinerSubMenuData: IRefineSubMenuData;\n selectedRefinerValues: IRefineItemData[];\n}\n\n/**\n * Refine submenu resources.\n */\nexport interface IRefineSubmenuResources {\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n minInputAriaLabel?: string;\n maxInputAriaLabel?: string;\n refineSubMenuAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n}\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps extends IComponentProps {\n subMenuClassName?: string;\n isMobileView?: boolean;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n expandSubMenuTimeout?: number;\n telemetryContent?: ITelemetryContent;\n context: ICoreContext>;\n getRefineItemAriaLabel?(refinerItemData: IRefineItemData, subMenuList: IRefineSubMenuData): string | undefined;\n onUpdateRefiners(notification: IRefineItemToggleNotification): void;\n shouldDisplaySwatchComponent?(refineItem: IRefineItemData, dimension: DimensionTypes): boolean;\n formatSliderThumb?(sliderValue: string, currencyCode?: string): string;\n formatSliderLabel?(sliderValue: string, currencyCode?: string): string;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention -- This is the standard rule for naming a constant.\nconst DEFAULT_SUBMENU_EXPAND_TIMEOUT = 350;\n// eslint-disable-next-line @typescript-eslint/naming-convention -- This is the standard rule for naming a constant.\nconst RATING_COMPONENT_DATATYPE = 4;\n\n/**\n * Refine Submenu.\n * @param props - IRefineSubmenuProps.\n * @returns - Render refineSubmenu.\n */\nconst RefineSubMenuFunctionalComponent: React.FC = (props: IRefineSubmenuProps) => {\n const {\n data: { refinerSubMenuData, selectedRefinerValues },\n isDisabled,\n subMenuClassName,\n onUpdateRefiners,\n context,\n expandSubMenuTimeout,\n id: moduleId,\n typeName,\n shouldDisplaySwatchComponent,\n isExpandedOnInitialLoad,\n urlBuilder,\n isMobileView,\n telemetryContent\n } = props;\n\n const {\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel,\n minInputAriaLabel,\n maxInputAriaLabel,\n refineSubMenuAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel\n } = props.moduleResources as IRefineSubmenuResources;\n\n const [shouldRefinerExpand, setShouldRefinerExpand] = React.useState(isExpandedOnInitialLoad);\n const [isRefinerExpanded, setIsRefinerExpanded] = React.useState(false);\n\n const onEntering = useCallback(() => {\n setIsRefinerExpanded(!isRefinerExpanded);\n }, [isRefinerExpanded]);\n\n const onSliderUpdate = React.useCallback(\n (selectedRefinerItem: IRefineItemData) => (updatedMin: number, updatedMax: number) => {\n onUpdateRefiners({\n refinerSubMenuData,\n refinerItemData: selectedRefinerItem,\n isSelecting: true,\n rangeStart: updatedMin,\n rangeEnd: updatedMax\n });\n },\n [onUpdateRefiners, refinerSubMenuData]\n );\n\n const onClickRefineItem = React.useCallback(\n (selectedRefinerItem: IRefineItemData) => () => {\n onUpdateRefiners({\n refinerSubMenuData,\n refinerItemData: selectedRefinerItem,\n isSelecting: !selectedRefinerItem.isChecked\n });\n },\n [onUpdateRefiners, refinerSubMenuData]\n );\n\n const onClickRating = React.useCallback(\n (selectedRefinerItem: IRefineItemData) => () => {\n onUpdateRefiners({\n refinerSubMenuData,\n refinerItemData: selectedRefinerItem,\n isSelecting: true\n });\n },\n [onUpdateRefiners, refinerSubMenuData]\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Reading config.\n if (refinerSubMenuData.sourceValue === RATING_COMPONENT_DATATYPE && props.context.app.config.hideRating) {\n return null;\n }\n\n const isSingleSelect = refinerSubMenuData.refinerTypeValue === 0 && refinerSubMenuData.sourceValue === RATING_COMPONENT_DATATYPE;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n\n /**\n * It calls on toggling the submenu.\n */\n const onToggleSubmenu = React.useCallback(() => {\n setShouldRefinerExpand(!shouldRefinerExpand);\n }, [shouldRefinerExpand]);\n\n /**\n * Refiner item aria label.\n * @param refinerItem - IRefineItemData.\n * @param refinerSubMenuItem - IRefineSubMenuData.\n * @returns Aria label for refine item accordingly.\n */\n const getRefineItemAriaLabel = (refinerItem: IRefineItemData, refinerSubMenuItem: IRefineSubMenuData): string => {\n const productText = refinerItem.name || '';\n const productCount = refinerItem.count ?? 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel ? format(refineItemAriaLabel, refinerSubMenuItem.name, productText) : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, refinerSubMenuItem.name, productText, productCount)\n : '';\n }\n return refineMenuItemAriaLabel;\n };\n\n /**\n * It decides to show the swatch component or not.\n * @param selectedRefinerItem - Contains the selectedRefineItem details.\n * @param dimensionType - Dimension type.\n * @returns - Returns Swatch component or undefined.\n */\n function showSwatchComponent(selectedRefinerItem: IRefineItemData, dimensionType: DimensionTypes) {\n const swatchItems: ISwatchItem[] = [];\n const shouldShowSwatch = shouldDisplaySwatchComponent?.(selectedRefinerItem, dimensionType);\n if (!shouldShowSwatch) {\n return undefined;\n }\n const text = selectedRefinerItem.name;\n swatchItems.push({\n itemId: `${selectedRefinerItem.refinerItemId}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: selectedRefinerItem.swatchColorHexCode,\n imageUrl: selectedRefinerItem.swatchImageUrl\n });\n return (\n <>\n \n \n );\n }\n\n /**\n * Gets refiner URL.\n * @param refinerItem - RefineItem.\n * @returns - URL.\n */\n function getRefinerUrl(refinerItem: IRefineItemData): string {\n return urlBuilder({\n refinerSubMenuData,\n refinerItemData: refinerItem,\n isSelecting: true\n });\n }\n\n /**\n * It renders refine item component.\n * @param subMenuList - Contains the submenu list details.\n * @returns - Refine item component.\n */\n function renderRefineItem(subMenuList: IRefineSubMenuData) {\n return subMenuList.values.map((refinerItem, index) => {\n const dimensionType = (refinerSubMenuData.keyName ?? '') as DimensionTypes;\n const isChecked: boolean = !!findMatchingRefinementCriterion(refinerItem, selectedRefinerValues);\n refinerItem.isChecked = isChecked;\n const isSingleSelectValue = refinerSubMenuData.refinerTypeValue === RefinerType.SingleSelect;\n const label = `${refinerItem.name} (${refinerItem.count ? refinerItem.count : ''})`;\n const refinerUrl = getRefinerUrl(refinerItem);\n return (\n
  • \n \n {showSwatchComponent(refinerItem, dimensionType)}\n \n
  • \n );\n });\n }\n\n /**\n * It renders Rating component.\n * @param subMenuList - Contains the submenu list details.\n * @returns - Rating component.\n */\n function renderRatingRefineItem(subMenuList: IRefineSubMenuData) {\n return subMenuList.values.map((refinerItem, index) => {\n const noOfStars = Number.parseInt(refinerItem.name || '0', 10);\n const refinerUrl = getRefinerUrl(refinerItem);\n const refinerRating = Number.parseInt(refinerItem.name, 10);\n const ratingRefiner = selectedRefinerValues.find(value => value.dataTypeValue === refinerItem.dataTypeValue);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.name || '0', 10);\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n return (\n \n \n \n );\n });\n }\n\n /**\n * It renders range slider or range input based on the rangeType == \"input\" || rangeType == \"slider\".\n * @param subMenuList - Contains the submenu list details.\n * @returns - RangeSlider or RangeInput component.\n */\n function renderRangeRefineItem(subMenuList: IRefineSubMenuData): JSX.Element[] | null {\n const rangeType = getRangeType(subMenuList);\n return subMenuList.values.map((refineItem, index) => {\n const selectedRefinementCriterion = findMatchingRefinementCriterion(refineItem, selectedRefinerValues);\n const minValue = refineItem.minValue ?? '';\n const maxValue = refineItem.maxValue ?? '';\n const selectedMinValue = StringExtensions.isNullOrEmpty(selectedRefinementCriterion?.minValue)\n ? undefined\n : Number(selectedRefinementCriterion?.minValue);\n const selectedMaxValue = StringExtensions.isNullOrEmpty(selectedRefinementCriterion?.maxValue)\n ? undefined\n : Number(selectedRefinementCriterion?.maxValue);\n const sliderId = `slider_${String(subMenuList.refinerSubMenuId)}_${String(refineItem.refinerItemId)}`;\n const sliderKey = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.minValue ?? ''}\n -${selectedRefinementCriterion.maxValue ?? ''}`\n : `not-selected-${index}`;\n return (\n
  • \n {rangeType === 'input' && (\n \n )}\n {rangeType === 'slider' && (\n \n )}\n
  • \n );\n });\n }\n\n /**\n * It renders range type or refine item or rating component based on condition.\n * @param refineSubMenuData - Contains the submenu list details.\n * @returns - RefinerRating or RefinerRange or RefineItem component.\n */\n function renderCollapsibleItems(refineSubMenuData: IRefineSubMenuData) {\n if (isRangeType(refineSubMenuData.dataTypeValue)) {\n return renderRangeRefineItem(refineSubMenuData);\n } else if (refineSubMenuData.sourceValue === RATING_COMPONENT_DATATYPE) {\n return renderRatingRefineItem(refineSubMenuData);\n }\n return renderRefineItem(refineSubMenuData);\n }\n\n return (\n
    \n \n {refinerSubMenuData.name}\n \n \n
      \n {renderCollapsibleItems(refinerSubMenuData)}\n
    \n
    \n
    \n );\n};\n\n/**\n * Refine Summary Component.\n */\nexport const RefineSubMenuComponent: React.FunctionComponent = msdyn365Commerce.createComponent<\n // @ts-expect-error -- Required for this signature.\n IRefineSubmenuComponent\n>('Refine-SubMenu', {\n component: RefineSubMenuFunctionalComponent\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * RefinerItemComponent Interface.\n */\nexport interface IRefinerItemComponent extends IComponent {}\n\n/**\n * IRefineItem props Interface.\n */\nexport interface IRefineItemProps extends IComponentProps<{}> {\n isDisabled?: boolean;\n refineItemUrl?: string;\n isSingleSelect: boolean;\n label: string;\n isChecked?: boolean;\n className?: string;\n refineItemAriaLabel?: string;\n children?: JSX.Element | undefined;\n telemetryContent?: ITelemetryContent;\n onClick(): void;\n}\n\n/**\n * Refiner Item component.\n * @param props - IRefineItemProps.\n * @returns - Renders the Refiner Item.\n */\nconst RefinerItemFunctionalComponent: React.FC = (props: IRefineItemProps) => {\n const { isDisabled, refineItemAriaLabel, refineItemUrl, isSingleSelect, label, children, isChecked, onClick, telemetryContent } = props;\n\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n itemTypeClassName = isDisabled ? `${itemTypeClassName} disabled` : itemTypeClassName;\n const payLoad: IPayLoad = getPayloadObject('click', telemetryContent!, '');\n payLoad.contentAction.etext = label;\n const refineItemAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n /**\n * OnClickHandler Method.\n * @param event - Mouse event.\n */\n const onClickHandler = (event: React.MouseEvent): void => {\n event.preventDefault();\n !props.isDisabled && onClick();\n };\n\n return (\n \n {children}\n \n \n );\n};\n\n/**\n * Refiner Item Component.\n */\n// @ts-expect-error -- Required for this signature.\nexport const RefinerItemComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\n 'Refiner-Item',\n { component: React.memo(RefinerItemFunctionalComponent) }\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IAttributeSwatch,\n IAttributeValue,\n IProductSearchResult\n} from '@msdyn365-commerce/commerce-entities/src/custom-entities/product-list';\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n AttributeSwatch,\n AttributeValue,\n CommerceProperty,\n ProductRefinerValue,\n ProductSearchResult,\n RefinerType,\n SortColumn\n} from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IExtensionProperty, IRefinerHierarchy, IRefinerValue } from '../models/product-refiners';\nimport { IRefineItemData, IRefineItemToggleNotification, IRefineSubMenuData } from './common';\nimport { ISliderThumbProps, ISliderLabel } from '@msdyn365-commerce-modules/utilities';\n\nexport const getSliderThumbs = (\n sliderClassName: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string,\n minValueSliderThumbAriaLabel?: string,\n maxValueSliderThumbAriaLabel?: string\n): ISliderThumbProps[] => {\n return [\n {\n id: `${sliderClassName} slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || 0,\n ariaLabel: `${minValueSliderThumbAriaLabel!}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderClassName} slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${maxValueSliderThumbAriaLabel!}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n};\n\nexport const getSliderLabels = (sliderClassname: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderClassname} slider_label_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderClassname} slider_label_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n};\n\nexport function getRangeType(subMenuData: IRefineSubMenuData): 'input' | 'slider' {\n if (subMenuData.displayTemplateValue === 3 || subMenuData.displayTemplateValue === 1 || subMenuData.displayTemplateValue === 2) {\n return 'slider';\n }\n return 'input';\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue - DataTypeValue.\n * @returns - Whether the dataTypeValue is range type or not.\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue - Product refiner value to match.\n * @param refinementCriterion - Selected refinement criteria.\n * @returns - Boolean.\n */\nexport function isMatchingRefinementCriterion(productRefinerValue: IRefineItemData, refinementCriterion: IRefineItemData): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.refinerItemId === productRefinerValue.refinerItemId &&\n refinementCriterion.sourceValue === productRefinerValue.sourceValue &&\n refinementCriterion.dataTypeValue === productRefinerValue.dataTypeValue &&\n (isRangeType(refinementCriterion.dataTypeValue) || refinementCriterion.name === productRefinerValue.name)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue - Product refiner value to match.\n * @param refinementCriteria - Selected refinement criteria.\n * @returns - Refine Item data.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: IRefineItemData,\n refinementCriteria: IRefineItemData[]\n): IRefineItemData | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find(refinementCriterion => isMatchingRefinementCriterion(productRefinerValue, refinementCriterion));\n}\n\n/**\n * Get updated refinement criteria.\n * @param itemToggleNotification - RefineItemToggleNotification object.\n * @param currentRefinementCriteria - Array of IRefineItemData.\n * @returns - Array of IRefineItemData.\n */\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: IRefineItemData[]\n): IRefineItemData[] {\n const updatedRefinementCriteria: IRefineItemData[] = [];\n let isToggledItemFound = false;\n for (const selectedCriterion of currentRefinementCriteria) {\n if (isMatchingRefinementCriterion(itemToggleNotification.refinerItemData, selectedCriterion)) {\n isToggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n minValue:\n itemToggleNotification.rangeStart !== undefined\n ? `${itemToggleNotification.rangeStart}`\n : selectedCriterion.minValue,\n maxValue:\n itemToggleNotification.rangeEnd !== undefined ? `${itemToggleNotification.rangeEnd}` : selectedCriterion.maxValue\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n }\n\n if (!isToggledItemFound) {\n const next = {\n ...itemToggleNotification.refinerItemData,\n minValue:\n itemToggleNotification.rangeStart !== undefined\n ? `${itemToggleNotification.rangeStart}`\n : itemToggleNotification.refinerItemData.name,\n maxValue:\n itemToggleNotification.rangeEnd !== undefined\n ? `${itemToggleNotification.rangeEnd}`\n : itemToggleNotification.refinerItemData.name\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.refinerItemData.dataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.refinerItemData.dataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.refinerSubMenuData.refinerTypeValue === RefinerType.SingleSelect\n ) {\n for (const child of itemToggleNotification.refinerSubMenuData.values) {\n if (!(child.refinerItemId === next.refinerItemId && child.name === next.name)) {\n const matchingIndex = updatedRefinementCriteria.findIndex(criterion => isMatchingRefinementCriterion(child, criterion));\n // eslint-disable-next-line max-depth -- Condition required.\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n }\n }\n }\n\n return updatedRefinementCriteria;\n}\n\n/**\n * Format Price.\n * @param amount - Amount.\n * @param currency - Currency.\n * @param locale - Locale.\n * @param telemetry - Telemetry.\n * @returns - Formatted Price.\n */\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount!} ${currency!}`);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- For string it is required.\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n\n/**\n * Convert an array of RefineItemData to ProductRefinerValue.\n * @param productRefinerValue - RefineItemData.\n * @returns - ProductRefinerValue[].\n */\nexport const convertProductRefinerValueToRefinerItemData = (productRefinerValue: ProductRefinerValue[]): IRefineItemData[] => {\n const refinerItems: IRefineItemData[] = [];\n for (const productRefiner of productRefinerValue) {\n refinerItems.push({\n count: productRefiner.Count,\n dataTypeValue: productRefiner.DataTypeValue,\n refinerItemId: productRefiner.RefinerRecordId ?? 0,\n unitText: productRefiner.UnitText,\n rowNumber: productRefiner.RowNumber,\n sourceValue: productRefiner.RefinerSourceValue,\n swatchColorHexCode: productRefiner.SwatchColorHexCode,\n swatchImageUrl: productRefiner.SwatchImageUrl,\n name: StringExtensions.isNullOrEmpty(productRefiner.LeftValueBoundString) ? '' : productRefiner.LeftValueBoundString!,\n label: StringExtensions.isNullOrEmpty(productRefiner.LeftValueBoundLocalizedString)\n ? ''\n : productRefiner.LeftValueBoundLocalizedString!,\n isChecked: true,\n minValue: productRefiner.LeftValueBoundString,\n maxValue: productRefiner.RightValueBoundString\n });\n }\n return refinerItems;\n};\n\n/**\n * Convert an array of RefineItemData to ProductRefinerValue.\n * @param refineItemData - RefineItemData.\n * @returns - ProductRefinerValue[].\n */\nexport const convertRefinerItemDataToProductRefinerValue = (refineItemData: IRefineItemData[]): ProductRefinerValue[] => {\n const productRefinerValues: ProductRefinerValue[] = [];\n for (const refinerItem of refineItemData) {\n productRefinerValues.push({\n Count: refinerItem.count,\n DataTypeValue: refinerItem.dataTypeValue,\n LeftValueBoundString: refinerItem.minValue,\n RightValueBoundString: refinerItem.maxValue,\n RefinerRecordId: refinerItem.refinerItemId,\n UnitText: refinerItem.unitText,\n RowNumber: refinerItem.rowNumber,\n RefinerSourceValue: refinerItem.sourceValue,\n SwatchColorHexCode: refinerItem.swatchColorHexCode,\n SwatchImageUrl: refinerItem.swatchImageUrl\n });\n }\n return productRefinerValues;\n};\n\n/**\n * Converts IRefinerValue to IRefineItemData.\n * @param productRefinerValues - Array of IRefinerValue.\n * @returns - Array of IRefineItemData.\n */\nexport const convertToRefinerItemData = (productRefinerValues: IRefinerValue[]): IRefineItemData[] => {\n const refinerItemData: IRefineItemData[] = [];\n for (const productRefinerValue of productRefinerValues) {\n const temporaryRefinerItemData: IRefineItemData = {\n sourceValue: productRefinerValue.refinerSourceValue,\n swatchImageUrl: productRefinerValue.swatchImageUrl,\n swatchColorHexCode: productRefinerValue.swatchColorHexCode,\n refinerItemId: productRefinerValue.refinerRecordId ?? 0,\n dataTypeValue: productRefinerValue.dataTypeValue,\n name: productRefinerValue.leftValueBoundString || '',\n count: productRefinerValue.count,\n unitText: productRefinerValue.unitText,\n minValue: productRefinerValue.leftValueBoundString || '',\n maxValue: productRefinerValue.rightValueBoundString || '',\n label: productRefinerValue.leftValueBoundLocalizedString || '',\n isChecked: false\n };\n refinerItemData.push(temporaryRefinerItemData);\n }\n return refinerItemData;\n};\n\n/**\n * Method to map CommerceProperty object to custom ExtensionProperty.\n * @param commerceProperties - Commerce property object.\n * @returns Extension property array.\n */\nconst mapExtensionProperties = (commerceProperties: IExtensionProperty[]): CommerceProperty[] => {\n const extensionProperties: CommerceProperty[] = [];\n for (const item of commerceProperties) {\n extensionProperties.push({\n Key: item.propertyKey,\n Value: {\n ByteValue: item.value?.byteValue,\n BooleanValue: item.value?.isBooleanValue,\n DateTimeOffsetValue: item.value?.dateTimeOffsetValue,\n DecimalValue: item.value?.decimalValue,\n IntegerValue: item.value?.integerValue,\n LongValue: item.value?.longValue,\n StringValue: item.value?.stringValue\n }\n });\n }\n return extensionProperties;\n};\n\n/**\n * Method to map CommerceProperty object AttributeSwatch to custom AttributeSwatch.\n * @param attributeSwatches - Commerce property object.\n * @returns IAttributeSwatch array.\n */\nconst mapSwatchValues = (attributeSwatches: IAttributeSwatch[]): AttributeSwatch[] => {\n const swatches: AttributeSwatch[] = [];\n for (const swatch of attributeSwatches) {\n swatches.push({\n SwatchValue: swatch.swatchValue,\n SwatchImageUrl: swatch.swatchImageUrl,\n SwatchColorHexCode: swatch.swatchColorHexCode,\n IsDefault: swatch.isDefault,\n ProductImageUrls: swatch.productImageUrls,\n ExtensionProperties: swatch.extensionProperties ? mapExtensionProperties(swatch.extensionProperties) : []\n });\n }\n return swatches;\n};\n\n/**\n * Method to map CommerceProperty object AttributeValue to custom IAttributeValue.\n * @param attributeValues - Commerce property object.\n * @returns IAttributeValue array.\n */\nconst mapAttributeValues = (attributeValues: IAttributeValue[]): AttributeValue[] => {\n const attributes: AttributeValue[] = [];\n for (const attribute of attributeValues) {\n attributes.push({\n Name: attribute.name,\n KeyName: attribute.keyName,\n UnitOfMeasureSymbol: attribute.unitOfMeasureSymbol,\n DataTypeValue: attribute.dataTypeValue,\n BooleanValue: attribute.isBooleanValue,\n DateTimeOffsetValue: attribute.dateTimeOffsetValue,\n FloatValue: attribute.floatValue,\n IntegerValue: attribute.integerValue,\n TextValue: attribute.textValue,\n CurrencyValue: attribute.currencyValue,\n CurrencyCode: attribute.currencyCode,\n AttributeValueId: attribute.attributeValueId,\n RecordId: attribute.recordId,\n Swatches: attribute.swatches ? mapSwatchValues(attribute.swatches) : [],\n ExtensionProperties: attribute.extensionProperties ? mapExtensionProperties(attribute.extensionProperties) : []\n });\n }\n return attributes;\n};\n\n/**\n * Method to map CommerceProperty object ProductSearchResult to custom IProductSearchResult.\n * @param searchProducts - Commerce property object.\n * @returns IProductSearchResult array.\n */\nexport const convertProductsToProductSearchResult = (searchProducts: IProductSearchResult[]): ProductSearchResult[] => {\n const products: ProductSearchResult[] = [];\n for (const product of searchProducts) {\n products.push({\n ItemId: product.itemId,\n Name: product.name,\n Price: product.price,\n PrimaryImageUrl: product.primaryImageUrl,\n RecordId: product.recordId,\n AverageRating: product.averageRating,\n TotalRatings: product.totalRatings,\n Description: product.description,\n BasePrice: product.basePrice,\n MinVariantPrice: product.minVariantPrice,\n MaxVariantPrice: product.maxVariantPrice,\n AttributeValues: product.attributeValues ? mapAttributeValues(product.attributeValues) : [],\n IsMasterProduct: product.isMasterProduct,\n MasterProductId: product.masterProductId,\n DefaultUnitOfMeasure: product.defaultUnitOfMeasure,\n ExtensionProperties: product.extensionProperties ? mapExtensionProperties(product.extensionProperties) : []\n });\n }\n return products;\n};\n\n/**\n * Converts array of IRefinerHierarchy to array of IRefineSubMenuData.\n * @param productRefinerHierarchyArray - Array of IRefinerHierarchy.\n * @returns - Returns array of IRefineSubMenuData.\n */\nexport const convertToRefinerSubMenuHierarchyData = (productRefinerHierarchyArray: IRefinerHierarchy[]): IRefineSubMenuData[] => {\n const subMenuArray: IRefineSubMenuData[] = [];\n for (const productRefinerHierarchy of productRefinerHierarchyArray) {\n subMenuArray.push({\n refinerSubMenuId: productRefinerHierarchy.recordId,\n name: productRefinerHierarchy.keyName,\n dataTypeValue: productRefinerHierarchy.dataTypeValue,\n refinerTypeValue: productRefinerHierarchy.refinerTypeValue,\n displayTemplateValue: productRefinerHierarchy.displayTemplateValue,\n sourceValue: productRefinerHierarchy.sourceValue,\n keyName: productRefinerHierarchy.keyName,\n isDimension: productRefinerHierarchy.isDimension,\n values: convertToRefinerItemData(productRefinerHierarchy.values)\n });\n }\n return subMenuArray;\n};\n\n/**\n * Compress Refiners.\n * @param refiners - Array of IRefineItemData.\n * @returns - Return compressed refiners.\n */\nconst compressRefiners = (refiners: IRefineItemData[]) => {\n const compressedRefinerKeys = ['dataTypeValue', 'refinerItemId', 'sourceValue'];\n const compressedRefiners: (string | number)[][] = [];\n\n for (const refiner of refiners) {\n const compressedRefiner: (string | number)[] = [];\n for (const refinerKey of compressedRefinerKeys) {\n compressedRefiner.push(refiner[refinerKey]);\n }\n compressedRefiners.push(compressedRefiner);\n }\n\n return compressedRefiners;\n};\n\n/**\n * Build ListPage Url For RefineItem.\n * @param fullUrl - Full URL.\n * @param refiners - Array of IRefineItemData.\n * @param sortingColumns - Array of SortColumn.\n * @param skipCount - Skip count.\n * @returns - Returns the URL as string.\n */\nexport const buildListPageUrlForRefineItem = (\n fullUrl: URL,\n refiners?: IRefineItemData[],\n sortingColumns?: SortColumn[],\n skipCount?: number\n): string => {\n // Refiner Change flow\n if (refiners !== undefined) {\n if (!ArrayExtensions.hasElements(refiners)) {\n fullUrl.searchParams.delete('refiners');\n } else {\n const sortedRefiners = refiners.sort((first, second) =>\n first.refinerItemId && second.refinerItemId && first.refinerItemId > second.refinerItemId ? 1 : -1\n );\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\n }\n\n // Adding or removing a refiner means we want to always load page 1\n fullUrl.searchParams.delete('skip');\n return fullUrl.href;\n }\n\n if (sortingColumns !== undefined) {\n if (!ArrayExtensions.hasElements(sortingColumns)) {\n fullUrl.searchParams.delete('sorting');\n } else {\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\n }\n\n // Changing the sort means always load page 1\n fullUrl.searchParams.delete('skip');\n return fullUrl.href;\n }\n\n if (skipCount) {\n fullUrl.searchParams.set('skip', skipCount.toString());\n }\n\n return fullUrl.href;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentV2SwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\n\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\n/**\n * AttributeSwatch entity interface.\n */\ninterface IAttributeSwatch {\n swatchValue?: string;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n isDefault?: boolean;\n productImageUrls?: string[];\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * CommerceProperty entity interface.\n */\ninterface ICommerceProperty {\n propertyKey?: string;\n value?: IExtensionPropertyValue;\n}\n\n/**\n * Extension property value entity interface.\n */\ninterface IExtensionPropertyValue {\n isBooleanValue?: boolean;\n byteValue?: number;\n dateTimeOffsetValue?: Date;\n decimalValue?: number;\n integerValue?: number;\n longValue?: number;\n stringValue?: string;\n}\n\n/**\n * ProductDimension entity interface.\n */\ninterface IProductDimension {\n dimensionTypeValue: number;\n dimensionValue?: IProductDimensionValue;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * ProductDimensionValue entity interface.\n */\ninterface IProductDimensionValue {\n recordId: number;\n value?: string;\n dimensionId?: string;\n colorHexCode?: string;\n imageUrl?: string;\n refinerGroup?: string;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * ProductSearchResult entity interface.\n */\nexport interface IProductSearchResult {\n itemId?: string;\n name?: string;\n price: number;\n primaryImageUrl?: string;\n recordId: number;\n trackingId?: string;\n averageRating?: number;\n totalRatings?: number;\n description?: string;\n basePrice?: number;\n minVariantPrice?: number;\n maxVariantPrice?: number;\n displayOrder?: number;\n attributeValues?: IAttributeValue[];\n defaultUnitOfMeasure?: string;\n masterProductId?: number;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * AttributeValue entity interface.\n */\ninterface IAttributeValue {\n name?: string;\n keyName?: string;\n unitOfMeasureSymbol?: string;\n dataTypeValue?: number;\n isBooleanValue?: boolean;\n dateTimeOffsetValue?: Date;\n floatValue?: number;\n integerValue?: number;\n textValue?: string;\n currencyValue?: number;\n currencyCode?: string;\n attributeValueId?: number;\n recordId?: number;\n swatches?: IAttributeSwatch[];\n extensionProperties?: ICommerceProperty[];\n}\n\nexport interface IProductComponentV2Props extends IComponentProps<{ product?: IProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponentV2 extends IComponent {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultColorSwatchSelected(productData?: IProductSearchResult): IAttributeSwatch | null {\n if (!productData || !productData.attributeValues) {\n return null;\n }\n\n const colorAttribute = productData.attributeValues.find(\n attributeValue => attributeValue.keyName?.toLocaleLowerCase() === DimensionTypes.color\n );\n if (!colorAttribute) {\n return null;\n }\n\n const defaultSwatch = colorAttribute.swatches?.find(item => item.isDefault === true) ?? colorAttribute.swatches?.[0];\n return defaultSwatch ?? null;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: IProductSearchResult): string | undefined {\n const siteContext = coreContext as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productData?.primaryImageUrl;\n }\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.productImageUrls)\n ? generateImageUrl(defaultSwatch.productImageUrls[0], coreContext.request.apiSettings)\n : productData?.primaryImageUrl;\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n
    \n {unitOfMeasure}\n
    \n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n
    \n {inventoryAvailabilityLabel}\n
    \n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: IProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: IProductSearchResult\n): string | undefined {\n const siteContext = coreContext as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productUrl;\n }\n\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n if (!defaultSwatch || !defaultSwatch.swatchValue) {\n return productUrl;\n }\n\n const queryString = `color=${defaultSwatch.swatchValue}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCardV2: React.FC = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n\n let productUrl = getProductPageUrlSync(product?.name ?? '', product?.recordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.primaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === DimensionTypes.color) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: IAttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n
    \n {attributeValues.map((item: IAttributeValue) => {\n const dimensionTypeValue = item.keyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.swatches?.map(swatchItem => {\n return {\n itemId: `${item.recordId ?? ''}-${dimensionTypeValue}-${swatchItem.swatchValue ?? ''}`,\n value: swatchItem.swatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.swatchColorHexCode,\n imageUrl: swatchItem.swatchImageUrl,\n productImageUrls: swatchItem.productImageUrls,\n isDefault: swatchItem.isDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.swatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionToPreSelectInProductCard !== DimensionTypes.none &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault) &&\n dimensionType === DimensionTypes.color\n ) {\n swatches[0].isDefault = true;\n }\n return (\n \n );\n })}\n
    \n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: IProductDimension[] = selectedSwatchItems.getValues().map(swatches => {\n return {\n dimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n dimensionValue: {\n recordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.recordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n \n
    \n
    \n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.primaryImageUrl,\n product.name,\n context\n )}\n
    \n
    \n
    {product.name}
    \n {renderPrice(\n context,\n typeName,\n id,\n product.basePrice,\n product.price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.defaultUnitOfMeasure)}\n {renderDescription(product.description)}\n
    \n
    \n \n ) : (\n \n
    \n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.primaryImageUrl,\n product.name,\n context\n )}\n
    \n
    \n
    {product.name}
    \n {renderPrice(\n context,\n typeName,\n id,\n product.basePrice,\n product.price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.defaultUnitOfMeasure)}\n
    \n \n )}\n {renderProductDimensions(product.attributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.averageRating, product.totalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.recordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n \n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return

    {description}

    ;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n \n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources\n): JSX.Element | null {\n const price = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n \n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n \n );\n}\n\nexport const ProductComponentV2: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\n IProductComponentV2\n>('ProductV2', { component: ProductCardV2, ...PriceComponentActions });\n\nexport default ProductComponentV2;\n"],"names":["ChoiceSummaryComponent","msdyn365Commerce","createComponent","component","props","clearAllText","label","className","choiceAriaLabel","closeAriaLabel","data","selectedChoices","formatPrice","choiceFormat","choiceRangeValueFormat","onChoiceItemClicked","urlBuilder","payLoad","getPayloadObject","telemetryContent","onClick","React","selectedRefineItem","event","preventDefault","stopPropagation","targetChoiceItem","currentTarget","shouldClearAll","getAttribute","includes","nextItemToFocus","nextSibling","contentAction","etext","clearAllAttributes","getTelemetryAttributes","ArrayExtensions","hasElements","classnames","map","choiceItem","index","choiceItemName","activeRefinerItem","overallFormat","rangeFormat","refinerName","name","refinerValueName","isRangeType","dataTypeValue","replace","minValue","unitText","maxValue","getTagName","choiceItemAttribute","key","Object","assign","href","refinerItemId","role","minLabelClassName","maxLabelClassName","minInputClassName","maxInputClassName","minLabelId","maxLabelId","minInputLabelId","maxInputLabelId","getInputWithoutFormatting","input","inputAsNumber","Number","isNaN","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","sourceValue","isMatchingRefinementCriterion","FeatureSearchResultComponent","_product$name","_context$request$app","product","imageSettings","recommendation","context","resources","moduleResources","productName","productRecordId","recordId","productUrl","getProductPageUrlSync","actionContext","undefined","fallbackImage","getFallbackImageUrl","itemId","requestContext","apiSettings","request","app","config","OmniChannelMedia","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","attribute","onTelemetryClick","gridSettings","imageUrl","altText","image","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","primaryImageUrl","title","getInventoryLabel","channelInventoryConfigurationId","enableStockCheck","attributeValues","inventoryAttribute","textValue","ProductSearchResultItemsComponent","products","moduleType","moduleId","shouldAllowBackNavigation","quickViewSlot","productComparisonButton","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","ProductComponentV2","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","isAllowBack","id","typeName","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","RangeRefineInputFunctionalComponent","minRangeValue","maxRangeValue","isDisabled","inputMinLabel","inputMaxLabel","validationErrorRange","minInputAriaLabel","maxInputAriaLabel","onChangeMinValue","onChangeMaxValue","onBlurMinInput","onBlurMaxInput","selectedMinValue","setSelectedMinValue","selectedMaxValue","setSelectedMaxValue","validationErrorMessageForRange","setValidationErrorMessageForRange","formAttributes","changeValue","inputType","selectedKey","selectedFormattedValue","value","validateRange","minimum","maximum","htmlFor","type","onChange","onBlur","userSelectedMinValue","updatedMinInput","ref","minInput","placeholder","userSelectedMaxValue","updatedMaxInput","maxInput","RangeRefineInputComponent","RangeRefineSliderFunctionalComponent","sliderRangeMinVal","formatLabelString","sliderRangeMaxVal","onRangeChange","minValueSliderThumbAriaLabel","shouldShowLabels","maxValueSliderThumbAriaLabel","selectedSliderMinVal","selectedSliderMaxVal","sliderClassName","step","orientation","shouldShowTooltip","sliderKey","sliderId","refinerItemData","sliderLocalId","formattedMinValue","formattedMaxValue","sliderLabels","getSliderLabels","sliderThumbs","getSliderThumbs","ariaAttributes","Slider","inForm","min","max","labels","showLabels","showTooltip","onChangeEnd","sliderChangeNotification","firstThumbValue","secondThumbValue","eventType","handleTooltipText","tooltip","formatTooltipValue","defaultProps","RangeRefineSliderComponent","RefineRatingFunctionalComponent","refineItemUrl","avgRatingCount","ratingCountText","refineRatingName","productCount","isMobileView","onClickHandler","RatingComponent","avgRating","ratingCount","readOnly","ariaLabel","RefineRatingItemComponent","RefineSubMenuComponent","_ref","_refinerSubMenuData$n","refinerSubMenuData","selectedRefinerValues","subMenuClassName","onUpdateRefiners","expandSubMenuTimeout","shouldDisplaySwatchComponent","isExpandedOnInitialLoad","refineSubMenuAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","shouldRefinerExpand","setShouldRefinerExpand","isRefinerExpanded","setIsRefinerExpanded","onEntering","useCallback","onSliderUpdate","selectedRefinerItem","updatedMin","updatedMax","isSelecting","rangeStart","rangeEnd","onClickRefineItem","isChecked","onClickRating","hideRating","refinerTypeValue","onToggleSubmenu","getRefineItemAriaLabel","refinerItem","refinerSubMenuItem","_refinerItem$count","productText","count","refineMenuItemAriaLabel","format","getRefinerUrl","renderRefineItem","subMenuList","values","_refinerSubMenuData$k","dimensionType","keyName","isSingleSelectValue","RefinerType","SingleSelect","refinerUrl","RefinerItemComponent","isSingleSelect","swatchItems","text","push","colorHexCode","swatchColorHexCode","swatchImageUrl","SwatchComponent","list","isSelectionEnabled","isRefineItem","showSwatchComponent","Button","Collapse","isOpen","timeout","refineSubMenuData","rangeType","getRangeType","refineItem","_refineItem$minValue","_refineItem$maxValue","_selectedRefinementCr","_selectedRefinementCr2","selectedRefinementCriterion","StringExtensions","isNullOrEmpty","String","refinerSubMenuId","formatSliderLabel","formatSliderThumb","renderRangeRefineItem","_refinerItem$count2","noOfStars","parseInt","refinerRating","ratingRefiner","selectedRating","ratingComponentClass","RefinerItemFunctionalComponent","children","itemTypeClassName","refineItemAttributes","tabIndex","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","maxPrice","ariaValueText","sliderClassname","minPrice","labelId","labelString","labelPositioning","subMenuData","displayTemplateValue","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","isToggledItemFound","selectedCriterion","next","_objectSpread","Text","TrueFalse","child","matchingIndex","findIndex","criterion","splice","convertProductRefinerValueToRefinerItemData","refinerItems","productRefiner","_productRefiner$Refin","Count","DataTypeValue","RefinerRecordId","UnitText","rowNumber","RowNumber","RefinerSourceValue","SwatchColorHexCode","SwatchImageUrl","LeftValueBoundString","LeftValueBoundLocalizedString","RightValueBoundString","convertRefinerItemDataToProductRefinerValue","refineItemData","productRefinerValues","convertToRefinerItemData","_productRefinerValue$","temporaryRefinerItemData","refinerSourceValue","refinerRecordId","leftValueBoundString","rightValueBoundString","leftValueBoundLocalizedString","mapExtensionProperties","commerceProperties","extensionProperties","item","_item$value","_item$value2","_item$value3","_item$value4","_item$value5","_item$value6","_item$value7","Key","propertyKey","Value","ByteValue","byteValue","BooleanValue","isBooleanValue","DateTimeOffsetValue","dateTimeOffsetValue","DecimalValue","decimalValue","IntegerValue","integerValue","LongValue","longValue","StringValue","stringValue","mapSwatchValues","attributeSwatches","swatches","swatch","SwatchValue","swatchValue","IsDefault","isDefault","ProductImageUrls","productImageUrls","ExtensionProperties","mapAttributeValues","attributes","Name","KeyName","UnitOfMeasureSymbol","unitOfMeasureSymbol","FloatValue","floatValue","TextValue","CurrencyValue","currencyValue","CurrencyCode","currencyCode","AttributeValueId","attributeValueId","RecordId","Swatches","convertProductsToProductSearchResult","searchProducts","ItemId","Price","price","PrimaryImageUrl","AverageRating","averageRating","TotalRatings","totalRatings","Description","description","BasePrice","basePrice","MinVariantPrice","minVariantPrice","MaxVariantPrice","maxVariantPrice","AttributeValues","IsMasterProduct","isMasterProduct","MasterProductId","DefaultUnitOfMeasure","defaultUnitOfMeasure","convertToRefinerSubMenuHierarchyData","productRefinerHierarchyArray","subMenuArray","productRefinerHierarchy","isDimension","getDefaultColorSwatchSelected","productData","_colorAttribute$swatc","_colorAttribute$swatc2","_colorAttribute$swatc3","colorAttribute","attributeValue","_attributeValue$keyNa","toLocaleLowerCase","DimensionTypes","color","defaultSwatch","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","search","pathname","renderProductUnitOfMeasure","unitOfMeasure","renderLabel","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","reviewCountArialableText","getReviewAriaLabel","getRatingAriaLabel","roundedRating","toFixed","renderPrice","adjustedPrice","savingsText","AdjustedPrice","CustomerContextualPrice","PriceComponent","fallbackImageUrl","_context$app$config","contextConfig","placeholderImageName","fallbackImageSource","img","cropFocalRegion","bypassHideOnFailure","createComponentOverride","_product$recordId","_getProductImageUrlFr","_getProductPageUrlFro","ratingCountAriaLabel","allowBack","isEnabledProductDescription","MIN_VALUE","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","none","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","useState","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","updatePageAndImageUrl","swatchItem","setValue","isNullOrWhitespace","productPageUrlWithSwatch","newUrl","searchParams","delete","swatchProductImageUrl","newImageUrl","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","cultureFormatter","formatCurrency","_item$keyName$toLocal","_item$keyName","_item$swatches$map","_item$swatches","dimensionTypeValue","dimensionsToDisplayOnProductCard","dimensionsInProductCard","shouldDisplayDimension","_item$recordId","_swatchItem$swatchVal","_swatchItem$swatchVal2","_dimensionAvailabilit","_swatchItem$swatchVal3","some","ProductComponentV2SwatchComponent","onSelectDimension","moduleTypeName","numberRatings","renderRating","inventoryAvailabilityLabel","quickview","selectedDimensions","getValues","convertDimensionTypeToProductDimensionType","dimensionValue","selectedProductId","renderQuickView","catalogId","validateCatalogId","renderProductComparisonButton","getCatalogId"],"sourceRoot":""}