{"version":3,"file":"static/js/7608739771a870aee431.bundle.js","mappings":"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","sources":["webpack://msdyn365.commerce.online/./src/common/components/swatch/swatch-item.tsx?8d3d","webpack://msdyn365.commerce.online/./src/common/components/swatch/swatch.tsx?fefb","webpack://msdyn365.commerce.online/./src/modules/c-buybox/components/c-price.component.tsx?6491","webpack://msdyn365.commerce.online/./src/themes/peruvian/views/components/addtocart.component.tsx?91b0"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICommerceApiSettings, ICoreContext, IGeneric, IAny } from '@msdyn365-commerce/core-internal';\r\nimport { DimensionTypes, generateSwatchImageUrl, StringExtensions, IDimensionValueForSelectedVariant } from '@msdyn365-commerce-modules/retail-actions';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { IBuyboxCommonResources } from '../../../modules/c-buybox/components/c-buyboxInterface';\r\n\r\n/**\r\n * Swatch item data.\r\n */\r\nexport interface ISwatchItem {\r\n value: string;\r\n itemId: string;\r\n dimensionType: DimensionTypes;\r\n dimensionId: string;\r\n inventoryCode: string;\r\n variantIds?: IDimensionValueForSelectedVariant;\r\n colorHexCode?: string;\r\n imageUrl?: string;\r\n productImageUrls?: string[];\r\n isDisabled?: boolean;\r\n isDefault?: boolean;\r\n swatchItemAriaLabel?: string;\r\n NB?: boolean;\r\n itemNumber?: string;\r\n dimensionTypeId?: number;\r\n}\r\n\r\n/**\r\n * Swatch item configuration.\r\n */\r\nexport interface ISwatchItemProps {\r\n className: string;\r\n apiSettings: ICommerceApiSettings;\r\n requestContext: ICoreContext>;\r\n resources?: IBuyboxCommonResources;\r\n isSelected: boolean;\r\n isSelectionEnabled?: boolean;\r\n\r\n item: ISwatchItem;\r\n\r\n onSelectItem(item: ISwatchItem): void;\r\n context: ICoreContext;\r\n}\r\n\r\n/**\r\n * Represents a single item for swatch.\r\n * @param props - Item configuration.\r\n * @returns React node.\r\n */\r\nexport const SwatchItemComponent: React.FC = (props: ISwatchItemProps) => {\r\n const { isSelected, className, onSelectItem, item } = props;\r\n const { itemId, value, colorHexCode, imageUrl } = item;\r\n const style: React.CSSProperties = {};\r\n\r\n let isColored = false;\r\n\r\n const hasColor = !StringExtensions.isNullOrWhitespace(colorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(imageUrl);\r\n\r\n let modImageUrl = '';\r\n if (imageUrl) {\r\n const splitImgUrl = imageUrl?.split('/');\r\n // eslint-disable-next-line no-new-wrappers\r\n const modUrl = new String(`${splitImgUrl[0]}/${item.itemNumber}-${splitImgUrl[1]}`);\r\n modImageUrl = modUrl.toString();\r\n } else {\r\n modImageUrl = '';\r\n }\r\n\r\n\r\n const selectItem = React.useCallback(() => {\r\n onSelectItem(item);\r\n }, [onSelectItem, item]);\r\n\r\n const selectionHandler = props.isSelectionEnabled ? selectItem : undefined;\r\n if (hasColor && item.dimensionType.toLowerCase() === 'color') {\r\n style.backgroundColor = colorHexCode;\r\n isColored = true;\r\n } else if (hasImage) {\r\n const fullImageUrl = generateSwatchImageUrl(imageUrl!, props.apiSettings);\r\n const modifiedImageUrl = generateSwatchImageUrl(modImageUrl, props.apiSettings);\r\n const [imgSrc, setImgSrc] = React.useState(modifiedImageUrl);\r\n const onImgError = (event: React.SyntheticEvent) => {\r\n setImgSrc(fullImageUrl);\r\n if (!fullImageUrl) {\r\n event.currentTarget.classList.add('img-error');\r\n }\r\n };\r\n \r\n if (typeof window !== 'undefined') {\r\n return (\r\n onImgError(event)}\r\n />\r\n );\r\n }\r\n }\r\n\r\n const shouldDisplayText = !isColored;\r\n\r\n return (\r\n
\r\n \r\n {shouldDisplayText && value}\r\n \r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ICommerceApiSettings } from '@msdyn365-commerce/core-internal';\r\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { ISwatchItem, SwatchItemComponent } from './swatch-item';\r\n// import { ISwatchItem, SwatchItemComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ICBuyboxProps, ICBuyboxData } from '../../../modules/c-buybox';\r\nimport { IBuyboxCommonResources } from '../../../modules/c-buybox/components/c-buyboxInterface';\r\n\r\n/**\r\n * Swatch item configuration.\r\n */\r\nexport interface ISwatchProps {\r\n className?: string;\r\n requestContext: ICoreContext>;\r\n apiSettings: ICommerceApiSettings;\r\n resources: IBuyboxCommonResources;\r\n list: ISwatchItem[];\r\n isSelectionEnabled?: boolean;\r\n\r\n onSelectItem?(item: ISwatchItem): void;\r\n dropdownId: string;\r\n moduleProps: ICBuyboxProps;\r\n}\r\n\r\n/**\r\n * Represents a single item for swatch.\r\n * @param props - Item configuration.\r\n * @returns React node.\r\n */\r\nexport const SwatchComponent: React.FC = (props: ISwatchProps) => {\r\n const containerClassName = 'msc-swatch-container';\r\n const [selectedItemId, setSelectedItemId] = React.useState(undefined);\r\n const [didUserSetAnyItem, setDidUserSetAnyItem] = React.useState(false);\r\n\r\n const isSelectionEnabled = props.isSelectionEnabled ?? true;\r\n\r\n const onSelectItemCallback = props.onSelectItem;\r\n\r\n const onSelectItem = React.useCallback(\r\n (item: ISwatchItem) => {\r\n setSelectedItemId(item.itemId);\r\n if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\r\n onSelectItemCallback(item);\r\n }\r\n setDidUserSetAnyItem(true);\r\n },\r\n [setSelectedItemId, onSelectItemCallback]\r\n );\r\n\r\n if (!didUserSetAnyItem) {\r\n const defaultItem = props.list.find(item => item.isDefault);\r\n if (defaultItem && defaultItem.itemId !== selectedItemId) {\r\n setSelectedItemId(defaultItem.itemId);\r\n if (!ObjectExtensions.isNullOrUndefined(onSelectItemCallback)) {\r\n onSelectItemCallback(defaultItem);\r\n }\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {props.list.map(item => {\r\n const itemId = item.itemId;\r\n const isSelected = selectedItemId === itemId;\r\n\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ProductPrice } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nconst defaultPrice: number = 0;\r\nconst freePrice: number = 0;\r\n\r\n/**\r\n * Interface for price component resources.\r\n * @param {string} priceRangeSeparator - The price range separator.\r\n */\r\nexport interface IPriceComponentResources {\r\n priceRangeSeparator?: string;\r\n}\r\n\r\n/**\r\n * Interface for price component props.\r\n * @param {boolean} isPriceMinMaxEnabled - Whether the price range feature is enabled or not.\r\n * @param {IPriceComponentResources} priceResources - The price range resources.\r\n */\r\nexport interface IPriceComponentProps extends IComponentProps<{ price: ProductPrice }> {\r\n data: any;\r\n className?: string;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\nexport interface IPriceComponent extends IComponent {}\r\n\r\nconst priceComponentActions = {};\r\n\r\n/**\r\n * Price.\r\n * @param props - The props.\r\n * @returns The JSX.Element.\r\n */\r\nconst Price: React.FC = (props: IPriceComponentProps): JSX.Element | null => {\r\n // CustomerContextualPrice could be zero\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * ShowStrikethroughPricing.\r\n * @param props - The props.\r\n * @returns True if showStrikethroughPricing, false otherwise.\r\n */\r\nconst showStrikethroughPricing = (props: IPriceComponentProps): boolean => {\r\n const originalPrice = getOriginalPrice(props);\r\n const { BasePrice, CustomerContextualPrice, MinVariantPrice, MaxVariantPrice } = props.data.price;\r\n if (\r\n props.isPriceMinMaxEnabled &&\r\n props.data.price.MaxVariantPrice &&\r\n props.data.price.MinVariantPrice &&\r\n props.data.price.MaxVariantPrice > props.data.price.MinVariantPrice\r\n ) {\r\n return props.data.price.MinVariantPrice < originalPrice;\r\n }\r\n\r\n if (MinVariantPrice && !(MinVariantPrice > 0) && MaxVariantPrice && !(MaxVariantPrice > 0)) {\r\n console.log('Condition Variant 1');\r\n return !(MinVariantPrice === 0 && MaxVariantPrice === 0);\r\n }\r\n if (\r\n MinVariantPrice &&\r\n MinVariantPrice > 0 &&\r\n MaxVariantPrice &&\r\n MaxVariantPrice > 0 &&\r\n MinVariantPrice === MaxVariantPrice &&\r\n MinVariantPrice > originalPrice\r\n ) {\r\n console.log('Condition Variant 4');\r\n return true;\r\n }\r\n\r\n if (BasePrice === CustomerContextualPrice && BasePrice === MinVariantPrice && BasePrice === MaxVariantPrice) {\r\n console.log('Condition Variant 2');\r\n return false;\r\n }\r\n\r\n if (originalPrice === props.data.price.CustomerContextualPrice && MinVariantPrice === 0 && MaxVariantPrice === 0) {\r\n return false;\r\n }\r\n if (originalPrice && props.data.price.CustomerContextualPrice && originalPrice > MinVariantPrice) {\r\n return true;\r\n }\r\n\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n console.log('Condition Variant 3');\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getOriginalPrice = (props: IPriceComponentProps): number => {\r\n return Math.max(\r\n props.data.price.BasePrice ?? defaultPrice,\r\n props.data.price.TradeAgreementPrice ?? defaultPrice,\r\n props.data.price.AdjustedPrice ?? defaultPrice\r\n );\r\n};\r\n\r\nconst formatCurrency = (props: IPriceComponentProps, price: number | undefined, shouldUseFreePriceText: boolean | undefined): string => {\r\n if (price === undefined) {\r\n return '';\r\n }\r\n\r\n if (shouldUseFreePriceText && price === freePrice && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n\r\n return props.context.cultureFormatter.formatCurrency(price);\r\n};\r\n\r\nconst renderCurrentPrice = (props: IPriceComponentProps): JSX.Element => {\r\n const { MinVariantPrice, MaxVariantPrice, CustomerContextualPrice } = props.data.price;\r\n const initialPrice: string = formatCurrency(props, CustomerContextualPrice, true);\r\n const maxVariantPrice: string = formatCurrency(props, MaxVariantPrice, false);\r\n const minVariantPrice: string = formatCurrency(props, MinVariantPrice, false);\r\n if (props.isPriceMinMaxEnabled && MaxVariantPrice && MinVariantPrice && MaxVariantPrice > MinVariantPrice) {\r\n return (\r\n \r\n {' '}\r\n \r\n {minVariantPrice}\r\n \r\n \r\n {props.priceResources?.priceRangeSeparator}\r\n \r\n \r\n {maxVariantPrice}\r\n \r\n \r\n );\r\n }\r\n return (\r\n \r\n {MinVariantPrice === MaxVariantPrice && MinVariantPrice !== 0 && MaxVariantPrice !== 0 ? maxVariantPrice : initialPrice}\r\n \r\n );\r\n};\r\n\r\nconst renderCurrentPriceWithOriginalPrice = (props: IPriceComponentProps): JSX.Element => {\r\n const originalPrice: number = getOriginalPrice(props);\r\n const initialPrice: string = formatCurrency(props, originalPrice, true);\r\n\r\n return (\r\n <>\r\n \r\n {' '}\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n \r\n \r\n \r\n {props.savingsText && {props.savingsText}}\r\n \r\n );\r\n};\r\n\r\nexport const PriceComponent: React.FunctionComponent = msdyn365Commerce.createComponent('Price', {\r\n component: Price,\r\n ...priceComponentActions\r\n});\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, {\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n AttributeValueBase,\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport {\r\n ArrayExtensions,\r\n generateProductImageUrl,\r\n ObjectExtensions,\r\n IDimensionForSelectedVariant\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components/';\r\nimport { IItemsAddedToCartResources } from '@msdyn365-commerce/components/';\r\nimport { ItemsAddedToCartDialogComponent } from '@msdyn365-commerce/components/';\r\nimport { ItemSuccessfullyAddedToCartNotification } from '@msdyn365-commerce/components/';\r\nimport { MultiItemsSuccessfullyAddedToCartNotification } from '@msdyn365-commerce/components/';\r\nimport { OrderDetailsProduct } from '@msdyn365-commerce/components/';\r\nimport { findAttribute, getDiemnsionValueForSelectedProduct, setNameAttribute } from '../../../../common/utils/helper';\r\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps\r\n extends IComponentProps<{ product: SimpleProduct; productDimensions: ProductDimensionFull[]; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: { productId: number; quantity: number }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n\r\n onAdd?(result: ICartActionResult): void;\r\n onError?(result: IAddToCartFailureResult): void;\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\n/**\r\n * Cart action Failure reason type.\r\n */\r\nexport declare type ICartActionFailureReason =\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'OUTOFSTOCK'\r\n | 'CARTACTIONFAILED'\r\n | 'INVALIDCUSTOMAMOUNT';\r\n\r\n/**\r\n * Interface for add to cart failure result.\r\n */\r\nexport interface IAddToCartFailureResult {\r\n failureReason: ICartActionFailureReason;\r\n\r\n stockLeft?: number;\r\n cartActionResult?: ICartActionResult;\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\r\n */\r\nexport enum AddToCartBehavior {\r\n /**\r\n * Navigate to cart page.\r\n */\r\n goToCart = 'goToCart',\r\n\r\n /**\r\n * Show item added to cart popup.\r\n */\r\n showModal = 'showModal',\r\n\r\n /**\r\n * Show mini cart popup.\r\n */\r\n showMiniCart = 'showMiniCart',\r\n\r\n /**\r\n * Show item added to cart notification.\r\n */\r\n showNotification = 'showNotification',\r\n\r\n /**\r\n * Do nothing and stay on the page.\r\n */\r\n nothing = 'nothing'\r\n}\r\n\r\nconst zero = 0;\r\nconst defaultQuantity = 1;\r\n\r\n/**\r\n * The propagate result.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The cart action result.\r\n */\r\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\r\n if (props.onAdd) {\r\n props.onAdd(result);\r\n }\r\n};\r\n\r\n/**\r\n * The propagate error.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The add to cart failure result.\r\n */\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n if (props.onError) {\r\n props.onError(result);\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves add to cart input from the component props.\r\n * @param props - Add to cart component props.\r\n * @returns Add to cart input.\r\n */\r\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\r\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\r\n const input = products?.map(product => {\r\n return {\r\n product: product.simpleProduct!,\r\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: apiSettings.catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n// ITS - Customization to get dimension value for selected product\r\n// Commented code as it has been moved to helper file\r\n// const getDiemnsionValueForSelectedProduct = (props: IAddToCartComponentProps, product: SimpleProduct): IDimensionValueForSelectedVariant | undefined => {\r\n// const productDimensionsData = props.data?.productDimensions;\r\n// const productDimensions = productDimensionsData as IDimensionForSelectedVariant[];\r\n// const dimensions = (productDimensions[0].dimensionValuesWithInventory ??\r\n// productDimensions[0].DimensionValues ?? []) as IDimensionValueForSelectedVariant[];\r\n// // const validProductDimensionsFull = dimensions.filter(\r\n// // value => !ObjectExtensions.isNullOrUndefined(value.DimensionValue?.RecordId ?? value.RecordId));\r\n// // let dimension = validProductDimensionsFull.find(d => d.ProductIds && d.ProductIds[0] === product.RecordId);\r\n// let dimension = dimensions.find(\r\n// value => !ObjectExtensions.isNullOrUndefined(value.DimensionValue?.RecordId ?? value.RecordId) && value.ProductIds && value.ProductIds[0] === product.RecordId);\r\n// dimension = dimension && dimension.DimensionValue;\r\n// return dimension;\r\n// };\r\n// ITS - Customization End\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n const quantity = addToCartInput[0].count;\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n // ITS Customization to modify available quantity for NB = false and stock < 1\r\n let availableQuantity = props.productAvailability?.AvailableQuantity;\r\n const enableStockCheck = props.context.app.config.enableStockCheck;\r\n const maxQuantityForCartLineItem = props.context.app.config.maxQuantityForCartLineItem;\r\n const disableStockCheckInAppForBackorderableProducts = props.context.app.config.disableStockCheckInAppForBackorderableProducts;\r\n let NBFlag;\r\n if (enableStockCheck && disableStockCheckInAppForBackorderableProducts) {\r\n const productDimensionsData = props.data?.productDimensions;\r\n const productDimensions = productDimensionsData as IDimensionForSelectedVariant[];\r\n const dimension = getDiemnsionValueForSelectedProduct(productDimensions, product);\r\n NBFlag =\r\n dimension &&\r\n dimension.ExtensionProperties &&\r\n dimension.ExtensionProperties[0] &&\r\n dimension.ExtensionProperties[0].Key === 'NonBackOrderableFlag'\r\n ? dimension.ExtensionProperties[0].Value?.BooleanValue\r\n : false;\r\n if (!NBFlag) {\r\n availableQuantity = maxQuantityForCartLineItem;\r\n }\r\n }\r\n // ITS Customization End\r\n const addToCartResult = await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.customPriceAmount,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings\r\n });\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n // ITS - Customization to add Product attributes to display NB Flag\r\n if (cartState.cart && cartState.cart.CartLines) {\r\n const cartLines = cartState.cart.CartLines.filter(cartLineItem => cartLineItem.ProductId === product.RecordId);\r\n if (cartLines && cartLines.length > 0) {\r\n // const productDimensionsData = props.data?.productDimensions;\r\n // const productDimensions = productDimensionsData as IDimensionForSelectedVariant[];\r\n // const dimension = getDiemnsionValueForSelectedProduct(productDimensions, product);\r\n // const NBFlag = (dimension && dimension.ExtensionProperties && dimension.ExtensionProperties[0] && dimension.ExtensionProperties[0].Key === \"NonBackOrderableFlag\") ? dimension.ExtensionProperties[0].Value?.BooleanValue : false;\r\n const newCartLine = cartLines[cartLines.length - 1];\r\n const lineIdBackOrderableFlagAttribute = setNameAttribute(\r\n 'NonBackOrderableFlag',\r\n typeof NBFlag === 'boolean' ? JSON.stringify(NBFlag) : ''\r\n );\r\n let currentAttributes: AttributeValueBase[] = newCartLine.AttributeValues || [];\r\n currentAttributes = await findAttribute(currentAttributes, lineIdBackOrderableFlagAttribute);\r\n newCartLine.AttributeValues = currentAttributes; // Updates cart with Attribute Values\r\n updateCartLinesAsync({ callerContext: props.context.actionContext }, cartState.cart.Id, [newCartLine])\r\n .then(() => cartState.refreshCart({}))\r\n .catch(error => props.context.actionContext.telemetry.exception(error));\r\n }\r\n }\r\n // ITS - Customization End\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent {\r\n onClick(): (event: React.MouseEvent, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n }\r\n};\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const priceComponent = props.data?.price ? (\r\n \r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: props.data?.product, price: props.data?.price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: props.quantity !== undefined ? props.quantity : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = ;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {label}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.disableStockCheckInAppForBackorderableProducts) {\r\n return false;\r\n }\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n // @ts-expect-error\r\n IAddtoCartComponent\r\n>('AddToCart', { component: AddToCartFunctionalComponent, ...AddToCartComponentActions });\r\n\r\nexport default AddToCartComponent;\r\n"],"names":["SwatchItemComponent","props","isSelected","className","onSelectItem","item","itemId","value","colorHexCode","imageUrl","style","isColored","hasColor","StringExtensions","isNullOrWhitespace","hasImage","modImageUrl","splitImgUrl","split","String","itemNumber","toString","selectItem","React","selectionHandler","isSelectionEnabled","undefined","dimensionType","toLowerCase","backgroundColor","fullImageUrl","generateSwatchImageUrl","apiSettings","modifiedImageUrl","imgSrc","setImgSrc","onImgError","event","currentTarget","classList","add","window","key","isDisabled","src","classnames","onClick","onKeyPress","title","alt","onError","shouldDisplayText","SwatchComponent","containerClassName","selectedItemId","setSelectedItemId","didUserSetAnyItem","setDidUserSetAnyItem","onSelectItemCallback","ObjectExtensions","isNullOrUndefined","defaultItem","list","find","isDefault","map","resources","requestContext","context","showStrikethroughPricing","originalPrice","getOriginalPrice","BasePrice","CustomerContextualPrice","MinVariantPrice","MaxVariantPrice","data","price","isPriceMinMaxEnabled","console","log","Math","max","TradeAgreementPrice","AdjustedPrice","formatCurrency","shouldUseFreePriceText","freePriceText","cultureFormatter","renderCurrentPrice","initialPrice","maxVariantPrice","minVariantPrice","itemProp","priceResources","priceRangeSeparator","renderCurrentPriceWithOriginalPrice","originalPriceText","currentPriceText","savingsText","PriceComponent","msdyn365Commerce","createComponent","component","AddToCartBehavior","propagateResult","result","onAdd","propagateError","getAddToCartInputFromProps","async","products","orderDetailsProducts","filter","product","simpleProduct","input","count","salesLine","Quantity","ArrayExtensions","hasElements","actionContext","searchCriteriaInput","Context","ChannelId","channelId","CatalogId","catalogId","IncludeAttributes","Ids","productId","productSearchResultsWithImages","ProductsDataActions","callerContext","productSearchResult","newProductSearchResult","newImageUrl","generateProductImageUrl","PrimaryImageUrl","productData","RecordId","ProductTypeValue","ProductType","Variant","Price","quantity","addItemsToCart","setDisabled","setItemsAddedToCartDialogOpen","setErrorMessage","addToCartInput","cartState","getCartState","addToCartResult","addProductsToCart","status","errorCount","CartsDataActions","bypassCache","cart","Id","Version","ValidationFailuresByCartLines","length","errorText","dialogStrings","oneErrorText","multiErrorsText","errorMessage","format","validationErrorMessage","addToCartBehavior","app","config","showModal","showNotification","itemsAddedResource","viewCartButtonText","goToCartText","closeButtonLabel","closeNotificationLabel","itemsAddedToCartHeaderText","headerMessageText","itemsAddedToCartFormatText","headerItemFormatText","linesAddedToCartFormatText","headerLinesFormatText","itemsAddedValidationErrorMessage","notification","MultiItemsSuccessfullyAddedToCartNotification","imageSettings","gridSettings","navigationUrl","telemetryContent","id","typeName","NotificationsManager","instance","addNotification","MsDyn365","isBrowser","isNavigationToCartPageDisabled","goToCart","location","assign","handleAddItemsToCartSuccess","buyAgainNotificationTitle","ErrorNotification","buyAgainNotificationCloseAriaLabel","errorDetails","LocalizedMessage","failureReason","cartActionResult","AddToCartComponentActions","_event","openModal","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","shouldSkipSiteSettings","availableQuantity","productAvailability","AvailableQuantity","enableStockCheck","maxQuantityForCartLineItem","disableStockCheckInAppForBackorderableProducts","NBFlag","productDimensions","dimension","getDiemnsionValueForSelectedProduct","ExtensionProperties","Key","Value","BooleanValue","addProductToCart","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isOrderQuantityLimitsFeatureEnabled","isPriceKeyedIn","customPrice","customPriceAmount","isAddEmailDeliveryItemToCart","CartLines","cartLines","cartLineItem","ProductId","newCartLine","lineIdBackOrderableFlagAttribute","setNameAttribute","JSON","stringify","currentAttributes","AttributeValues","findAttribute","updateCartLinesAsync","then","refreshCart","catch","error","telemetry","exception","ItemSuccessfullyAddedToCartNotification","addOneItemToCart","AddToCartFunctionalComponent","disabled","useState","modalOpen","setModalOpen","isItemsAddedToCartDialogOpen","setAddToCartInput","closeItemsAddedToCartDialog","priceComponent","popupProps","request","productQuantity","renderModalPopup","Popup","label","getLinkText","payload","getPayloadObject","TelemetryEvent","AddToCart","attributes","getTelemetryAttributes","buttonClassName","retrievedInput","retrieveAddToCartInput","addToCartArialLabel","isIntermediateState","shouldShowOutOfStock","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","outOfStockText","addToCartText","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","Dimensions","missingDimensions","DimensionValue","defaultAvailableQuantity","stockLeft","includeCurrentQuantity","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","AddToCartComponent","createComponentOverride"],"sourceRoot":""}