{"version":3,"file":"static/js/4333432d80cebf9169eb.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(product.itemId, context.actionContext.requestContext.apiSettings);\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n
\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(channelInventoryConfigurationId: number | undefined, product: IProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.attributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.attributeValues.find(attribute => attribute.recordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.textValue;\n }\n return undefined;\n}\n\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} 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 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","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","classnames","map","choiceItem","index","choiceItemName","activeRefinerItem","overallFormat","rangeFormat","refinerName","name","refinerValueName","isRangeType","dataTypeValue","replace","minValue","unitText","maxValue","getTagName","choiceItemAttribute","key","href","refinerItemId","role","minLabelClassName","maxLabelClassName","minInputClassName","maxInputClassName","minLabelId","maxLabelId","minInputLabelId","maxInputLabelId","getInputWithoutFormatting","input","inputAsNumber","Number","isNaN","AttributeDataType","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","find","refinementCriterion","sourceValue","isMatchingRefinementCriterion","FeatureSearchResultComponent","product","imageSettings","recommendation","context","resources","moduleResources","productName","productRecordId","recordId","productUrl","getProductPageUrlSync","actionContext","undefined","fallbackImage","getFallbackImageUrl","itemId","requestContext","apiSettings","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","toString","attribute","onTelemetryClick","gridSettings","imageUrl","altText","image","src","imageProps","fallBackSrc","Image","Object","loadFailureBehavior","renderProductPlacementImage","request","primaryImageUrl","title","getInventoryLabel","channelInventoryConfigurationId","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","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","app","config","hideRating","refinerTypeValue","onToggleSubmenu","getRefineItemAriaLabel","refinerItem","refinerSubMenuItem","productText","count","refineMenuItemAriaLabel","format","getRefinerUrl","renderRefineItem","subMenuList","values","dimensionType","keyName","isSingleSelectValue","RefinerType","refinerUrl","RefinerItemComponent","isSingleSelect","swatchItems","text","push","colorHexCode","swatchColorHexCode","swatchImageUrl","SwatchComponent","list","isSelectionEnabled","isRefineItem","showSwatchComponent","Button","Collapse","isOpen","timeout","refineSubMenuData","rangeType","getRangeType","refineItem","selectedRefinementCriterion","StringExtensions","String","refinerSubMenuId","formatSliderLabel","formatSliderThumb","renderRangeRefineItem","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","child","matchingIndex","findIndex","criterion","splice","convertProductRefinerValueToRefinerItemData","refinerItems","productRefiner","Count","DataTypeValue","RefinerRecordId","UnitText","rowNumber","RowNumber","RefinerSourceValue","SwatchColorHexCode","SwatchImageUrl","LeftValueBoundString","LeftValueBoundLocalizedString","RightValueBoundString","convertRefinerItemDataToProductRefinerValue","refineItemData","productRefinerValues","convertToRefinerItemData","temporaryRefinerItemData","refinerSourceValue","refinerRecordId","leftValueBoundString","rightValueBoundString","leftValueBoundLocalizedString","mapExtensionProperties","commerceProperties","extensionProperties","item","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","attributeValue","toLocaleLowerCase","DimensionTypes","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","contextConfig","placeholderImageName","fallbackImageSource","img","cropFocalRegion","bypassHideOnFailure","ratingCountAriaLabel","allowBack","isEnabledProductDescription","MIN_VALUE","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","useState","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","enableStockCheck","updatePageAndImageUrl","swatchItem","setValue","productPageUrlWithSwatch","newUrl","searchParams","delete","swatchProductImageUrl","newImageUrl","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","cultureFormatter","formatCurrency","dimensionTypeValue","dimensionsToDisplayOnProductCard","dimensionsInProductCard","shouldDisplayDimension","some","ProductComponentV2SwatchComponent","onSelectDimension","moduleTypeName","numberRatings","renderRating","inventoryAvailabilityLabel","quickview","selectedDimensions","getValues","convertDimensionTypeToProductDimensionType","dimensionValue","selectedProductId","renderQuickView","catalogId","renderProductComparisonButton","getCatalogId"],"sourceRoot":""}