{"version":3,"file":"static/js/5b25302b7ec2c57350c7.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/Utilities/product-search-result-utils.tsx?58f2","webpack://mattressfirm/./src/themes/mattressfirm/views/components/delivery-message/deliverymessage.component.tsx?e440","webpack://mattressfirm/./src/themes/mattressfirm/views/components/product.component.tsx?8ce2","webpack://mattressfirm/./src/Utilities/convert-to-titlecase.ts?8d6f"],"sourcesContent":["import { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport dayjs from 'dayjs';\r\nimport Cookies from 'universal-cookie';\r\nimport { IMFIATPInventoryEntity, IMFICartLine, IMFICLDeliveryScheduleParameters } from '../actions/CoreProductDataServiceEntities.g';\r\nimport { IMFIAvailablePromotionDescription, IMFIItem } from '../actions/EyebrowMessageDataServiceEntities.g';\r\nimport getEyebrowAction, { GetEyebrowMessageInput } from '../actions/get-eyebrow-message.action';\r\nimport _getDeliveryByMessage from './get-delivery-by-message';\r\nimport { IMFIATPInventoryEntityPLP } from '../actions/BatchCoreProductDataServiceEntities.g';\r\n\r\nexport const _getEyebrowMessage = async (products: IMFIItem[], context: ICoreContext>) => {\r\n const priceGroupForAPICall = context.app && context.app.config.priceGroup;\r\n if (products && products.length > 0 && (priceGroupForAPICall !== '' || priceGroupForAPICall !== undefined)) {\r\n const items: IMFIItem[] | undefined = [];\r\n products.map(item => {\r\n const singleItem: IMFIItem = {\r\n ItemId: item.ItemId,\r\n DistinctProductVariant: item.DistinctProductVariant\r\n };\r\n items.push(singleItem);\r\n });\r\n\r\n const requestBody: IMFIAvailablePromotionDescription = {\r\n PriceGroup: priceGroupForAPICall,\r\n Items: items\r\n };\r\n const getEyebrowMessageInput = new GetEyebrowMessageInput(requestBody, undefined, true);\r\n try {\r\n const result = await getEyebrowAction(getEyebrowMessageInput, context.actionContext);\r\n if (result) {\r\n return result;\r\n }\r\n } catch (error) {\r\n console.log('Error', error);\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport const _makeDeliveryMessage = (days: string) => {\r\n if (days === '' || days === undefined || days === null) {\r\n return '';\r\n }\r\n\r\n let deliveryByMessage = '';\r\n let date = new Date();\r\n const daysSpan = days.split('-');\r\n let deliveryDate = Date.now();\r\n if (daysSpan && daysSpan[1] !== undefined && daysSpan.length) {\r\n let deliveryByMessageRange = '';\r\n daysSpan.map((item: string) => {\r\n date = new Date();\r\n deliveryDate = Date.now();\r\n if (parseInt(item, 10) > 0) {\r\n let numberOfDays = parseInt(item, 10);\r\n let newDate = deliveryDate;\r\n while (numberOfDays > 0) {\r\n newDate = date.setDate(date.getDate() + 1);\r\n if (dayjs(newDate).format('d') !== '0' && dayjs(newDate).format('d') !== '6') {\r\n numberOfDays--;\r\n }\r\n }\r\n deliveryByMessage = dayjs(newDate).format('MMM D');\r\n if (deliveryByMessageRange !== '') {\r\n deliveryByMessageRange = `${deliveryByMessageRange} to ${deliveryByMessage}`;\r\n } else {\r\n deliveryByMessageRange = deliveryByMessage;\r\n newDate = date.setDate(date.getDate() - parseInt(item[0], 10));\r\n }\r\n }\r\n });\r\n return `Delivery by ${deliveryByMessageRange}`;\r\n } else {\r\n deliveryByMessage = dayjs(deliveryDate).format('MMM D');\r\n let numberOfDays = parseInt(days, 10);\r\n let newDate = deliveryDate;\r\n let flag = true;\r\n while (numberOfDays > 0) {\r\n newDate = date.setDate(date.getDate() + 1);\r\n if (dayjs(newDate).format('d') !== '0' && dayjs(newDate).format('d') !== '6') {\r\n numberOfDays--;\r\n } else {\r\n flag = false;\r\n }\r\n }\r\n deliveryByMessage =\r\n flag && days === '1'\r\n ? `Tomorrow ${dayjs(Date.now()).format('MMM D')}`\r\n : dayjs(newDate).format('ddd MMM, D');\r\n return `Delivery by ${deliveryByMessage}`;\r\n }\r\n};\r\n\r\n// tslint:disable-next-line: no-any\r\nexport const _coreProductATPCall = async (\r\n itemLines: IMFICartLine[],\r\n setCoreProductATPData: React.Dispatch,\r\n context: ICoreContext>\r\n) => {\r\n const cookies = new Cookies();\r\n const zipcode = cookies.get('zip_code');\r\n if (itemLines && itemLines.length === 0) {\r\n setCoreProductATPData([]);\r\n }\r\n const currentDate = Date.now();\r\n const requestBody: IMFICLDeliveryScheduleParameters = {\r\n InventoryType: 'Delivery',\r\n Weeks: context.app.config.weeksPDPforATPCall,\r\n StoreId: '',\r\n Page: 'plp',\r\n RequestedDate: dayjs(currentDate).format('MM/DD/YYYY'),\r\n ZipCode: zipcode,\r\n ItemLines: itemLines\r\n };\r\n const getDeliveryByMessage = _getDeliveryByMessage(requestBody, context);\r\n getDeliveryByMessage\r\n .then(result => {\r\n if (result !== undefined && result?.ATPInventoryData && result?.ATPInventoryData.length > 0) {\r\n setCoreProductATPData(result?.ATPInventoryData);\r\n } else {\r\n setCoreProductATPData([]);\r\n }\r\n })\r\n .catch(e => {\r\n console.log('Error', e);\r\n });\r\n};\r\n\r\nconst _setTime = (time: string | undefined) => {\r\n if (time !== undefined && time !== '') {\r\n const temp = time.split(' ');\r\n if (temp && temp.length > 0) {\r\n let newDatewithTime = dayjs(Date.now()).format('M/D/YYYY');\r\n newDatewithTime = `${newDatewithTime} ${temp[0]}:00 ${temp[1].toUpperCase()}`;\r\n return newDatewithTime;\r\n }\r\n }\r\n return '';\r\n};\r\n\r\nexport interface IATPInventoryData {\r\n deliveryByMessage: string;\r\n locationId: string;\r\n}\r\n\r\nexport const _getSoonestDeliveryDate = (coreProductATPData: IMFIATPInventoryEntity[]): IATPInventoryData => {\r\n let deliveryDetails = {\r\n deliveryByMessage: '',\r\n locationId: ''\r\n };\r\n if (!coreProductATPData || !coreProductATPData.length) {\r\n return deliveryDetails;\r\n }\r\n for (let index = 0; index < coreProductATPData.length; index++) {\r\n const item = coreProductATPData[index];\r\n if (item.Available === 'YES' && item.ATPQuantity !== undefined && parseInt(item.ATPQuantity, 10) > 0) {\r\n const date = new Date();\r\n const today = dayjs(Date.now()).format('D M YY');\r\n const deliveryDate = dayjs(item.SlotDate).format('D M YY');\r\n const currHour = dayjs(Date.now()).format('H');\r\n if (today === deliveryDate) {\r\n const deliveryMessage =\r\n _setTime(item.StartTime) !== ''\r\n ? parseInt(dayjs(_setTime(item.StartTime)).format('H'), 10) < 14 && parseInt(currHour, 10) < 14\r\n ? `Delivery by Today ${dayjs(Date.now()).format('MMM D')}`\r\n : `Delivery by Tomorrow ${dayjs(date.setDate(date.getDate() + 1)).format('MMM D')}`\r\n : '';\r\n deliveryDetails = {\r\n deliveryByMessage: deliveryMessage,\r\n locationId: item.Location1!\r\n };\r\n break;\r\n } else {\r\n const deliveryMessage = `Delivery by ${dayjs(item.SlotDate).format('MMM D')}`;\r\n deliveryDetails = {\r\n deliveryByMessage: deliveryMessage,\r\n locationId: item.Location1!\r\n };\r\n break;\r\n }\r\n }\r\n }\r\n return deliveryDetails;\r\n};\r\n\r\nexport const _getDeliveryDate = (coreProductATPData: IMFIATPInventoryEntityPLP) => {\r\n let deliveryDetails = {\r\n deliveryByMessage: '',\r\n locationId: ''\r\n };\r\n const item = coreProductATPData;\r\n if (item.Available === 'YES' && item.ATPQuantity !== undefined && parseInt(item.ATPQuantity, 10) > 0) {\r\n const date = new Date();\r\n const today = dayjs(Date.now()).format('D M YY');\r\n const deliveryDate = dayjs(item.SlotDate).format('D M YY');\r\n const currHour = dayjs(Date.now()).format('H');\r\n const startTimeHour = item.StartTime?.substring(0,2) || \"14\";\r\n if (today === deliveryDate) {\r\n const deliveryMessage =\r\n parseInt(startTimeHour, 10) < 14 && parseInt(currHour, 10) < 14\r\n ? `Delivery by Today ${dayjs(Date.now()).format('MMM D')}`\r\n : `Delivery by Tomorrow ${dayjs(date.setDate(date.getDate() + 1)).format('MMM D')}`;\r\n deliveryDetails = {\r\n deliveryByMessage: deliveryMessage,\r\n locationId: item.Location1!\r\n };\r\n } else {\r\n const deliveryMessage = `Delivery by ${dayjs(item.SlotDate).format('MMM D')}`;\r\n deliveryDetails = {\r\n deliveryByMessage: deliveryMessage,\r\n locationId: item.Location1!\r\n };\r\n }\r\n }\r\n return deliveryDetails;\r\n};\r\n\r\n","import { ICoreContext, IGeneric, IAny } from '@msdyn365-commerce/core';\r\nimport { AttributeValue, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\nimport { IBrandListData } from '../../../../../modules/mfrm-buybox/mfrm-buybox.view';\r\nimport { _getSoonestDeliveryDate, _makeDeliveryMessage } from '../../../../../Utilities/product-search-result-utils';\r\nimport { ProductSearchResultExtended } from '../../../custom-components/product-search-result-items';\r\n\r\ninterface IDeliveryMessage {\r\n product?: ProductSearchResultExtended;\r\n context: ICoreContext>;\r\n isMasterProduct?: boolean;\r\n attributeValues?: AttributeValue[];\r\n extensionProperties?: CommerceProperty[];\r\n lowestPriceVariantRecordId?: string;\r\n}\r\n\r\n//TODO: common method; move to general utility file. AND change return type to an Enumeration\r\nexport const _getProductType = (shippingInformation: string | undefined): string => {\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'delivery') {\r\n return 'Core';\r\n }\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'parcel') {\r\n return 'Small Parcel';\r\n }\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'drop ship') {\r\n return 'Drop Ship';\r\n }\r\n return '';\r\n};\r\n\r\nexport const computeItemLines = (\r\n product: IDeliveryMessage['product'],\r\n defaultVariantId: number | undefined,\r\n lowestPriceVariantRecordId: string | undefined\r\n) => {\r\n if (product?.IsMasterProduct) {\r\n if (defaultVariantId && defaultVariantId !== 0) {\r\n return defaultVariantId.toString();\r\n }\r\n if (lowestPriceVariantRecordId && lowestPriceVariantRecordId !== '') {\r\n return lowestPriceVariantRecordId;\r\n }\r\n }\r\n return product?.RecordId.toString();\r\n};\r\n\r\nconst DeliveryMessage: React.FC = ({\r\n product,\r\n context,\r\n attributeValues,\r\n extensionProperties,\r\n lowestPriceVariantRecordId\r\n}) => {\r\n let productDeliveryMessage = '';\r\n const { app } = context;\r\n const shippingInformationSmall = attributeValues && attributeValues.find(\r\n (attr: AttributeValue) => attr.Name?.trim() === app.config.smallParcelAttributeKey\r\n )?.TextValue?.toLowerCase();\r\n\r\n const defaultVariantShippingInformation = extensionProperties && extensionProperties.find(\r\n (property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantShippingInformation\"\r\n )?.Value?.StringValue;\r\n\r\n if ((_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Core') {\r\n productDeliveryMessage = product?.deliveryByMessage ?? '';\r\n } else if ((\r\n (_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Small Parcel' ||\r\n (_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Drop Ship'\r\n )) {\r\n let deliveryDays =\r\n attributeValues && attributeValues.find(attr => attr.Name?.trim() === app.config.leadTime)?.TextValue;\r\n if (\r\n (deliveryDays === '' || deliveryDays === undefined || deliveryDays === null) &&\r\n app.config.brandList &&\r\n app.config.brandList.length > 0\r\n ) {\r\n const brand =\r\n attributeValues &&\r\n attributeValues.find(\r\n attr =>\r\n app.config.brandBackofficeAttributePlp &&\r\n attr.Name?.trim() === app.config.brandBackofficeAttributePlp\r\n )?.TextValue?.toLowerCase();\r\n\r\n if (brand !== undefined && brand !== null && brand !== '') {\r\n app.config.brandList.map((singleBrand: IBrandListData) => {\r\n if (singleBrand.brandName.toLowerCase() === brand) {\r\n deliveryDays =\r\n singleBrand.brandLeadtime !== undefined &&\r\n singleBrand.brandLeadtime !== '' &&\r\n singleBrand.brandLeadtime !== null\r\n ? singleBrand.brandLeadtime\r\n : '';\r\n }\r\n });\r\n }\r\n deliveryDays = app.config.brandList[0].brandLeadtime;\r\n }\r\n if (deliveryDays && productDeliveryMessage === '') {\r\n productDeliveryMessage = _makeDeliveryMessage(deliveryDays);\r\n }\r\n }\r\n\r\n return productDeliveryMessage ? (\r\n
\r\n {productDeliveryMessage}\r\n
\r\n ) : null;\r\n};\r\n\r\nexport default DeliveryMessage;","import { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent, RatingComponent, IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport MsDyn365, {\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n IImageProps,\r\n Image,\r\n IRequestContext,\r\n msdyn365Commerce,\r\n RichTextComponent\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\n// VSI Customization - starts\r\nimport { convertToTitlecase } from '../../../../Utilities/convert-to-titlecase';\r\nimport { getBVAttributeValues } from '../../../../Utilities/get-bv-attributes';\r\nimport { buildProductBadge, parseBadgeData } from '../../../../Utilities/get-product-badge';\r\nimport { parseBrandName } from '../../../../Utilities/get-product-brand';\r\nimport {\r\n _coreProductATPCall,\r\n _getEyebrowMessage,\r\n _getSoonestDeliveryDate,\r\n _makeDeliveryMessage\r\n} from '../../../../Utilities/product-search-result-utils';\r\nimport { FinancingPerMonthComponent } from '../../custom-components/financing-per-month-component';\r\nimport DeliveryMessage from './delivery-message';\r\n// VSI Customization - ends\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n eyebrowMessage?: string | undefined;\r\n badgeAttribute?: string;\r\n deliveryMessage?: string;\r\n isRefinersEnabled?: boolean;\r\n // VSI Customization - Copied following 3 props from OOTB product.component to be used in product recommendations for Cart\r\n ratingCountAriaLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n // Customized props for product recommendation on Cart page\r\n displayShopNow?: boolean;\r\n shopNowBtnText?: string;\r\n}\r\n\r\nexport interface IEyebrowMessageDimensions {\r\n height: number;\r\n visibleHeight: number;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\n// tslint:disable-next-line: max-func-body-length cyclomatic-complexity\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n eyebrowMessage,\r\n badgeAttribute,\r\n deliveryMessage,\r\n isRefinersEnabled,\r\n displayShopNow,\r\n shopNowBtnText\r\n}) => {\r\n // VSI Customization - starts\r\n const {\r\n app: {\r\n config: { brandBackofficeAttributePlp, enableAttributeBasedRating }\r\n }\r\n } = context;\r\n const getEyebrowElementRef = React.useRef(null);\r\n const eyebrowElement = getEyebrowElementRef.current?.querySelector('.mfrm-eyebrow__button-plp') as Element;\r\n const [isTruncated, setTruncated] = React.useState({\r\n height: eyebrowElement?.scrollHeight,\r\n visibleHeight: eyebrowElement?.clientHeight\r\n });\r\n\r\n const badgeAttributeToUse = context.app.config.productBadgeAttribute;\r\n // VSI Customization - ends\r\n const product = data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n // VSI Customization - starts\r\n /** When enabled rating values will be picked from BazaarVoice attributes created on product.\r\n * If disabled rating will be shown from OOTB properties on a product.\r\n * This will be used for PLP and product-collection/product recommendations\r\n */\r\n const { AttributeValues, ExtensionProperties } = product;\r\n let isBVratings = false;\r\n if (AttributeValues && AttributeValues?.find(attr => attr.Name?.trim() === \"BVAverageOverallRating\")) {\r\n isBVratings = true;\r\n }\r\n const averageRating = enableAttributeBasedRating && AttributeValues && isBVratings ? getBVAttributeValues(AttributeValues, 'BVAverageOverallRating') : _parseValue(product?.AverageRating);\r\n const totalRatings = enableAttributeBasedRating && AttributeValues && isBVratings ? getBVAttributeValues(AttributeValues, 'BVTotalReviewCount') : _parseValue(product?.TotalRatings);\r\n React.useEffect(() => {\r\n function handleResize(): void {\r\n setTruncated({\r\n height: eyebrowElement?.scrollHeight,\r\n visibleHeight: eyebrowElement?.clientHeight\r\n });\r\n }\r\n handleResize();\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n } else {\r\n return () => null;\r\n }\r\n }, [eyebrowElement?.scrollHeight, eyebrowElement?.clientHeight]);\r\n // VSI Customization - ends\r\n const lowestPriceVariantRecordId = AttributeValues?.find(\r\n attr => attr.Name?.trim() === context.app.config.EcomLowestPriceVariantRecIdKey\r\n )?.TextValue;\r\n const unbxdDefaultVariant = product && product.ExtensionProperties?.find((property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantID\")?.Value?.LongValue;\r\n const queryBasedSelection = context.app.config.queryBasedVariantSelection;\r\n const fallBackImage = context.app.config.placeholderImageName;\r\n const defaultOrLowestVariantRecordId = unbxdDefaultVariant! > 0 ? unbxdDefaultVariant : product.RecordId;\r\n let productUrl = getProductPageUrlSync(product.Name || '', queryBasedSelection ? product.MasterProductId || product.RecordId : product.RecordId, context && context.actionContext, undefined);\r\n\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context);\r\n }\r\n if (queryBasedSelection) {\r\n const variantIdQueryParams = productUrl.includes('?') ? `&variantid=${defaultOrLowestVariantRecordId}` : `?variantid=${defaultOrLowestVariantRecordId}`;\r\n productUrl += variantIdQueryParams;\r\n }\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', defaultOrLowestVariantRecordId!.toString());\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n // VSI Customization -starts\r\n // #17772: Check the master product, if false then add size Refinement property otherwise show Starting at\r\n let sizeValue =\r\n product && !product?.IsMasterProduct && product?.ExtensionProperties && product?.ExtensionProperties?.length > 0\r\n ? product?.ExtensionProperties.find(i => i.Key === \"Size\")?.Value?.StringValue\r\n : '';\r\n sizeValue = sizeValue && convertToTitlecase(sizeValue);\r\n\r\n // Flag used on cart page to display ratings & shop now button\r\n const isCustomizedDesign = displayShopNow;\r\n\r\n if (typeName === 'product-collection') {\r\n // VSI Customization -starts\r\n const brandName = parseBrandName(AttributeValues, brandBackofficeAttributePlp);\r\n const productTitleWithBrandname = brandName ? `${brandName} ${product.Name}` : product.Name;\r\n // VSI Customization -end\r\n // tslint:disable:max-line-length\r\n return (\r\n
\r\n \r\n {
{renderProductBadge(badgeAttributeToUse, AttributeValues, context.request)}
}\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext, fallBackImage)}\r\n
\r\n \r\n
\r\n {/* VSI Customization - START */}\r\n {/* (ADO:23447) Added only class name conditionally as discounted price based on product.component if BasePrice > Price then it will be discounted else not */}\r\n product.Price\r\n ? 'msc-product discounted'\r\n : 'msc-product'\r\n : 'msc-product'\r\n }\r\n href={productUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel\r\n )}\r\n {...attribute}\r\n >\r\n {/* Todo: 'Starting at' string will be replaced with relevant resources */} {/* For cart page, price will be shown after name */}\r\n {!isCustomizedDesign &&\r\n <>\r\n {sizeValue ? sizeValue : product.Price !== 0 ? 'Starting at ' : ''}\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n \r\n }\r\n {!isCustomizedDesign &&\r\n \r\n {productTitleWithBrandname && productTitleWithBrandname.length > 40\r\n ? `${productTitleWithBrandname.slice(0, 40)}...`\r\n : productTitleWithBrandname}\r\n \r\n }\r\n {isCustomizedDesign &&\r\n \r\n {productTitleWithBrandname}\r\n \r\n }\r\n {isCustomizedDesign &&\r\n
\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n
\r\n }\r\n {/* todo : will be added when required in next sprints */}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, averageRating, totalRatings, ratingAriaLabel)}\r\n {isCustomizedDesign &&\r\n \r\n }\r\n {/* VSI Customization - END */}\r\n \r\n
\r\n {/* OOB Quick View */}\r\n {/* {quickViewButton && renderQuickView(quickViewButton, product.RecordId)} */}\r\n
\r\n );\r\n } else {\r\n const priceComponent = renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n );\r\n const isSearchResultContainer = typeName === 'search-result-container' || typeName === 'mfrm-search-result-container';\r\n const brandName = parseBrandName(AttributeValues, brandBackofficeAttributePlp);\r\n return (\r\n // tslint:disable-next-line: react-this-binding-issue jsx-no-lambda\r\n
setProductUrl(productUrl)}>\r\n \r\n {isSearchResultContainer && (\r\n
\r\n {renderProductBadge(badgeAttributeToUse, AttributeValues, context.request)}\r\n
\r\n )}\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext, fallBackImage)}\r\n
\r\n \r\n\r\n
\r\n {/* VSI Customization - START */}\r\n
\r\n {/* VSI Customization - END */}\r\n {isSearchResultContainer && (\r\n
\r\n {eyebrowMessage && (\r\n
\r\n \r\n {isTruncated.height > isTruncated.visibleHeight ? (\r\n \r\n ) : (\r\n false\r\n )}\r\n
\r\n )}\r\n
\r\n )}\r\n {!context.app.config.hideRating && renderRating(context, typeName, id, averageRating, totalRatings, ratingAriaLabel)}\r\n {/* VSI Customization - START */}\r\n
\r\n {/* VSI Customization - END */}\r\n \r\n \r\n {brandName ? `${brandName} ${product.Name}` : product.Name}\r\n \r\n\r\n {/* original price */}\r\n {!isSearchResultContainer && priceComponent}\r\n {renderDescription(product.Description)}\r\n \r\n {/* {deliveryMessage && <>{deliveryMessage}} */}\r\n \r\n
\r\n {/* new price */}\r\n {isSearchResultContainer\r\n ? product.Price\r\n ? priceComponent && (\r\n \r\n )\r\n : priceComponent\r\n : null}\r\n {/* OOB Quick View */}\r\n {/* {quickViewButton && renderQuickView(quickViewButton, product.RecordId)} */}\r\n
\r\n );\r\n }\r\n // VSI Customization - Ends here\r\n};\r\n// VSI Customization - Starts here\r\nfunction _parseValue(productRating?: string | number): number {\r\n const value = +(productRating || 0);\r\n return Math.round(value * 10) / 10;\r\n}\r\n// VSI Customization - Ends here\r\nfunction renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n name = name || '';\r\n price = price || '';\r\n return `${name} ${price} ${getRatingAriaLabel(rating, ratingAriaLabel)}`;\r\n}\r\n\r\nfunction setProductUrl(productUrl: string): void {\r\n if (MsDyn365.isBrowser) {\r\n window.location.href = productUrl;\r\n }\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return

