{"version":3,"file":"static/js/c17422fc364ccb1c361e.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/choice-summary.tsx?d7c1","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/error-message.tsx?85a2","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/feature-search-result-item.tsx?9100","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/link.tsx?9928","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/modal.tsx?3872","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/product-search-result-items.tsx?46b8","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/separator.tsx?582f","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/title.tsx?87cc","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/range-refine-item.tsx?a8a6","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/refine-item.tsx?eaea","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/refine-submenu.tsx?a369","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/components/utilities.ts?1066"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\n// import { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\n// import { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\nimport { isMatchingRefinementCriterion, ProductRefinerValueDataTypeValue } from './utilities';\r\nimport get from 'lodash/get';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.Component {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n private payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, FilterActiveText } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && {FilterActiveText} }\r\n {items.length > 0 && label && {label}}\r\n
    \r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && (\r\n \r\n {clearAllText}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n const leftRefinerPrice = this._formatPrice(productRefinerValue.LeftValueBoundString, this.props.context?.request.channel?.Currency);\r\n const rightRefinerPrice = this._formatPrice(\r\n productRefinerValue.RightValueBoundString,\r\n this.props.context?.request.channel?.Currency\r\n );\r\n switch (productRefinerValue.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n refinerValueName = rangeFormat.replace('{0}', leftRefinerPrice).replace('{1}', rightRefinerPrice);\r\n break;\r\n default:\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
\r\n {` `}\r\n {text}\r\n {` `}\r\n
\r\n
\r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\n\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IDobbiesSearchResultContainerResources } from '../dobbies-search-result-container.props.autogenerated';\r\n// import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IDobbiesSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage\r\n )}\r\n
\r\n \r\n
\r\n

{resources.featureSimilarLooksTitle}

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n altText?: string,\r\n fallbackImage?: string\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return ;\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return

{title}

;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n \r\n {' '}\r\n {text}{' '}\r\n \r\n);\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return {props.resources.modalTitle};\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\n/* eslint-disable security/detect-object-injection */\r\n\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport {\r\n ProductSearchResult,\r\n ProductWarehouseInventoryAvailability,\r\n DiscountLine,\r\n CommerceList,\r\n LoyaltyCard,\r\n ProductPrice\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getDeliveryOptionsAsync,\r\n getEstimatedAvailabilityAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport React, { useState, useEffect } from 'react';\r\nimport { ProductComponent } from '../../../themes/dobbies/views/components/product.component';\r\nimport {\r\n IDobbiesSearchResultContainerResources,\r\n IDobbiesSearchResultContainerConfig,\r\n ITilesForPLPData\r\n} from '../dobbies-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IDobbiesSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n discountLines?: (DiscountLine[] | undefined)[];\r\n config?: IDobbiesSearchResultContainerConfig;\r\n showProdPrice?: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n isMobile?: boolean;\r\n loyalty?: LoyaltyCard;\r\n nonClubPlusDiscount?: ProductPrice[];\r\n tilesForPLP?: ITilesForPLPData[];\r\n showTilesOnPLP?: boolean;\r\n repeatSameTile?: boolean;\r\n maxNumberOfTiles?: number;\r\n tileToAppearAfterProducts?: number;\r\n}\r\n\r\nexport interface IProductWithModes extends ProductSearchResult {\r\n isCnC: boolean;\r\n isHomeDelivery: boolean;\r\n clubPlusBanner?: boolean;\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n // isPriceMinMaxEnabled,\r\n isMobile,\r\n wishlists,\r\n discountLines,\r\n config,\r\n showProdPrice,\r\n loyalty,\r\n nonClubPlusDiscount,\r\n tilesForPLP,\r\n showTilesOnPLP,\r\n repeatSameTile,\r\n maxNumberOfTiles,\r\n tileToAppearAfterProducts\r\n}) => {\r\n /* Defaulting to show false on both icons while we load the API */\r\n const productWithTempDeliveryModes = products.map(prod => {\r\n return { ...prod, isCnC: false, isHomeDelivery: false, clubPlusBanner: false };\r\n });\r\n\r\n const [productsWithDelivery, setProductsWithDelivery] = useState(productWithTempDeliveryModes);\r\n const {\r\n requestContext: {\r\n app: {\r\n config: { fulfillmentAttributeName, fulfillmentAttributeTextValue }\r\n }\r\n }\r\n } = context.actionContext;\r\n\r\n /* VSI Customization - START 14/10/2021 - Method to get Delivery Options and check availability of plant and non plant products */\r\n // @ts-ignore\r\n const getDeliveries = async () => {\r\n const attributeName = fulfillmentAttributeName\r\n ? fulfillmentAttributeName\r\n .toString()\r\n .toLowerCase()\r\n .trim()\r\n : 'fulfillmenttype';\r\n const attributeTextValue = fulfillmentAttributeTextValue\r\n ? fulfillmentAttributeTextValue\r\n .toString()\r\n .toLowerCase()\r\n .trim()\r\n : 'plants';\r\n\r\n const plantProducts: ProductSearchResult[] = [];\r\n const nonPlantProducts: ProductSearchResult[] = [];\r\n\r\n products.map(product => {\r\n const fulfillmentTypeAttribute =\r\n product.AttributeValues &&\r\n product.AttributeValues.find(attribute => {\r\n return attribute?.Name?.toLowerCase() === attributeName;\r\n });\r\n const isPlantFulfillment = fulfillmentTypeAttribute && fulfillmentTypeAttribute.TextValue?.toLowerCase() === attributeTextValue;\r\n const isPlantCategory = isPlantFulfillment ? true : false;\r\n\r\n if (isPlantCategory) {\r\n plantProducts.push(product);\r\n } else {\r\n nonPlantProducts.push(product);\r\n }\r\n });\r\n const nonKitProducts = products.filter(prod => prod.IsMasterProduct === false);\r\n const prodIds = nonKitProducts.map(prod => prod.RecordId);\r\n\r\n // If there are no products, do not make any api calls\r\n if (prodIds.length <= 0) {\r\n return;\r\n }\r\n\r\n const deliveryOptions = await getDeliveryOptionsAsync({ callerContext: context.actionContext, queryResultSettings: {} }, prodIds);\r\n\r\n // Plants API since the warehouse storage is different\r\n const productAvailabilitesPlants = await getEstimatedAvailabilityAsync(\r\n { callerContext: context.actionContext },\r\n { ProductIds: prodIds, DefaultWarehouseOnly: false, FilterByChannelFulfillmentGroup: true }\r\n );\r\n\r\n const productsWithPlantsDelivery: IProductWithModes[] = await Promise.all(\r\n plantProducts.map(async prod => {\r\n let isCnC = false;\r\n let isHomeDelivery = false;\r\n const onlyInStoreVal = prod.AttributeValues?.find(\r\n attr => attr.Name?.toLocaleLowerCase() === 'onlyinstore'\r\n )?.TextValue?.toLowerCase();\r\n if (productAvailabilitesPlants && productAvailabilitesPlants.ProductWarehouseInventoryAvailabilities) {\r\n productAvailabilitesPlants.ProductWarehouseInventoryAvailabilities?.map(\r\n (item: ProductWarehouseInventoryAvailability) => {\r\n if (\r\n (item.InventLocationId === 'P001' || item.InventLocationId === 'S059') &&\r\n item.ProductId === prod.RecordId\r\n ) {\r\n if (item.PhysicalAvailableInventoryLevelCode !== 'OOS') {\r\n isHomeDelivery = true;\r\n }\r\n } else {\r\n if (item.PhysicalAvailableInventoryLevelCode !== 'OOS' && item.ProductId === prod.RecordId) {\r\n deliveryOptions\r\n .find(option => option.ProductId === prod.RecordId)\r\n ?.DeliveryOptions?.map(option => {\r\n if (option.Code === 'ClickCol') {\r\n isCnC = true;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n // If product has vendorship === \"yes\" then show it as available\r\n const isVendorShipAttribute = prod.AttributeValues?.find(attribute => {\r\n const attributeName = attribute.Name && attribute.Name.trim().toLowerCase();\r\n return attributeName === 'isvendershipproduct';\r\n });\r\n\r\n if (isVendorShipAttribute && isVendorShipAttribute.TextValue && isVendorShipAttribute.TextValue.toLowerCase() === 'yes') {\r\n isHomeDelivery = true;\r\n isCnC = false;\r\n }\r\n if (onlyInStoreVal === 'yes' && isCnC) {\r\n isHomeDelivery = false;\r\n }\r\n return { ...prod, isHomeDelivery, isCnC };\r\n })\r\n );\r\n\r\n // Not Plants API since the warehouse storage is different\r\n const productAvailabilitesNonPlantsHD = await getEstimatedAvailabilityAsync(\r\n { callerContext: context.actionContext },\r\n { ProductIds: prodIds, DefaultWarehouseOnly: true, FilterByChannelFulfillmentGroup: false }\r\n );\r\n const productAvailabilitesNonPlantsCNC = await getEstimatedAvailabilityAsync(\r\n { callerContext: context.actionContext },\r\n { ProductIds: prodIds, DefaultWarehouseOnly: false, FilterByChannelFulfillmentGroup: true }\r\n );\r\n\r\n const productsWithNonPlantsDelivery: IProductWithModes[] = await Promise.all(\r\n nonPlantProducts.map(async prod => {\r\n let isCnC = false;\r\n let isHomeDelivery = false;\r\n const onlyInStoreVal = prod.AttributeValues?.find(\r\n attr => attr.Name?.toLocaleLowerCase() === 'onlyinstore'\r\n )?.TextValue?.toLowerCase();\r\n if (productAvailabilitesNonPlantsHD && productAvailabilitesNonPlantsHD.AggregatedProductInventoryAvailabilities) {\r\n productAvailabilitesNonPlantsHD.AggregatedProductInventoryAvailabilities.map(stores => {\r\n if (stores.ProductId === prod.RecordId && stores.PhysicalAvailableInventoryLevelCode !== 'OOS') {\r\n isHomeDelivery = true;\r\n }\r\n });\r\n }\r\n\r\n if (productAvailabilitesNonPlantsCNC && productAvailabilitesNonPlantsCNC.AggregatedProductInventoryAvailabilities) {\r\n productAvailabilitesNonPlantsCNC.AggregatedProductInventoryAvailabilities.map(stores => {\r\n if (stores.ProductId === prod.RecordId && stores.PhysicalAvailableInventoryLevelCode !== 'OOS') {\r\n deliveryOptions\r\n .find(option => option.ProductId === prod.RecordId)\r\n ?.DeliveryOptions?.map(option => {\r\n if (option.Code === 'ClickCol') {\r\n isCnC = true;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // If product has vendorship === \"yes\" then show it as available\r\n const isVendorShipAttribute = prod.AttributeValues?.find(attribute => {\r\n const attributeName = attribute.Name && attribute.Name.trim().toLowerCase();\r\n return attributeName === 'isvendershipproduct';\r\n });\r\n\r\n if (isVendorShipAttribute && isVendorShipAttribute.TextValue && isVendorShipAttribute.TextValue.toLowerCase() === 'yes') {\r\n isHomeDelivery = true;\r\n isCnC = false;\r\n }\r\n if (onlyInStoreVal === 'yes' && isCnC) {\r\n isHomeDelivery = false;\r\n }\r\n return { ...prod, isHomeDelivery, isCnC };\r\n })\r\n );\r\n\r\n const totalProducts = [...productsWithPlantsDelivery, ...productsWithNonPlantsDelivery];\r\n const allProducts: any = [];\r\n products.map(prod => {\r\n totalProducts.find(item => {\r\n if (item.RecordId === prod.RecordId) {\r\n allProducts.push(item);\r\n }\r\n });\r\n });\r\n setProductsWithDelivery(allProducts);\r\n };\r\n\r\n useEffect(() => {\r\n const productWithTempDeliveryModes = products.map(prod => {\r\n return { ...prod, isCnC: false, isHomeDelivery: false, clubPlusBanner: false };\r\n });\r\n\r\n setProductsWithDelivery(productWithTempDeliveryModes);\r\n getDeliveries();\r\n }, [products]);\r\n\r\n const showClubPlusBanner = (prodId: number): void => {\r\n const newArr = [...productsWithDelivery];\r\n newArr &&\r\n newArr.map(val => {\r\n if (val.RecordId === prodId) {\r\n val.clubPlusBanner = true;\r\n } else {\r\n val.clubPlusBanner = false;\r\n }\r\n });\r\n setProductsWithDelivery(newArr);\r\n };\r\n\r\n const hideClubPlusBanner = (prodId: number): void => {\r\n const newArr = [...productsWithDelivery];\r\n newArr &&\r\n newArr.map(val => {\r\n if (val.RecordId === prodId) {\r\n val.clubPlusBanner = false;\r\n }\r\n });\r\n setProductsWithDelivery(newArr);\r\n };\r\n\r\n const getIndexesForTilesToAppear = (tilesForPLP: ITilesForPLPData[]): number[] => {\r\n const indexes: number[] = [];\r\n for (let i = 0; i < tilesForPLP.length; i++) {\r\n const cuurTileIndex = tilesForPLP[i].currentTileShouldAppearAfterProducts;\r\n if (cuurTileIndex) {\r\n indexes.push(cuurTileIndex);\r\n }\r\n }\r\n return indexes;\r\n };\r\n\r\n const getTileForIndex = (index: number, listOfIndexes: number[], shouldTheTileRepeat: boolean): JSX.Element => {\r\n const productClass = 'ms-product-search-result__item';\r\n if (shouldTheTileRepeat && tilesForPLP && tilesForPLP.length) {\r\n return (\r\n
  • \r\n
    \r\n \r\n
    \r\n
  • \r\n );\r\n }\r\n for (let q = 0; q < listOfIndexes.length; q++) {\r\n if (listOfIndexes[q] === index) {\r\n if (tilesForPLP && q < tilesForPLP?.length) {\r\n return (\r\n
  • \r\n
    \r\n \r\n
    \r\n
  • \r\n );\r\n }\r\n }\r\n }\r\n return <>;\r\n };\r\n const productClass = 'ms-product-search-result__item';\r\n if (showTilesOnPLP && tilesForPLP && tilesForPLP.length) {\r\n let numOfTilesShown = 0;\r\n const productsList: JSX.Element[] = [];\r\n const indexesForTilesToAppear = getIndexesForTilesToAppear(tilesForPLP);\r\n for (let b = 0; b < productsWithDelivery.length; b++) {\r\n if (repeatSameTile && tileToAppearAfterProducts && maxNumberOfTiles && b > 0) {\r\n const quotient = b / tileToAppearAfterProducts;\r\n const isRepeatTileIndex = quotient % 1 === 0;\r\n if (isRepeatTileIndex && numOfTilesShown < maxNumberOfTiles) {\r\n const elem = getTileForIndex(b, indexesForTilesToAppear, repeatSameTile ? repeatSameTile : false);\r\n numOfTilesShown++;\r\n productsList.push(elem);\r\n }\r\n } else if (indexesForTilesToAppear.includes(b)) {\r\n const elem = getTileForIndex(b, indexesForTilesToAppear, repeatSameTile ? repeatSameTile : false);\r\n numOfTilesShown++;\r\n productsList.push(elem);\r\n }\r\n const product = productsWithDelivery[b];\r\n const productElem = (\r\n
  • \r\n 0 ? discountLines[b] : []}\r\n badgeLink={config && config.clubPlusBadgeLink}\r\n showProdPrice={showProdPrice}\r\n showBanner={showClubPlusBanner}\r\n hideBanner={hideClubPlusBanner}\r\n quickViewButton={quickviewSlot}\r\n wishlists={wishlists}\r\n isMobile={isMobile}\r\n loyalty={loyalty}\r\n nonClubPlusDiscount={nonClubPlusDiscount?.filter(item => item.ProductId === product.RecordId)[0]}\r\n />\r\n
  • \r\n );\r\n productsList.push(productElem);\r\n }\r\n return
      {productsList}
    ;\r\n }\r\n return (\r\n
      \r\n {productsWithDelivery &&\r\n productsWithDelivery.map((product: IProductWithModes, index: number) => {\r\n return (\r\n
    • \r\n 0 ? discountLines[index] : []}\r\n badgeLink={config && config.clubPlusBadgeLink}\r\n showProdPrice={showProdPrice}\r\n showBanner={showClubPlusBanner}\r\n hideBanner={hideClubPlusBanner}\r\n quickViewButton={quickviewSlot}\r\n wishlists={wishlists}\r\n isMobile={isMobile}\r\n loyalty={loyalty}\r\n nonClubPlusDiscount={nonClubPlusDiscount?.filter(item => item.ProductId === product.RecordId)[0]}\r\n />\r\n
    • \r\n );\r\n })}\r\n
    \r\n );\r\n /* VSI Customization - END */\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => (\r\n \r\n {` `}\r\n {separator}\r\n {` `}\r\n \r\n);\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => (\r\n \r\n {` `}\r\n {text}\r\n {` `}\r\n \r\n);\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.context.request.channel?.Currency || this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const minPrice = this._formatPrice(selectedMin);\r\n const maxPrice = this._formatPrice(selectedMax);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return [\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ];\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (\r\n sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string\r\n ): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return [\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ];\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
    \r\n \r\n \r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n
    \r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\n\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { /* ProductRefinerSource, */ ProductRefinerValue /* , RefinerType */ } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu)\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private anchorType: React.RefObject;\r\n private payLoad: IPayLoad;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n // tslint:disable-next-line:max-func-body-length\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n /* const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect; */\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n const selectedRating = parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n this.payLoad.contentAction.etext =\r\n productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const isColourMenu =\r\n String(parentProductRefinerHierarchy.KeyName).includes('Colour') ||\r\n String(parentProductRefinerHierarchy.KeyName).includes('Color');\r\n const colorClassname = String(\r\n productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString\r\n ).toLowerCase();\r\n return (\r\n \r\n \r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\nimport { IDobbiesRefinerExpandedState } from '../dobbies-search-result-container';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n isMobile?: boolean;\r\n refinersExpandedStateData?: IDobbiesRefinerExpandedState[][];\r\n onToggle?(refinerRecId: string | undefined, isExpanded: boolean): void;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n //const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // if (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n // expanded: isExpanded\r\n expanded: true\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(prevProps: IRefineSubmenuProps, prevState: IRefineSubmenuState): void {\r\n if (prevProps.refinersExpandedStateData && this.props.refinersExpandedStateData && this.props.refinersExpandedStateData.length) {\r\n for (let i = 0; i < this.props.refinersExpandedStateData.length; i++) {\r\n for (let j = 0; j < this.props.refinersExpandedStateData[i].length; j++) {\r\n if (\r\n prevProps.refinersExpandedStateData[i][j].keyName === this.props.productRefinerHierarchy.KeyName &&\r\n this.state.expanded !== this.props.refinersExpandedStateData[i][j].isExpanded\r\n ) {\r\n this.setState({ expanded: this.props.refinersExpandedStateData[i][j].isExpanded });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\r\n return null;\r\n }\r\n // VSI CUSTOMIZATION START\r\n const currentUrl = this.props.context.request.url.requestUrl.pathname;\r\n if (currentUrl.includes('edits')) {\r\n if (productRefinerHierarchy.KeyName === 'Category') {\r\n return null;\r\n }\r\n } else {\r\n if (productRefinerHierarchy.KeyName === 'Department') {\r\n return null;\r\n }\r\n }\r\n // VSI CUSTOMIZATION END\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n
    {this._renderChildItems(productRefinerHierarchy)}
    \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n />\r\n );\r\n });\r\n return (\r\n \r\n {listItems}\r\n \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n if (this.props.onToggle) {\r\n this.props.onToggle(this.props.productRefinerHierarchy.KeyName, !this.state.expanded);\r\n }\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry\r\n): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency: currency,\r\n minimumFractionDigits: 2\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}\r\n"],"names":["ChoiceSummary","React","constructor","props","super","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","target","currentTarget","clearAll","getAttribute","indexOf","selectedRefiner","undefined","this","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","telemetryContent","selectedChoices","map","key","_getKeyForRefinerValue","value","render","clearAllText","label","classNames","choiceAriaLabel","FilterActiveText","items","selectedRefinersMap","contentAction","etext","clearAllAttributes","getTelemetryAttributes","className","length","classnames","item","index","listItemProps","attribute","Object","assign","href","urlBuilder","onClick","productRefinerValue","_this$props$context","_this$props$context2","choiceFormat","choiceRangeValueFormat","refinerHierarchy","telemetry","overallFormat","rangeFormat","refinerValueName","refinerName","find","parent","hierarchy","Values","isMatchingRefinementCriterion","KeyName","warning","leftRefinerPrice","_formatPrice","LeftValueBoundString","context","request","channel","Currency","rightRefinerPrice","RightValueBoundString","DataTypeValue","ProductRefinerValueDataTypeValue","Range","RangeInput","replace","LeftValueBoundLocalizedString","amount","currency","trace","priceAmount","Number","locale","get","result","Intl","NumberFormat","style","currencyDisplay","minimumFractionDigits","format","selected","innerText","trim","__decorate","computed","observer","ErrorMessage","_ref","text","FeatureSearchResultItem","product","imageSettings","resources","productName","Name","productRecordId","RecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","requestContext","apiSettings","toString","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","PrimaryImageUrl","featureSimilarLooksTitle","title","Link","ariaLabel","ModalToggle","innerRef","id","ref","SearchResultModal","modal","modalNode","modalHeader","modalHeaderNode","modalFooter","modalFooterNode","modalBody","ModalBody","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","ModalHeader","modalTitle","ModalFooter","Button","modalCloseButtonText","getInventoryLabel","channelInventoryConfigurationId","ArrayExtensions","hasElements","AttributeValues","inventoryAttribute","TextValue","ProductSearchResultItems","products","moduleType","moduleId","allowBackNavigation","quickviewSlot","isMobile","wishlists","discountLines","config","showProdPrice","loyalty","nonClubPlusDiscount","tilesForPLP","showTilesOnPLP","repeatSameTile","maxNumberOfTiles","tileToAppearAfterProducts","productWithTempDeliveryModes","prod","_objectSpread","isCnC","isHomeDelivery","clubPlusBanner","productsWithDelivery","setProductsWithDelivery","useState","app","fulfillmentAttributeName","fulfillmentAttributeTextValue","useEffect","async","attributeName","toLowerCase","attributeTextValue","plantProducts","nonPlantProducts","_fulfillmentTypeAttri","fulfillmentTypeAttribute","_attribute$Name","push","prodIds","filter","IsMasterProduct","deliveryOptions","getDeliveryOptionsAsync","callerContext","queryResultSettings","productAvailabilitesPlants","getEstimatedAvailabilityAsync","ProductIds","DefaultWarehouseOnly","FilterByChannelFulfillmentGroup","productsWithPlantsDelivery","Promise","all","_prod$AttributeValues","_prod$AttributeValues2","onlyInStoreVal","attr","_attr$Name","toLocaleLowerCase","_productAvailabilites","ProductWarehouseInventoryAvailabilities","_deliveryOptions$find","InventLocationId","ProductId","PhysicalAvailableInventoryLevelCode","option","DeliveryOptions","Code","isVendorShipAttribute","productAvailabilitesNonPlantsHD","productAvailabilitesNonPlantsCNC","totalProducts","_prod$AttributeValues3","_prod$AttributeValues4","_attr$Name2","AggregatedProductInventoryAvailabilities","stores","_deliveryOptions$find2","allProducts","getDeliveries","showClubPlusBanner","prodId","newArr","val","hideClubPlusBanner","getTileForIndex","listOfIndexes","shouldTheTileRepeat","productClass","urlForTileClick","display","outline","nameForTile","q","numOfTilesShown","productsList","indexesForTilesToAppear","indexes","i","cuurTileIndex","currentTileShouldAppearAfterProducts","getIndexesForTilesToAppear","b","elem","includes","productElem","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","data","inventoryLabel","discountLine","badgeLink","clubPlusBadgeLink","showBanner","hideBanner","quickViewButton","Separator","separator","Title","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","parentProductRefinerHierarchy","RefinerRecordId","minValue","maxValue","labels","sliderKeyString","sliderThumbs","state","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","_this$props$context$r","UnitText","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","error","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","setState","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","event","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","isSelecting","rangeStart","rangeEnd","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","cultureFormatter","formatCurrency","input","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","RefineItem","anchorType","_this$props","children","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","RefinerTypeValue","ProductRefinerTypeValue","Single","itemTypeClassName","SourceValue","ProductRefinerSource","Rating","isColourMenu","colorClassname","_getRefinerUrl","tabIndex","role","Count","_productRefinerValue$","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RefineSubmenu","_onToggleItem","_onToggleSubmenu","expanded","prevProps","prevState","refinersExpandedStateData","j","keyName","productRefinerHierarchy","isExpanded","hideRating","url","requestUrl","pathname","_renderChildItems","isRangeType","_renderRange","_renderSingleMultiSelect","RefinerType","SingleSelect","refinerValuesList","listItems","child","findMatchingRefinementCriterion","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","SliderWithBars","itemToggleNotification","onUpdateRefiners","dataTypeValue","AttributeDataType","Decimal","Integer","refinementCriteria","refinementCriterion","RefinerSourceValue","getUpdatedRefinementCriteria","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","next","Text","TrueFalse","matchingIndex","findIndex","criterion","splice"],"sourceRoot":""}