{"version":3,"file":"static/js/1ffa3408d054c18bc80b.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/themes/dlvry-adventureworks/views/components/cartlineitem.component.tsx?1d54","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4"],"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\nimport { CartLinePriceEditor, ICartLinePriceEditorResources } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, IGridSettings, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n DiscountLine,\r\n DiscountLineType,\r\n ProductCatalog,\r\n ProductDimensionType,\r\n ProductPrice,\r\n SalesLine,\r\n SimpleProduct,\r\n UnitOfMeasureConversion\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, StringExtensions, getFallbackImageUrl, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport { UnitOfMeasure } from '../../../../components/unit-of-measure';\r\nimport ProductListOrderQuantity from '../../../../components/common/product-list-order-quantity';\r\nimport { ProductError, SimpleProductExt } from '../../../../shared-utils/types';\r\nimport DiscountBadge from '../../../../components/discount-badge/discount-badge';\r\nimport PriceComponent, { getDiscountLines, getOriginalPrice } from './price.component';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs.\r\n */\r\nexport interface ICartlineResourceString {\r\n /**\r\n * Display string for discount label.\r\n */\r\n discountStringText: string;\r\n\r\n /**\r\n * String for size key.\r\n */\r\n sizeString: string;\r\n\r\n /**\r\n * String for color key.\r\n */\r\n colorString: string;\r\n\r\n /**\r\n * String associated with the configuration product dimension.\r\n */\r\n configString: string;\r\n\r\n /**\r\n * String for style key.\r\n */\r\n styleString: string;\r\n\r\n /**\r\n * String for amount key.\r\n */\r\n amountString?: string;\r\n\r\n /**\r\n * Display string for quantity label.\r\n */\r\n quantityDisplayString: string;\r\n\r\n /**\r\n * Display string for quantity label.\r\n */\r\n inputQuantityAriaLabel: string;\r\n\r\n /**\r\n * Aria label for the decrement button in quantity component.\r\n */\r\n decrementButtonAriaLabel: string;\r\n\r\n /**\r\n * Aria label for the increment button in quantity component.\r\n */\r\n incrementButtonAriaLabel: string;\r\n\r\n /**\r\n * Original text screenreader.\r\n */\r\n originalPriceText: string;\r\n\r\n /**\r\n * Current text screenreader.\r\n */\r\n currentPriceText: string;\r\n\r\n /**\r\n * Shipping Charges Text.\r\n */\r\n shippingChargesText: string;\r\n\r\n /**\r\n * Price Editor Charges Text.\r\n */\r\n priceEditorResources?: ICartLinePriceEditorResources;\r\n\r\n /**\r\n * Sales agreement price prompt text.\r\n */\r\n salesAgreementPricePrompt?: string;\r\n\r\n /**\r\n * Shipping text.\r\n */\r\n shippingText?: string;\r\n\r\n /**\r\n * Confirmed Ship Date Label.\r\n */\r\n confirmedShipDateLabel?: string;\r\n}\r\n\r\n/**\r\n * Represents cart line data interface.\r\n */\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n cartState?: ICartState;\r\n product?: SimpleProduct;\r\n catalogs?: ProductCatalog[];\r\n availability?: IProductInventoryInformation;\r\n unitConversions?: UnitOfMeasureConversion[];\r\n}\r\n\r\nexport type CartLineDisplayMode = 'DEFAULT' | 'COMPACT';\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem.\r\n */\r\nexport interface ICartLineProps extends IComponentProps {\r\n /**\r\n * The flag to change the quantity component from interactible to static.\r\n */\r\n disableQuantityInteractivity?: boolean;\r\n\r\n /**\r\n * The primary image url.\r\n */\r\n primaryImageUrl?: string;\r\n\r\n /**\r\n * The product error.\r\n */\r\n productError?: ProductError;\r\n\r\n /**\r\n * The product url.\r\n */\r\n productUrl?: string;\r\n\r\n /**\r\n * GridSettings for the product image in cartLine.\r\n */\r\n gridSettings: IGridSettings;\r\n\r\n /**\r\n * ImageSettings for the product image in cartLine.\r\n */\r\n imageSettings: IImageSettings;\r\n\r\n /**\r\n * Boolean flag to indicate if the item is out of stock.\r\n */\r\n isOutOfStock?: boolean;\r\n\r\n /**\r\n * Flag to make quantity section editable.\r\n */\r\n isQuantityEditable?: boolean;\r\n\r\n /**\r\n * Max quantity for line item.\r\n */\r\n maxQuantity?: number;\r\n\r\n /**\r\n * Current quantity for line item.\r\n */\r\n currentQuantity?: number;\r\n\r\n /**\r\n * Resource string for the component.\r\n */\r\n resources: ICartlineResourceString;\r\n\r\n /**\r\n * SalesLine flag.\r\n */\r\n isSalesLine?: boolean;\r\n\r\n /**\r\n * Error message to show in place of quantity.\r\n */\r\n errorMessage?: string;\r\n\r\n /**\r\n * Display mode to use.\r\n */\r\n displayMode?: CartLineDisplayMode;\r\n\r\n /**\r\n * Inventory information label.\r\n */\r\n inventoryInformationLabel?: string;\r\n\r\n /**\r\n * Inventory information class name.\r\n */\r\n inventoryLabelClassName?: string;\r\n\r\n /**\r\n * Flag to show/hide shipping charges for line items.\r\n */\r\n showShippingChargesForLineItems?: boolean;\r\n\r\n /**\r\n * Boolean flag to indicate if cart state status is ready.\r\n */\r\n isCartStateReady?: boolean;\r\n\r\n /**\r\n * Chanel Delivery Option configuration is from api.\r\n */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n /**\r\n * The telemetry content.\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n\r\n /**\r\n * The cart line index.\r\n */\r\n lineIndex?: number;\r\n\r\n /**\r\n * The cart line delivery location.\r\n */\r\n deliveryLocation?: string;\r\n\r\n /**\r\n * Quantity onChange callback.\r\n */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): void;\r\n priceCurrency?: string;\r\n\r\n /**\r\n * Sales line confirmed ship date.\r\n */\r\n confirmedShipDate?: string;\r\n}\r\n\r\n/**\r\n * Represents dimensions strings.\r\n */\r\ninterface IDimensionStrings {\r\n /**\r\n * String for size key.\r\n */\r\n sizeString: string;\r\n\r\n /**\r\n * String for color key.\r\n */\r\n colorString: string;\r\n\r\n /**\r\n * String associated with the configuration product dimension.\r\n */\r\n configString: string;\r\n\r\n /**\r\n * String for style key.\r\n */\r\n styleString: string;\r\n\r\n /**\r\n * String for amount key.\r\n */\r\n amountString?: string;\r\n}\r\n\r\n/**\r\n * Renders catalog label for the cart line.\r\n * @param props - Cart line props.\r\n * @returns Catalog label.\r\n */\r\nconst CatalogLabelComponent: React.FC = (props: ICartLineProps) => {\r\n const catalogId = props.data.cartLine.CatalogId;\r\n\r\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\r\n return null;\r\n }\r\n\r\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\r\n\r\n if (!catalog || !catalog.Name) {\r\n return null;\r\n }\r\n\r\n return
{catalog.Name}
;\r\n};\r\n\r\nconst cartLineItemFunctions = {\r\n /**\r\n * Render product dimensions.\r\n * @param product - Product data.\r\n * @param dimensionStrings - Dimension strings interface.\r\n * @returns JSX Element.\r\n */\r\n renderProductDimensions: (product: SimpleProduct, dimensionStrings: IDimensionStrings) => {\r\n if (!product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return product.Dimensions.map(productDimension => {\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Color) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.colorString}\r\n {': '}\r\n {productDimension.DimensionValue?.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Configuration) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.configString}\r\n {': '}\r\n {productDimension.DimensionValue?.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Size) {\r\n return (\r\n
\r\n \r\n {dimensionStrings.sizeString}\r\n {': '}\r\n {productDimension.DimensionValue?.Value}\r\n \r\n
\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === ProductDimensionType.Style) {\r\n return (\r\n
\r\n \r\n {product.IsGiftCard ? dimensionStrings.amountString : dimensionStrings.styleString}\r\n {': '}\r\n {productDimension.DimensionValue?.Value}\r\n \r\n
\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n\r\n /**\r\n * Gets the react node for product unit of price display.\r\n * @param props - The cart line props.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n renderProductUnitPrice: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.Price) {\r\n return null;\r\n }\r\n const zeroQuantity: number = 0;\r\n return (\r\n
\r\n \r\n zeroQuantity\r\n ? {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n }\r\n : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price\r\n }\r\n }\r\n }\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n currencyCode={props.priceCurrency}\r\n />\r\n \r\n
\r\n );\r\n },\r\n\r\n /**\r\n * Render discount lines.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.DiscountLines || !ArrayExtensions.hasElements(props.data.cartLine.DiscountLines)) {\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the updated discount percentage.\r\n * @param discountLine - The discount line.\r\n * @param cartLine - The cart line.\r\n * @returns The updated discount percentage.\r\n */\r\n const discountPercent = (discountLine: DiscountLine, cartLine: CartLine): number => {\r\n const numberZero = 0;\r\n const decimalPrecision = 2;\r\n const fullPercentage = 100;\r\n let updatedPercent: number = discountLine.Percentage ?? numberZero;\r\n\r\n if (\r\n (discountLine.Percentage === numberZero ||\r\n (discountLine.DiscountLineTypeValue && discountLine.DiscountLineTypeValue === DiscountLineType.TenderTypeDiscount)) &&\r\n cartLine.Price &&\r\n cartLine.Price > numberZero &&\r\n cartLine.Quantity &&\r\n cartLine.Quantity !== numberZero\r\n ) {\r\n const effectiveAmount = discountLine.EffectiveAmount ?? numberZero;\r\n updatedPercent = Number(\r\n ((effectiveAmount / (cartLine.Price * cartLine.Quantity)) * fullPercentage).toFixed(decimalPrecision)\r\n );\r\n }\r\n\r\n return updatedPercent;\r\n };\r\n\r\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\r\n return (\r\n
\r\n {discountLine.OfferName ? discountLine.OfferName : ''}\r\n \r\n \r\n \r\n \r\n {` (${discountLine.Percentage !== undefined ? discountPercent(discountLine, props.data.cartLine) : ''}%)`}\r\n \r\n
\r\n );\r\n });\r\n },\r\n\r\n /**\r\n * Render inventory label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n const availabilityClass = props.data.availability\r\n ? (props.data.availability?.IsProductAvailable\r\n ? 'available' : 'not-available')\r\n : '';\r\n const inventoryCssName = props.inventoryLabelClassName\r\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName} ${availabilityClass}`\r\n : `msc-cart-line__product-inventory-label ${availabilityClass}`;\r\n\r\n return

{props.inventoryInformationLabel}

;\r\n },\r\n\r\n /**\r\n * Render shipping label.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderShippingLabel: (props: ICartLineProps) => {\r\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\r\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\r\n const cartline = props.data.cartLine;\r\n let hasShippingMethod = false;\r\n if (channelDeliveryOptionConfig !== undefined) {\r\n hasShippingMethod = !!(\r\n cartline.DeliveryMode &&\r\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\r\n );\r\n } else {\r\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\r\n }\r\n if (!hasShippingMethod) {\r\n return undefined;\r\n }\r\n\r\n const shippingChargeLines = (cartline.ChargeLines ?? []).filter(chargeLine => chargeLine.IsShipping);\r\n\r\n if (!ArrayExtensions.hasElements(shippingChargeLines)) {\r\n return undefined;\r\n }\r\n\r\n const defaultCharge: number = 0;\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount ?? defaultCharge);\r\n }, defaultCharge);\r\n\r\n const priceComponent = (\r\n \r\n );\r\n return (\r\n <>\r\n \r\n {priceComponent}\r\n \r\n );\r\n },\r\n\r\n /**\r\n * Render other charges.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n renderOtherCharges: (props: ICartLineProps) => {\r\n const cartline = props.data.cartLine;\r\n const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\r\n\r\n return (\r\n otherCharges?.map((otherCharge, index) => {\r\n const itemIndex = index;\r\n return otherCharge.CalculatedAmount ? (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n ) : (\r\n ''\r\n );\r\n }) ?? undefined\r\n );\r\n },\r\n\r\n /**\r\n * Render the sales agreement prompt.\r\n * @param props - The ICartLineProps.\r\n * @returns The JSX.Element.\r\n */\r\n renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\r\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- We use 0 to indicate no sales agreement applied on the cart line.\r\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\r\n return null;\r\n }\r\n return
{props.resources.salesAgreementPricePrompt}
;\r\n },\r\n\r\n renderConfirmedShipDate: (props: ICartLineProps) => {\r\n if (!props.isSalesLine || props.confirmedShipDate === undefined || StringExtensions.isNullOrEmpty(props.confirmedShipDate)) {\r\n return null;\r\n }\r\n return (\r\n
\r\n {props.resources.confirmedShipDateLabel}\r\n {props.confirmedShipDate}\r\n
\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Render cartline component.\r\n * @param props - The cart line props.\r\n * @returns JSX element.\r\n */\r\n// eslint-disable-next-line no-redeclare\r\nconst CartLine: React.FC = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources } = props;\r\n const { product, cartLine } = props.data;\r\n const quantity = cartLine.Quantity || 1;\r\n\r\n const destructDimensionStrings = {\r\n sizeString: resources.sizeString,\r\n colorString: resources.colorString,\r\n styleString: resources.styleString,\r\n configString: resources.configString,\r\n amountString: resources.amountString\r\n };\r\n\r\n const fallbackImageUrl =\r\n product &&\r\n getFallbackImageUrl(\r\n product.ItemId,\r\n props.context.actionContext.requestContext.apiSettings,\r\n props.context.request.app?.config?.OmniChannelMedia\r\n );\r\n const productDimensions = product && cartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\r\n // 'renderProductUnitPrice' is not used at the moment, but it is kept here for possible future use\r\n // @ts-ignore\r\n const renderProductUnitPrice = cartLineItemFunctions.renderProductUnitPrice(props);\r\n const imageSettings = props.imageSettings;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n // 'renderDiscountLines' is not used at the moment, but it is kept here for possible future use\r\n // @ts-ignore\r\n const renderDiscountLines = cartLineItemFunctions.renderDiscountLines(props);\r\n const renderInventoryLabel = cartLineItemFunctions.renderInventoryLabel(props);\r\n const renderShippingLabel = cartLineItemFunctions.renderShippingLabel(props);\r\n const renderOtherCharges = cartLineItemFunctions.renderOtherCharges(props);\r\n const renderConfirmedShipDate = cartLineItemFunctions.renderConfirmedShipDate(props);\r\n const renderSalesAgreementPrompt = cartLineItemFunctions.renderSalesAgreementPrompt(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\r\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const productName = product?.Name ?? cartLine.Description;\r\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\r\n const cartLineContentClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-content' : 'msc-cart-line__content';\r\n\r\n /**\r\n * Render other charges.\r\n * @param newValue - The cart line props.\r\n * @returns Boolean.\r\n */\r\n const onChange = (newValue: number) => {\r\n if (props.quantityOnChange) {\r\n props.quantityOnChange(props.data.cartLine, newValue);\r\n }\r\n };\r\n\r\n /**\r\n * Generate error message.\r\n * @returns JSX element.\r\n */\r\n const generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n
\r\n \r\n {props.errorMessage}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * Render Saving component.\r\n * @returns JSX element.\r\n */\r\n // @ts-ignore\r\n const renderSaving = (): JSX.Element | null => {\r\n if (!props.data.cartLine.DiscountAmount) {\r\n return null;\r\n }\r\n const discountAmountZero: number = 0;\r\n\r\n if (props.data.cartLine.DiscountAmount > discountAmountZero) {\r\n return (\r\n <>\r\n {`${props.resources.discountStringText || 'Discount'}`}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n const renderUnitOfMeasure = () => {\r\n if (props.data.cartLine.IsInvoiceLine) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\r\n return undefined;\r\n }\r\n\r\n if (!product || !product.DefaultUnitOfMeasure) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n };\r\n\r\n /**\r\n * Generate quantity and price component.\r\n * @returns JSX element.\r\n */\r\n const generateQuantityAndPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n const singleQuantity: number = 1;\r\n const unitOfMeasure = renderUnitOfMeasure();\r\n\r\n // No quantity selector for invoice line\r\n if (!props.data.cartLine.IsInvoiceLine) {\r\n if (props.data.product && props.isQuantityEditable) {\r\n nodes.push(\r\n
\r\n {/*
{resources.quantityDisplayString}
*/}\r\n\r\n {generateErrorMessage()}\r\n\r\n \r\n\r\n {/* {unitOfMeasure} */}\r\n
\r\n );\r\n } else {\r\n nodes.push(\r\n \r\n {unitOfMeasure}\r\n \r\n\r\n {generateErrorMessage()}\r\n\r\n {props.data.cartLine.Quantity}\r\n \r\n );\r\n }\r\n }\r\n \r\n let price = isSalesLine\r\n ? {\r\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\r\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\r\n } : {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax || (props.data.cartLine.Price || 0) * quantity, // This is shown in mini cart\r\n BasePrice: 0 // props.data.cartLine.NetPrice\r\n } as ProductPrice;\r\n const productPrice = (props.data.product as SimpleProductExt | undefined)?.ProductPrice;\r\n\r\n if (productPrice) {\r\n // price.CustomerContextualPrice = (productPrice.CustomerContextualPrice || 0) * quantity;\r\n\r\n // Only set the base price if there is an explicit discount\r\n if (getDiscountLines(productPrice.DiscountLines).length > 0) {\r\n price.BasePrice = getOriginalPrice(productPrice) * quantity;\r\n }\r\n }\r\n\r\n nodes.push(\r\n
\r\n \r\n {/* {renderSaving()} */}\r\n {props.isOutOfStock ? renderInventoryLabel : null}\r\n
\r\n );\r\n\r\n return nodes;\r\n };\r\n\r\n const _renderStoreLocation = (): JSX.Element | null => {\r\n if (cartLine && cartLine.FulfillmentStoreId) {\r\n return (\r\n
\r\n {props.deliveryLocation}\r\n
\r\n );\r\n } else {\r\n return (\r\n
\r\n {props.deliveryLocation}\r\n
\r\n );\r\n }\r\n };\r\n\r\n const badge = (props.data.product as SimpleProductExt | undefined)?.Badge;\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n {props.productError?.Error && (\r\n \r\n )}\r\n \r\n {productName}\r\n \r\n {ArrayExtensions.hasElements(productDimensions) ? (\r\n
{productDimensions}
\r\n ) : (\r\n ''\r\n )}\r\n
\r\n \r\n {renderConfirmedShipDate}\r\n {renderUnitOfMeasure()}\r\n
\r\n {/* {renderProductUnitPrice} */}\r\n {renderInventoryLabel}\r\n {/* {renderDiscountLines} */}\r\n {props.showShippingChargesForLineItems &&
{renderShippingLabel}
}\r\n {renderOtherCharges}\r\n {renderSalesAgreementPrompt}\r\n
\r\n {generateQuantityAndPrice()}\r\n {renderSalesAgreementPrompt}\r\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\r\n \r\n )}\r\n {_renderStoreLocation()}\r\n
\r\n {badge && (\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\n// @ts-expect-error\r\nexport const CartLineItemComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'CartLineItem',\r\n {\r\n component: CartLine,\r\n ...cartLineItemFunctions\r\n }\r\n);\r\n\r\nexport default CartLineItemComponent;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ActiveCartProductsInput,\n getActiveCartProductsAction,\n getAvailabilitiesForCartLineItems,\n getDeliveryOptionsForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n ProductDeliveryOptionsForCartLineItems\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CartLineValidationResultsByLineId,\n OrgUnitLocation\n} from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n UncontrolledTooltip,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n isQuantityLimitsFeatureEnabled: boolean;\n isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps {\n className: string;\n cartIcon: React.ReactNode;\n FlyoutContainer?: INodeProps;\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n isCartLoading: boolean;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass CartIcon extends React.Component, IMiniCartState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly checkoutBySignInAttributes: IDictionary | undefined;\n\n private readonly checkoutByGuestAttributes: IDictionary | undefined;\n\n private readonly viewShoppingBagAttributes: IDictionary | undefined;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private lastValidatedCartVersion: number | undefined;\n\n constructor(props: ICartIconProps) {\n super(props);\n this.state = {\n miniCartData: {},\n isCartValid: true,\n isQuantityLimitsFeatureEnabled: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n await this._setQuantityLimitsFeatureFlag();\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations?.result\n });\n\n this._validateCart();\n }\n\n public componentDidUpdate(prevProps: ICartIconProps): void {\n this._validateCart();\n }\n\n public shouldComponentUpdate(nextProps: ICartIconProps, nextState: IMiniCartState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: { enableHoverCart, isAnonymousCheckout },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n const hasInvoiceLine = cart?.hasInvoiceLine;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const cartLines = this._getCartLines();\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.state.miniCartData.productAvailabilites ?? [],\n this.props.context.actionContext,\n this.state.miniCartData.products ?? [],\n emailDeliveryModeCode\n );\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n const flyoutTitle = resources.flyoutTitle;\n const flyoutTooltip = {\n tag: UncontrolledTooltip,\n shouldShowMiniCart,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover',\n displayMode: 'FLYOUT',\n target: id,\n shouldShowCloseButton: true,\n cartPageUrl: cartUrl,\n hideAriaHidden: true\n };\n\n // If there are invoice lines, don't update mini cart price\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\n const priceString = price\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\n : '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n cartIcon: (\n \n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n\n // If there are invoice lines, don't update mini cart checkout button\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n checkoutAsSignInUserButton:\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n goToCartButton: (\n \n {goToCartButtonText}\n \n ),\n checkoutBlockedDueToUnavailableFunds: null,\n flyoutTitle: {flyoutTitle},\n totalPrice:
{priceString}
\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _validateCart(): void {\n const {\n data: { cart }\n } = this.props;\n const cartVersion = cart.result?.cart?.Version ?? undefined;\n if (this.lastValidatedCartVersion === cartVersion) {\n return;\n }\n\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n\n if (this.state.isQuantityLimitsFeatureEnabled) {\n validateCartAsync(cart, this.props.telemetry, this.props.context)\n .then((result: CartLineValidationResultsByLineId | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\n } else {\n this.setState({ isCartValid: true });\n }\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Sort cartline items.\n * @param cartlines - Cartlines to be sorted.\n * @param sortOrder - Ascending or descending.\n * @returns - Sorted cartlines.\n */\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n const lines: CartLine[] = [...cartlines];\n const zero: number = 0;\n\n if (sortOrder === cartLinesSortOrder.descending) {\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n }\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n };\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n // Cart-icon could be placed in each page\n // so we check cart content to reduce number of RS calls\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\n ? FlyoutCartLineItems({\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n quantityDisplayString: resources.quantityDisplayText,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n inputQuantityAriaLabel: '', // Not used\n discountStringText: '', // Not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: '',\n shippingText: resources.shippingText\n },\n telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // Not used\n outOfRangeOneText: '', // Not used\n outOfRangeFormatText: '', // Not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\n catalogs: this.props.data.catalogs?.result\n })\n : null;\n }\n\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input).catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n private async _setQuantityLimitsFeatureFlag(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n return;\n }\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result =\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n }\n}\n\nexport default CartIcon;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n ProductAvailableQuantity,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n\n /**\n * GridSettings for the product image in cartline\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartline\n */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isQuantityLimitsFeatureEnabled: boolean;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n outOfStockThreshold: number,\n productAvailability?: ProductAvailableQuantity\n): number => {\n if (isStockCheckEnabled) {\n if (\n !productAvailability ||\n !productAvailability.AvailableQuantity ||\n productAvailability.AvailableQuantity <= 0 ||\n productAvailability.AvailableQuantity <= outOfStockThreshold\n ) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return 0;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props: IFlyoutCartLineItemsProps,\n index: number,\n foundProductAvailability?: ProductAvailableQuantity,\n foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\n\n const availableQuantityInStock = _getCartItemAvailableQuantity(\n props.isStockCheckEnabled,\n props.outOfStockThreshold,\n foundProductAvailability\n );\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Check if the product is service or not by product type\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return {\n data: {\n product,\n cartline\n },\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n \n ),\n remove: (\n \n {removeButtonText}\n \n ),\n storeLocation: _renderStoreLocation(cartline, props)\n };\n};\n\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\n let deliverylocation;\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\n });\n }\n const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\n const location = delivery?.Description;\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n if (location) {\n deliverylocation = `${location}, ${orgUnitName}`;\n } else {\n deliverylocation = `${orgUnitName}`;\n }\n } else {\n deliverylocation = props.resources.shippingText;\n }\n return deliverylocation;\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if (orgUnitName) {\n return (\n
\n {orgUnitName}\n
\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n};\n\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps\n): IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\n\n if (!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if (product) {\n reactNodes.push(\n _assembleNode(\n cartline,\n product,\n props,\n index,\n foundProductAvailability?.ProductAvailableQuantity,\n foundProductDeliveryOption\n )\n );\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return _assembleCartlines(cartlines, products, props);\n};\n"],"names":["CatalogLabelComponent","props","catalogId","data","cartLine","CatalogId","context","request","user","isB2b","ArrayExtensions","hasElements","catalogs","catalog","find","item","RecordId","Name","React","className","cartLineItemFunctions","renderProductDimensions","product","dimensionStrings","Dimensions","map","productDimension","_productDimension$Dim","_productDimension$Dim2","_productDimension$Dim3","_productDimension$Dim4","DimensionTypeValue","ProductDimensionType","Color","key","colorString","DimensionValue","Value","Configuration","configString","Size","sizeString","Style","IsGiftCard","amountString","styleString","renderProductUnitPrice","Price","PriceComponent","Quantity","price","CustomerContextualPrice","id","typeName","currencyCode","priceCurrency","renderDiscountLines","DiscountLines","discountLine","index","_discountLine$OfferId","OfferId","OfferName","isSalesLine","PeriodicDiscount","EffectiveAmount","BasePrice","undefined","Percentage","discountPercent","_discountLine$Percent","updatedPercent","DiscountLineTypeValue","DiscountLineType","TenderTypeDiscount","_discountLine$Effecti","effectiveAmount","Number","toFixed","renderInventoryLabel","_props$data$availabil","availabilityClass","availability","IsProductAvailable","inventoryCssName","inventoryLabelClassName","inventoryInformationLabel","renderShippingLabel","_props$context$reques","_cartline$ChargeLines","pickupDeliveryModeCode","channel","PickupDeliveryModeCode","channelDeliveryOptionConfig","cartline","hasShippingMethod","_channelDeliveryOptio","DeliveryMode","PickupDeliveryModeCodes","some","deliveryMode","shippingChargeLines","ChargeLines","filter","chargeLine","IsShipping","freightFee","reduce","chargeTotal","_chargeLine$Calculate","CalculatedAmount","priceComponent","freePriceText","resources","shippingChargesText","renderOtherCharges","_cartline$ChargeLines2","_otherCharges$map","otherCharges","chargeline","otherCharge","itemIndex","String","Description","renderSalesAgreementPrompt","SalesAgreementLineRecordId","salesAgreementPricePrompt","renderConfirmedShipDate","confirmedShipDate","StringExtensions","isNullOrEmpty","confirmedShipDateLabel","CartLineItemComponent","msdyn365Commerce","createComponentOverride","_objectSpread","component","_props$context$reques2","_product$Name","_props$data$product2","_props$primaryImageUr","_props$productError","_props$productError2","productUrl","quantity","destructDimensionStrings","fallbackImageUrl","getFallbackImageUrl","ItemId","actionContext","requestContext","apiSettings","app","config","OmniChannelMedia","productDimensions","imageSettings","cropFocalRegion","payLoad","getPayloadObject","telemetryContent","toString","productAttribute","getTelemetryAttributes","productName","imgeClassName","IsInvoiceLine","cartLineContentClassName","onChange","newValue","quantityOnChange","generateErrorMessage","errorMessage","renderUnitOfMeasure","unitOfMeasureDisplayType","DefaultUnitOfMeasure","UnitOfMeasure","simpleProduct","badge","Badge","href","role","Image","src","primaryImageUrl","fallBackSrc","altText","gridSettings","loadFailureBehavior","Object","assign","productError","Error","title","NetAmount","NetAmountWithoutTax","NetPrice","showShippingChargesForLineItems","generateQuantityAndPrice","_props$data$product","nodes","unitOfMeasure","isQuantityEditable","push","ProductListOrderQuantity","LineId","currentCount","currentQuantity","unitConversions","allowZero","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","disabled","isCartStateReady","min","classNames","htmlFor","quantityDisplayString","NetAmountWithAllInclusiveTax","GrossAmount","productPrice","ProductPrice","getDiscountLines","length","getOriginalPrice","originalPriceText","currentPriceText","discountPercentageSide","isOutOfStock","cartState","priceEditorResources","CartLinePriceEditor","FulfillmentStoreId","deliveryLocation","DiscountBadge","size","async","getMiniCartData","ctx","miniCartData","cart","CartLines","hasInvoiceLine","getActiveCartProductsAction","ActiveCartProductsInput","then","products","catch","error","telemetry","exception","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","availableQuantity","productAvailabilites","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","deliveryOptions","CartIcon","constructor","super","retailMultiplePickUpOptionEnabled","getSortedCartLines","cartlines","sortOrder","lines","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","_getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","_removeItemFromCartHandler","cartlineToRemove","this","result","input","cartLineIds","removeCartLines","warning","debug","state","isCartValid","isQuantityLimitsFeatureEnabled","getTelemetryObject","telemetryPageName","friendlyName","payload","TelemetryEvent","CheckOut","TelemetryConstant","Checkout","checkoutBySignInAttributes","contentAction","etext","GuestCheckout","checkoutByGuestAttributes","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","reaction","_this$props$data$cart","setState","_setQuantityLimitsFeatureFlag","orgUnitLocations","_validateCart","componentDidUpdate","prevProps","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$r","_cart$cart$CartLines","_this$state$miniCartD","_this$state$miniCartD2","_this$props$data$chan","_this$props$data$feat","enableHoverCart","isAnonymousCheckout","isAuthenticated","signInUrl","guestCheckoutUrl","getUrlSync","cartUrl","checkoutURL","_getCheckoutURL","isCartEmpty","shouldShowMiniCart","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","emailDeliveryModeCode","EmailDeliveryModeCode","cartLines","_getCartLines","validInventoryAcrossCartLines","validateCartLinesInventory","hasError","isValid","includeFlyout","status","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","replace","flyoutTitle","flyoutTooltip","tag","UncontrolledTooltip","placement","hideArrow","trigger","displayMode","target","shouldShowCloseButton","cartPageUrl","hideAriaHidden","TotalAmount","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","featureState","feature","IsEnabled","viewProps","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","CartlinesWrapper","miniCartWrapper","classnames","miniCartItemWrapper","checkoutAsSignInUserButton","Button","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","goToCartButton","checkoutBlockedDueToUnavailableFunds","totalPrice","renderView","_cart$result$cart$Ver","_cart$result","cartVersion","Version","lastValidatedCartVersion","validateCartAsync","ValidationResultsPairs","isAbsoluteUrl","urlCheck","returnURL","isBrowser","window","location","origin","includes","_this$props$data$cata","FlyoutCartLineItems","cartLinesSortOrder","productDeliveryOptions","outOfStockThreshold","isStockCheckEnabled","enableStockCheck","maxCartlineQuantity","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","productDimensionTypeSize","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeStyle","quantityDisplayText","discountStringText","shippingText","removeButtonText","removeCartButtonText","outOfStockText","outOfRangeOneText","outOfRangeFormatText","removeItemClickHandler","_featureStatuses$find","_this$props$context","featureStatuses","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","_featureStatuses$find2","customerInformation","customerInfo","IsB2b","__decorate","observer","_renderDeliveryLocation","deliverylocation","_foundProductDelivery","orgUnitName","_getOrgUnitName","foundProductDeliveryOption","deliveryOption","ProductId","delivery","DeliveryOptions","option","Code","_renderStoreLocation","fulfillmentStoreId","foundLocation","orgUnitLocation","OrgUnitNumber","OrgUnitName","_assembleCartlines","reactNodes","foundProductAvailability","_foundProductAvailabi","getProductByProductIdAndWarehouse","WarehouseId","getProductByProductId","productAvailability","_productAvailability$","ProductAvailableQuantity","_assembleNode","foundProductDeliveryOptions","_product$Behavior","availableQuantityInStock","AvailableQuantity","_getCartItemAvailableQuantity","maxQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","Behavior","MaximumQuantity","isServiceItem","ItemTypeValue","ReleasedProductType","Service","onRemoveClickHandler","onRemoveClickFunction","RemoveCartItem","removeCartItemAttribute","getProductUrlSync","MsDyn365","isChannelTypeB2B","_cartline$CatalogId","fullUrl","URL","searchParams","set","PrimaryImageUrl","remove","onClick","storeLocation"],"sourceRoot":""}