{description}

;\r\n}\r\n\r\n// Render Quick View\r\n// function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n// if (quickview === null) {\r\n// return undefined;\r\n// }\r\n// return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n// }\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction updateProductUrl(productUrl: string, context: ICoreContext): string {\r\n const srcUrl = new URL(productUrl, context.request.apiSettings.baseUrl);\r\n const queryString = 'back=true';\r\n if (srcUrl.search) {\r\n srcUrl.search += `&${queryString}`;\r\n } else {\r\n srcUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(srcUrl.href);\r\n return updatedUrl.pathname + srcUrl.search;\r\n}\r\n\r\nfunction renderRating(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n): JSX.Element | null {\r\n if (avgRating || avgRating === 0) {\r\n const numRatings = (totalRatings && totalRatings.toString()) || '0';\r\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\r\n\r\n return (\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nfunction renderPrice(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n savingsText?: string,\r\n freePriceText?: string,\r\n originalPriceText?: string,\r\n currentPriceText?: string\r\n): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n return basePrice ? (\r\n \r\n ) : null;\r\n}\r\n\r\n/**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @param fallBackImage - Placeholder Image from App settings\r\n * @returns React component for product image.\r\n */\r\nfunction renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext, fallBackImage?: string): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = fallBackImage || '';\r\n let fallbackImageSource = fallbackImageUrl;\r\n if (emptyPlaceHolderImage && fallbackImageUrl) {\r\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageSource\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n \r\n );\r\n}\r\n// VSI Customization - starts\r\n\r\nfunction renderProductBadge(\r\n attributeName: string | undefined,\r\n attributes: AttributeValue[] | undefined,\r\n requestContext: IRequestContext\r\n): JSX.Element | undefined {\r\n const badgeData =\r\n attributeName &&\r\n attributes?.find(\r\n currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === attributeName.toLowerCase().trim()\r\n )?.TextValue;\r\n if (!badgeData) {\r\n return;\r\n }\r\n\r\n // split badge data into its separate badges\r\n const badges = badgeData.split(',');\r\n\r\n // parse badge data to get its schedule and image src\r\n const parsedBadges = badges.map(badge => parseBadgeData(badge, requestContext));\r\n // build product badge image components\r\n const finalizedBadges = parsedBadges.map(parsedBadge => parsedBadge && buildProductBadge(parsedBadge, requestContext));\r\n\r\n return finalizedBadges && <>{finalizedBadges};\r\n}\r\n\r\n// VSI Customization - ends\r\n\r\n// @ts-ignore\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;","export const convertToTitlecase = (stringValue?: string, stopConvert?: boolean) => {\r\n // this stopConvert flag will use to stop conversion in specific scenario\r\n return stopConvert\r\n ? stringValue\r\n : stringValue?.replace(/\\w\\S*/g, txt => {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n};\r\n"],"names":["_getEyebrowMessage","async","products","context","priceGroupForAPICall","app","config","priceGroup","length","undefined","items","map","item","singleItem","ItemId","DistinctProductVariant","push","requestBody","PriceGroup","Items","getEyebrowMessageInput","GetEyebrowMessageInput","result","getEyebrowAction","actionContext","error","console","log","_makeDeliveryMessage","days","deliveryByMessage","date","Date","daysSpan","split","deliveryDate","now","deliveryByMessageRange","parseInt","numberOfDays","newDate","setDate","getDate","dayjs","format","flag","_setTime","time","temp","newDatewithTime","toUpperCase","_getSoonestDeliveryDate","coreProductATPData","deliveryDetails","locationId","index","Available","ATPQuantity","today","SlotDate","currHour","StartTime","Location1","_getDeliveryDate","startTimeHour","substring","_getProductType","shippingInformation","toLowerCase","computeItemLines","product","defaultVariantId","lowestPriceVariantRecordId","IsMasterProduct","toString","RecordId","attributeValues","extensionProperties","productDeliveryMessage","shippingInformationSmall","find","attr","Name","trim","smallParcelAttributeKey","TextValue","defaultVariantShippingInformation","property","Key","Value","StringValue","deliveryDays","leadTime","brandList","brand","brandBackofficeAttributePlp","singleBrand","brandName","brandLeadtime","React","className","_parseValue","productRating","value","Math","round","renderLabel","name","price","rating","ratingAriaLabel","getRatingAriaLabel","roundedRating","toFixed","renderRating","typeName","id","avgRating","totalRatings","ariaLabel","numRatings","RatingComponent","ratingCount","readOnly","data","renderPrice","basePrice","adjustedPrice","savingsText","freePriceText","originalPriceText","currentPriceText","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","renderProductPlacementImage","productCardimageSettings","gridSettings","imageUrl","fallbackImageUrl","altText","requestContext","fallBackImage","emptyPlaceHolderImage","fallbackImageSource","image","src","fallBackSrc","imageProps","imageSettings","cropFocalRegion","Image","Object","loadFailureBehavior","bypassHideOnFailure","renderProductBadge","attributeName","attributes","badgeData","currAttribute","finalizedBadges","badge","parseBadgeData","parsedBadge","buildProductBadge","ProductComponent","msdyn365Commerce","component","allowBack","telemetryContent","quickViewButton","eyebrowMessage","badgeAttribute","deliveryMessage","isRefinersEnabled","displayShopNow","shopNowBtnText","enableAttributeBasedRating","getEyebrowElementRef","eyebrowElement","current","querySelector","isTruncated","setTruncated","height","scrollHeight","visibleHeight","clientHeight","badgeAttributeToUse","productBadgeAttribute","AttributeValues","ExtensionProperties","isBVratings","averageRating","getBVAttributeValues","AverageRating","TotalRatings","handleResize","MsDyn365","window","addEventListener","removeEventListener","EcomLowestPriceVariantRecIdKey","unbxdDefaultVariant","LongValue","queryBasedSelection","queryBasedVariantSelection","placeholderImageName","defaultOrLowestVariantRecordId","productUrl","getProductPageUrlSync","MasterProductId","srcUrl","URL","request","apiSettings","baseUrl","queryString","search","href","pathname","updateProductUrl","variantIdQueryParams","includes","payLoad","getPayloadObject","attribute","getTelemetryAttributes","sizeValue","i","stringValue","stopConvert","replace","txt","charAt","substr","isCustomizedDesign","parseBrandName","productTitleWithBrandname","onClick","onTelemetryClick","cultureFormatter","formatCurrency","Price","PrimaryImageUrl","title","slice","hideRating","Button","color","type","priceComponent","isSearchResultContainer","role","location","setProductUrl","ref","RichTextComponent","text","description","Description","DeliveryMessage","FinancingPerMonthComponent","pageType","sellingPrice","activeVariantId","productId","activeColorVariantId"],"sourceRoot":""}