{"version":3,"file":"static/js/7e09849bb6221372dc1f.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} 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}\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}) => {\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) {\r\n /* VSI Customization - START - Check PreSale product attribute for TotalAvailable */\r\n const isPreSale = prod?.AttributeValues?.find(\r\n ({ Name, TextValue }) => Name?.trim()?.toLowerCase() === 'presale' && TextValue === 'Yes'\r\n );\r\n const inventoryLevelCode = isPreSale\r\n ? stores.TotalAvailableInventoryLevelCode\r\n : stores.PhysicalAvailableInventoryLevelCode;\r\n if (inventoryLevelCode !== 'OOS') {\r\n isHomeDelivery = true;\r\n }\r\n /* VSI-Customization -- END */\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 /* VSI Customization - END */\r\n\r\n const productClass = 'ms-product-search-result__item';\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};\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","isPriceMinMaxEnabled","isMobile","wishlists","discountLines","config","showProdPrice","loyalty","nonClubPlusDiscount","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$AttributeValues5","_attr$Name2","AggregatedProductInventoryAvailabilities","stores","_prod$AttributeValues4","_ref2","_Name$trim","TotalAvailableInventoryLevelCode","_deliveryOptions$find2","allProducts","getDeliveries","showClubPlusBanner","prodId","newArr","val","hideClubPlusBanner","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","_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","includes","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","i","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":""}