{"version":3,"file":"static/js/dbd1cc78eb3bd7b776e6.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b","webpack://Msdyn365.Commerce.Online/./src/actions/get-product-attributes-cartlines.action.ts?e311","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","webpack://Msdyn365.Commerce.Online/./src/modules/bc-cart-icon/components/carticon.component.tsx?003c","webpack://Msdyn365.Commerce.Online/./lib/bc-cart-icon/module-registration.js?4b1d","webpack://Msdyn365.Commerce.Online/./src/modules/bc-cart-icon/bc-cart-icon.props.autogenerated.ts?344b","webpack://Msdyn365.Commerce.Online/./src/modules/bc-cart-icon/components/flyout-cart-line-items.tsx?782f","webpack://Msdyn365.Commerce.Online/./src/modules/bc-cart-icon/utils/get-products-in-mini-cart.ts?99ac","webpack://Msdyn365.Commerce.Online/./src/modules/bc-cart-icon/bc-cart-icon.tsx?6129","webpack://Msdyn365.Commerce.Online/./src/modules/bc-cart-icon/bc-cart-icon.view.tsx?b75d"],"sourcesContent":["module.exports = React;","module.exports = ReactDOM;","/*!\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getCatalogId } from '@msdyn365-commerce/core';\r\nimport { getAttributeValuesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n/**\r\n * GetProductAttributesCartlines Input Action\r\n */\r\nexport class GetProductAttributesCartlinesInput implements Msdyn365.IActionInput {\r\n public productID: number;\r\n constructor(productID: number) {\r\n this.productID = productID;\r\n }\r\n\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `getProductAttributeCartline`;\r\n public getCacheObjectType = () => 'getProductAttributeCartline';\r\n public dataCacheType = (): Msdyn365.CacheType => 'none';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetProductAttributesCartlinesData {\r\n productAttributes: AttributeValue[];\r\n}\r\n\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nexport async function getProductAttributeCartlineAction(\r\n input: GetProductAttributesCartlinesInput,\r\n ctx: Msdyn365.IActionContext\r\n): Promise {\r\n const catalogId = getCatalogId(ctx.requestContext);\r\n const channelID = +ctx.requestContext.apiSettings.channelId;\r\n\r\n const attributeValueResponse = await getAttributeValuesAsync({ callerContext: ctx }, input.productID, channelID, catalogId);\r\n return { productAttributes: attributeValueResponse };\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >getProductAttributeCartlineAction,\r\n id: 'GetProductAttributesCartlines'\r\n});\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\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\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 } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n this.setState({ isQuantityLimitsFeatureEnabled: !(cartConfiguration?.IgnoreOrderSettings ?? false) });\n return;\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","/*!\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 { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { format, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\n/**\r\n * ICartIconData: Interface for Cart Icon Data.\r\n */\r\nexport interface ICartIconData {\r\n cart?: ICartState;\r\n}\r\n\r\n/**\r\n * ICartIconComponentProps: Interface for Cart Icon component props.\r\n */\r\nexport interface ICartIconComponentProps extends IComponentProps {\r\n className?: string;\r\n cartLabel: string;\r\n cartQtyLabel: string;\r\n telemetryContent?: ITelemetryContent;\r\n salesAgreementPricePrompt?: string;\r\n}\r\n\r\n/**\r\n * ICartIconComponent: Interface for Cart Icon component.\r\n */\r\nexport interface ICartIconComponent extends IComponent {}\r\n\r\nconst CartIconComponentActions = {};\r\n\r\n/**\r\n *\r\n * CartIcon component.\r\n * @extends {React.FC}\r\n */\r\nconst CartIcon: React.FC = observer((props: ICartIconComponentProps) => {\r\n const {\r\n cartLabel,\r\n cartQtyLabel,\r\n data: { cart }\r\n } = props;\r\n const defaultCartItemCount: number = 0;\r\n\r\n const cartItem = cart ? cart.totalItemsInCart : defaultCartItemCount;\r\n let qtyLabel: string = '';\r\n const cartMaxQuantity: number = 99;\r\n const maxQuantityLabel: string = '99+';\r\n if (cartItem > cartMaxQuantity) {\r\n qtyLabel = maxQuantityLabel;\r\n } else {\r\n qtyLabel = format(cartQtyLabel, cartItem);\r\n }\r\n const label = format(cartLabel, cartItem);\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, 'cart-icon', '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const style: React.CSSProperties = {\r\n visibility: cart ? 'visible' : 'hidden'\r\n };\r\n return (\r\n
\r\n
\r\n {qtyLabel}\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport const CartIconComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n // @ts-expect-error -- Compatible issue with the component override.\r\n ICartIconComponent\r\n>('CartIcon', { component: CartIcon, ...CartIconComponentActions });\r\n\r\nexport default CartIconComponent;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['bc-cart-icon'] = {\n c: () => require('partner/modules/bc-cart-icon/bc-cart-icon.tsx'),\n $type: 'containerModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action', runOn: 1},{name:'cartConfiguration', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-cart-configuration', runOn: 0},{name:'catalogs', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-catalogs', runOn: 0},{name:'channelDeliveryOptionConfig', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration', runOn: 0},{name:'customerBalances', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer-balance', runOn: 0},{name:'customerInformation', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'orgUnitLocations', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'bc-cart-icon',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/bc-cart-icon'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-cart-configuration';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-cart-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-catalogs';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-catalogs');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer-balance';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer-balance');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|bc-cart-icon|bc-cart-icon'] = {\n c: () => require('partner/modules/bc-cart-icon/bc-cart-icon.view.tsx'),\n cn: '__local__-__local__-bc-cart-icon'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IBcCartIcon containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum cartLinesSortOrder {\r\n ascending = 'ascending',\r\n descending = 'descending'\r\n}\r\n\r\nexport interface IBcCartIconConfig extends Msdyn365.IModuleConfig {\r\n imageSettings?: Msdyn365.IImageSettings;\r\n enableHoverCart?: boolean;\r\n cartLinesSortOrder?: cartLinesSortOrder;\r\n isAnonymousCheckout?: boolean;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface IBcCartIconResources {\r\n goToCartButtonTitle: string;\r\n totalPriceFormatString: string;\r\n guestCheckoutButtonTitle: string;\r\n checkoutButtonTitle: string;\r\n productDimensionTypeColor: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n productDimensionTypeConfiguration: string;\r\n quantityDisplayText: string;\r\n removeCartButtonText: string;\r\n cartLabel: string;\r\n cartQtyLabel: string;\r\n flyoutTitle: string;\r\n salesAgreementPricePrompt: string;\r\n shippingText: string;\r\n checkoutBlockedDueToUnavailableFundsTitle: string;\r\n checkoutBlockedDueToUnavailableFundsMessage: string;\r\n continueShoppingButtonTitle: string;\r\n subTotalMessage: string;\r\n item: string;\r\n items: string;\r\n emptyPrice: string;\r\n subtotalLabel: string;\r\n}\r\n\r\nexport interface IBcCartIconProps extends Msdyn365.IModule {\r\n resources: IBcCartIconResources;\r\n config: IBcCartIconConfig;\r\n slots: {\r\n emptyCart: React.ReactNode[];\r\n promoContentItem: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n OrgUnitLocation,\r\n ProductAvailableQuantity,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\n\r\nexport interface IFlyoutCartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n catalogs?: ProductCatalog[];\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 id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n maxCartlineQuantity: number;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\nexport interface IFlyoutCartLineItemViewProps {\r\n cartline: React.ReactNode;\r\n remove: React.ReactNode;\r\n storeLocation: React.ReactNode;\r\n hasError: boolean;\r\n\r\n data: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (\r\n isStockCheckEnabled: boolean,\r\n outOfStockThreshold: number,\r\n productAvailability?: ProductAvailableQuantity\r\n): number => {\r\n if (isStockCheckEnabled) {\r\n if (\r\n !productAvailability ||\r\n !productAvailability.AvailableQuantity ||\r\n productAvailability.AvailableQuantity <= 0 ||\r\n productAvailability.AvailableQuantity <= outOfStockThreshold\r\n ) {\r\n return 0;\r\n }\r\n return productAvailability.AvailableQuantity - outOfStockThreshold;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxQuantityByConfig: number,\r\n isStockCheckEnabled: boolean,\r\n availableQuantityInStock: number,\r\n isQuantityLimitsFeatureEnabled: boolean,\r\n maxByQuantityLimitsFeature: number\r\n) => {\r\n if (isQuantityLimitsFeatureEnabled) {\r\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\r\n // and consider available qty if stock check enabled and max from config in site settings.\r\n if (!maxByQuantityLimitsFeature) {\r\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n }\r\n\r\n return isStockCheckEnabled\r\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\r\n ? maxByQuantityLimitsFeatureResult\r\n : availableQuantityInStock\r\n : maxByQuantityLimitsFeatureResult;\r\n }\r\n if (isStockCheckEnabled) {\r\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\r\n }\r\n return maxQuantityByConfig;\r\n};\r\n\r\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n removeItemClickHandler(cartline);\r\n};\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: IFlyoutCartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: ProductAvailableQuantity,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions\r\n): IFlyoutCartLineItemViewProps => {\r\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\r\n\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(\r\n props.isStockCheckEnabled,\r\n props.outOfStockThreshold,\r\n foundProductAvailability\r\n );\r\n const maxQuantity =\r\n product &&\r\n _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n availableQuantityInStock,\r\n props.isQuantityLimitsFeatureEnabled,\r\n product?.Behavior?.MaximumQuantity || 0\r\n );\r\n\r\n // Check if the product is service or not by product type\r\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\r\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n\r\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\r\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\r\n const fullUrl = new URL(productUrl, window.location.href);\r\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\r\n productUrl = fullUrl.href;\r\n }\r\n\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\r\n cartline: (\r\n \r\n ),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n storeLocation: _renderStoreLocation(cartline, props)\r\n };\r\n};\r\n\r\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\r\n let deliverylocation;\r\n if (cartLine && cartLine.FulfillmentStoreId) {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\r\n\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\r\n });\r\n }\r\n const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\r\n const location = delivery?.Description;\r\n\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n if (location) {\r\n deliverylocation = `${location}, ${orgUnitName}`;\r\n } else {\r\n deliverylocation = `${orgUnitName}`;\r\n }\r\n } else {\r\n deliverylocation = props.resources.shippingText;\r\n }\r\n return deliverylocation;\r\n};\r\n\r\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\r\n if (cartLine && cartLine.FulfillmentStoreId) {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\r\n\r\n if (orgUnitName) {\r\n return (\r\n
\r\n {orgUnitName}\r\n
\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n }\r\n return fulfillmentStoreId;\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: IFlyoutCartLineItemsProps\r\n): IFlyoutCartLineItemViewProps[] | null => {\r\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n let product;\r\n if (props.isQuantityLimitsFeatureEnabled) {\r\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n // to check productId and WarehouseId for identification.\r\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n } else {\r\n product = getProductByProductId(cartline.ProductId, products);\r\n }\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(\r\n _assembleNode(\r\n cartline,\r\n product,\r\n props,\r\n index,\r\n foundProductAvailability?.ProductAvailableQuantity,\r\n foundProductDeliveryOption\r\n )\r\n );\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n */\r\n\r\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return _assembleCartlines(cartlines, products, props);\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AttributeValue, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ActiveCartProductsInput,\r\n getActiveCartProductsAction,\r\n getAvailabilitiesForCartLineItems,\r\n getDeliveryOptionsForCartLineItems,\r\n IProductInventoryInformation,\r\n ProductAvailabilitiesForCartLineItems,\r\n ProductDeliveryOptionsForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport {\r\n GetProductAttributesCartlinesInput,\r\n getProductAttributeCartlineAction\r\n} from '../../../actions/get-product-attributes-cartlines.action';\r\n\r\ninterface SimpleProductExtended extends SimpleProduct {\r\n Attributes?: AttributeValue[];\r\n}\r\n\r\n/**\r\n * IMiniCartData entity interface.\r\n */\r\nexport interface IMiniCartData {\r\n products?: SimpleProduct[];\r\n productAvailabilites?: IProductInventoryInformation[];\r\n deliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\nexport const createInput = () => {\r\n return new ActiveCartProductsInput();\r\n};\r\nconst getProductAttributes = async (ctx: IActionContext, products: SimpleProductExtended[]): Promise => {\r\n if (products) {\r\n // eslint-disable-next-line prefer-const\r\n for (let product of products) {\r\n try {\r\n const getAttributeValueInput = new GetProductAttributesCartlinesInput(Number(product.RecordId));\r\n\r\n const productSpecificationData = await getProductAttributeCartlineAction(getAttributeValueInput, ctx);\r\n product.Attributes = productSpecificationData.productAttributes;\r\n } catch (e) {\r\n console.error('Error fetching product attributes:', e);\r\n }\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a mini cart data.\r\n * @param ctx\r\n * @param cartState\r\n */\r\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise {\r\n const miniCartData: IMiniCartData = {};\r\n\r\n const cart = cartState.cart;\r\n\r\n // If there are cart lines, make call to get products\r\n // If there are invocie linese, then there is no products, so don't make call to get products\r\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\r\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\r\n .then(products => {\r\n if (products) {\r\n miniCartData.products = products as SimpleProductExtended[] | undefined;\r\n void getProductAttributes(ctx, products);\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(availableQuantity => {\r\n if (availableQuantity) {\r\n miniCartData.productAvailabilites = availableQuantity;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(deliveryOptions => {\r\n if (deliveryOptions) {\r\n miniCartData.deliveryOptions = deliveryOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n }\r\n\r\n return miniCartData;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { AddToCartBehavior } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n CartLineValidationResultsByLineId,\r\n OrgUnitLocation\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { CartIconComponent } from './components/carticon.component';\r\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n INodeProps,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n UncontrolledTooltip,\r\n updateMaxQuantityForCartLineItem,\r\n urlCheck\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\n\r\nimport { IBcCartIconData } from './bc-cart-icon.data';\r\nimport { cartLinesSortOrder, IBcCartIconProps } from './bc-cart-icon.props.autogenerated';\r\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\r\n\r\nexport interface IMiniCartState {\r\n miniCartData: IMiniCartData;\r\n orgUnitLocations?: OrgUnitLocation[];\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n isCartValid: boolean;\r\n}\r\n\r\nexport interface ICartIconViewProps extends IBcCartIconProps {\r\n className: string;\r\n cartIcon: React.ReactNode;\r\n FlyoutContainer?: INodeProps;\r\n CartlinesWrapper: INodeProps;\r\n miniCartWrapper: INodeProps;\r\n miniCartItemWrapper: INodeProps;\r\n cartlines?: IFlyoutCartLineItemViewProps[];\r\n flyoutTitle: React.ReactNode;\r\n totalPrice: React.ReactNode;\r\n checkoutAsGuestButton?: React.ReactNode;\r\n checkoutAsSignInUserButton?: React.ReactNode;\r\n goToCartButton?: React.ReactNode;\r\n waitingComponent?: React.ReactNode;\r\n isCartLoading: boolean;\r\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass CartIcon extends React.Component, IMiniCartState> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly checkoutBySignInAttributes: IDictionary | undefined;\r\n\r\n private readonly checkoutByGuestAttributes: IDictionary | undefined;\r\n\r\n private readonly viewShoppingBagAttributes: IDictionary | undefined;\r\n\r\n private retailMultiplePickUpOptionEnabled?: boolean = false;\r\n\r\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n private lastValidatedCartVersion: number | undefined;\r\n\r\n constructor(props: IBcCartIconProps) {\r\n super(props);\r\n this.state = {\r\n miniCartData: {},\r\n isCartValid: true,\r\n isQuantityLimitsFeatureEnabled: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\r\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n\r\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n\r\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\r\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const context = this.props.context.actionContext;\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n this.setState({\r\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\r\n });\r\n }\r\n );\r\n await this._setQuantityLimitsFeatureFlag();\r\n\r\n this.setState({\r\n orgUnitLocations: this.props.data.orgUnitLocations?.result\r\n });\r\n\r\n this._validateCart();\r\n }\r\n\r\n public componentDidUpdate(prevProps: IBcCartIconProps): void {\r\n this._validateCart();\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IBcCartIconProps, nextState: IMiniCartState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n config: { enableHoverCart, isAnonymousCheckout },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n context,\r\n resources\r\n } = this.props;\r\n\r\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart =\r\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n const hasInvoiceLine = cart?.hasInvoiceLine;\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n const cartLines = this._getCartLines();\r\n const validInventoryAcrossCartLines = validateCartLinesInventory(\r\n cart?.cart.CartLines ?? [],\r\n this.state.miniCartData.productAvailabilites ?? [],\r\n this.props.context.actionContext,\r\n this.state.miniCartData.products ?? [],\r\n emailDeliveryModeCode\r\n );\r\n const hasError =\r\n !validInventoryAcrossCartLines?.isValid ||\r\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\r\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\r\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\r\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\r\n const flyoutTitle = resources.flyoutTitle;\r\n const flyoutTooltip = {\r\n tag: UncontrolledTooltip,\r\n shouldShowMiniCart,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__flyout-container',\r\n trigger: 'hover',\r\n displayMode: 'FLYOUT',\r\n target: id,\r\n shouldShowCloseButton: true,\r\n cartPageUrl: cartUrl,\r\n hideAriaHidden: true\r\n };\r\n\r\n // If there are invoice lines, don't update mini cart price\r\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\r\n const priceString = price\r\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\r\n : '';\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\r\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\r\n feature => feature.Name === multiplePickupStoreSwitchName\r\n )?.IsEnabled;\r\n\r\n const viewProps = {\r\n ...this.props,\r\n cartIcon: (\r\n \r\n ),\r\n cartlines: cartLines,\r\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\r\n CartlinesWrapper: {\r\n className: 'ms-cart-icon__cart-lines'\r\n },\r\n miniCartWrapper: {\r\n className: classnames('ms-cart-icon'),\r\n id: this.props.id\r\n },\r\n miniCartItemWrapper: {\r\n className: classnames('msc-cart-lines-item')\r\n },\r\n\r\n // If there are invoice lines, don't update mini cart checkout button\r\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\r\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\r\n checkoutAsSignInUserButton:\r\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n ) : null,\r\n checkoutAsGuestButton:\r\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n ) : null,\r\n goToCartButton: (\r\n \r\n {goToCartButtonText}\r\n \r\n ),\r\n checkoutBlockedDueToUnavailableFunds: null,\r\n flyoutTitle: {flyoutTitle},\r\n totalPrice:
{priceString}
\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _validateCart(): void {\r\n const {\r\n data: { cart }\r\n } = this.props;\r\n const cartVersion = cart.result?.cart?.Version ?? undefined;\r\n if (this.lastValidatedCartVersion === cartVersion) {\r\n return;\r\n }\r\n\r\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\r\n\r\n if (this.state.isQuantityLimitsFeatureEnabled) {\r\n validateCartAsync(cart, this.props.telemetry, this.props.context)\r\n .then((result: CartLineValidationResultsByLineId | undefined) => {\r\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\r\n })\r\n .catch(() => {\r\n this.setState({ isCartValid: false });\r\n });\r\n } else {\r\n this.setState({ isCartValid: true });\r\n }\r\n }\r\n\r\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n /**\r\n * Sort cartline items.\r\n * @param cartlines - Cartlines to be sorted.\r\n * @param sortOrder - Ascending or descending.\r\n * @returns - Sorted cartlines.\r\n */\r\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\r\n const lines: CartLine[] = [...cartlines];\r\n const zero: number = 0;\r\n\r\n if (sortOrder === cartLinesSortOrder.descending) {\r\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\r\n }\r\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\r\n };\r\n\r\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\r\n const {\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n const cart = this.props.data.cart && this.props.data.cart.result;\r\n\r\n // Cart-icon could be placed in each page\r\n // so we check cart content to reduce number of RS calls\r\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\r\n ? FlyoutCartLineItems({\r\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\r\n products: this.state.miniCartData.products,\r\n productAvailabilites: this.state.miniCartData.productAvailabilites,\r\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\r\n imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n inputQuantityAriaLabel: '', // Not used\r\n discountStringText: '', // Not used\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: '',\r\n shippingText: resources.shippingText\r\n },\r\n telemetry,\r\n removeButtonText: resources.removeCartButtonText,\r\n outOfStockText: '', // Not used\r\n outOfRangeOneText: '', // Not used\r\n outOfRangeFormatText: '', // Not used\r\n cartState: cart,\r\n orgUnitLocations: this.state.orgUnitLocations,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n telemetryContent: this.telemetryContent,\r\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\r\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\r\n catalogs: this.props.data.catalogs?.result\r\n })\r\n : null;\r\n }\r\n\r\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return (\r\n imageSettings || {\r\n viewports: {\r\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\r\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n }\r\n );\r\n };\r\n\r\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input).catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n private async _setQuantityLimitsFeatureFlag(): Promise {\r\n const featureStatuses = await this.props.data.featureState;\r\n\r\n const isChannelQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\r\n )?.IsEnabled || false;\r\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\r\n this.setState({ isQuantityLimitsFeatureEnabled: true });\r\n return;\r\n }\r\n // ITS - Keeping code for 10.0.40 to enable mini cart items, once updates are in the FnO we can enable this feature.\r\n // const useSiteBuilderSettings = featureStatuses?.find(\r\n // featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\r\n // )?.IsEnabled;\r\n // if (useSiteBuilderSettings) {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n } catch (error) {\r\n //@ts-ignore\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n this.setState({ isQuantityLimitsFeatureEnabled: true });\r\n } else {\r\n this.props.data.customerInformation\r\n .then(customerInfo => {\r\n const result =\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\r\n this.setState({ isQuantityLimitsFeatureEnabled: result });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n });\r\n }\r\n // }\r\n // } else {\r\n // const cartConfiguration = await this.props.data.cartConfiguration;\r\n // this.setState({ isQuantityLimitsFeatureEnabled: !(cartConfiguration?.IgnoreOrderSettings ?? false) });\r\n // return;\r\n // }\r\n }\r\n}\r\n\r\nexport default CartIcon;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { AddToCartBehavior } from '@msdyn365-commerce/components';\r\nimport { Button, getPayloadObject, INodeProps, KeyCodes, Modal, Node, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport classnames from 'classnames';\r\n\r\nimport { ICartIconViewProps } from './bc-cart-icon';\r\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\nimport { ICartViewProps } from '../bc-cart/bc-cart';\r\n\r\n/**\r\n * ICartIconViewState: Interface for Cart Icon View State.\r\n */\r\ninterface ICartIconViewState {\r\n isModalOpen: boolean;\r\n}\r\n\r\n/**\r\n * Render Cart lines.\r\n * @param cartLines - Flyout cart line view props.\r\n * @param props - Cart icon view props.-\r\n * @returns JSX Element.\r\n */\r\nconst renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\r\n if (!cartLines) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n return cartLines.map((cartLine, index) => {\r\n const cartLineIndex = index;\r\n return (\r\n \r\n {cartLine.cartline}\r\n {cartLine.storeLocation}\r\n {cartLine.remove}\r\n \r\n );\r\n });\r\n};\r\n\r\n/**\r\n * Initiate total price.\r\n * @param props - Cart icon view props.\r\n * @returns JSX Element.\r\n */\r\nconst renderTotalPrice = (props: ICartIconViewProps): JSX.Element | null => {\r\n const cart = props.data.cart.result ?? undefined;\r\n const price = cart && !cart.hasInvoiceLine && (cart.cart.TotalAmount || undefined);\r\n const totalPrice = price\r\n ? props.context.cultureFormatter.formatCurrency(price)\r\n : props.context.cultureFormatter.formatCurrency(props.resources.emptyPrice);\r\n return (\r\n
\r\n \r\n {props.resources.subtotalLabel}\r\n {totalPrice}\r\n \r\n
\r\n );\r\n};\r\n\r\n/**\r\n *\r\n * CartIconView component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class CartIconView extends React.PureComponent {\r\n private isAutoDisplayTriggered: boolean;\r\n\r\n private readonly cartIconRef: React.RefObject = React.createRef();\r\n\r\n public constructor(props: ICartViewProps & ICartIconViewState & ICartIconViewProps) {\r\n super(props);\r\n this.isAutoDisplayTriggered = false;\r\n this.state = {\r\n isModalOpen: false\r\n };\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('keydown', this._escFunction, false);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser) {\r\n window.removeEventListener('keydown', this._escFunction, false);\r\n }\r\n }\r\n\r\n /**\r\n * Render Cart Item count.\r\n * @returns JSX Element.\r\n */\r\n public render(): JSX.Element | null {\r\n const cart = this.props.data.cart.result ?? undefined;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart =\r\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n if (shouldShowMiniCart) {\r\n if (!this.isAutoDisplayTriggered) {\r\n // First time trigger auto mini cart.\r\n this.setState({ isModalOpen: true });\r\n this.isAutoDisplayTriggered = true;\r\n } else if (!this.state.isModalOpen) {\r\n // If modal is closed, reset the flag.\r\n this.isAutoDisplayTriggered = false;\r\n }\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n {this.props.flyoutTitle}\r\n {this._renderCartItemCount(this.props)}\r\n {this._renderCartCloseIcon()}\r\n \r\n \r\n {this.props.data.cart.result?.isEmpty ? this.props.slots.emptyCart : null}\r\n {this.props.checkoutBlockedDueToUnavailableFunds}\r\n {renderCartlines(this.props.cartlines, this.props)}\r\n \r\n \r\n {this.props.slots.promoContentItem}\r\n {renderTotalPrice(this.props)}\r\n

{this.props.resources.subTotalMessage}

\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.checkoutAsGuestButton}\r\n {this.props.data.cart.result?.isEmpty ? null : this.props.goToCartButton}\r\n \r\n {this.props.data.cart.result?.isEmpty ? (\r\n \r\n {this.props.resources.continueShoppingButtonTitle}\r\n \r\n ) : null}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Initiate modal container.\r\n * @returns Inode props.\r\n */\r\n\r\n private readonly _modalContainer = (): INodeProps => {\r\n return {\r\n tag: Modal,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__minicartmodal-container',\r\n wrapClassName: 'ms-cart-icon__minicartmodal',\r\n isOpen: this.state.isModalOpen,\r\n toggle: this.closeModal\r\n };\r\n };\r\n\r\n /**\r\n * Initiate open modal.\r\n */\r\n private readonly _openModal = async (): Promise => {\r\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'cart-icon', '');\r\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'cart-icon');\r\n\r\n // Fetch product attributes when the modal opens\r\n this.setState({\r\n isModalOpen: true\r\n });\r\n };\r\n\r\n /**\r\n * Initiate close modal.\r\n */\r\n private readonly closeModal = (): void => {\r\n this.cartIconRef.current?.focus();\r\n this.setState({\r\n isModalOpen: false\r\n });\r\n };\r\n\r\n /**\r\n * Initiate cart close Icon.\r\n * @returns JSX Element.\r\n */\r\n private readonly _renderCartCloseIcon = (): JSX.Element | null => {\r\n return