{"version":3,"file":"static/js/9.ad8c975feb73e9205017.chunk.js","mappings":"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","sources":["webpack://Citta2.0/./src/components/citta-cart/cart-line-items.tsx?5e8b","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-pick-up-in-store.tsx?9701","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-items.tsx?0f67","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-groups.tsx?9a00","webpack://Citta2.0/./src/modules/citta-cart/utils/get-promotion-in-citta-cart.ts?15a5","webpack://Citta2.0/./src/modules/citta-cart/citta-cart.tsx?bb3f","webpack://Citta2.0/./src/modules/citta-cart/components/hso-validate-cartlines-inventory.tsx?97a2","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-items-promotion.tsx?25f5","webpack://Citta2.0/./src/modules/citta-cart/citta-cart.view.tsx?6edb","webpack://Citta2.0/./src/modules/citta-header/components/logo.tsx?d610","webpack://Citta2.0/./src/modules/citta-header/components/nav-icon.tsx?2883","webpack://Citta2.0/./src/modules/citta-header/components/citta-header-preferred-store.tsx?31a1","webpack://Citta2.0/./src/modules/citta-header/citta-header.tsx?01c9","webpack://Citta2.0/./src/modules/citta-header/citta-header.view.tsx?4656","webpack://Citta2.0/./src/modules/citta-media-gallery/utils/get-valid-product-images.ts?8597","webpack://Citta2.0/./src/modules/citta-media-gallery/citta-media-gallery.tsx?192b","webpack://Citta2.0/./src/modules/citta-media-gallery/citta-media-gallery.view.tsx?a3eb","webpack://Citta2.0/./src/themes/citta/views/cart.view.tsx?dc69","webpack://Citta2.0/./src/themes/citta/views/citta-cart.view.tsx?d1fe","webpack://Citta2.0/./src/themes/citta/views/components/cart-icon.component.tsx?a3df","webpack://Citta2.0/./src/themes/citta/views/header.view.tsx?b6f0","webpack://Citta2.0/./src/validate-cart.ts?cd50","webpack://Citta2.0/./src/Common/get-product.ts?0a21","webpack://Citta2.0/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://Citta2.0/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://Citta2.0/./src/modules/cart-icon/cart-icon.view.tsx?f9dd","webpack://Citta2.0/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4","webpack://Citta2.0/./src/modules/cart/actions/get-pickup-options-for-cartlines.ts?acad","webpack://Citta2.0/./src/modules/cart/components/cart-line-groups.tsx?f076","webpack://Citta2.0/./src/modules/cart/utils/get-promotion-in-cart.ts?4195","webpack://Citta2.0/./src/modules/cart/cart.tsx?d4e4","webpack://Citta2.0/./src/modules/cart/cart.view.tsx?d8c2","webpack://Citta2.0/./src/modules/cart/components/cart-line-items-promotion.tsx?80d9","webpack://Citta2.0/./src/modules/cart/components/cart-line-items.tsx?f6b2","webpack://Citta2.0/./src/modules/cart/components/cart-pick-up-in-store.tsx?dca8","webpack://Citta2.0/./src/common/error.tsx?096f","webpack://Citta2.0/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://Citta2.0/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://Citta2.0/./src/modules/media-gallery/utils/helper.ts?b895","webpack://Citta2.0/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from '@msdyn365-commerce-modules/cart';\r\nimport { getProductUrlSync, IProductInventoryInformation, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, CommerceList, Customer, LineDataValidationFailure, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n// import { PropertyUserActionClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport * as React from 'react';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: LineDataValidationFailure[];\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 /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\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 addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n storeSelectorModuleId?: string;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n\r\n data?: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getProduct = (productId: number | undefined, products: SimpleProduct[]): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find(product => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: IProductInventoryInformation, productMaxQuantity?: number) => {\r\n const lineMaxQuantity = productMaxQuantity ? productMaxQuantity : maxCartlineQuantity;\r\n\r\n if (isStockCheckEnabled) {\r\n if (!productAvailability || !productAvailability.ProductAvailableQuantity || !productAvailability.IsProductAvailable || !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\r\n return 0;\r\n }\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity ? productAvailability.ProductAvailableQuantity.AvailableQuantity : lineMaxQuantity;\r\n }\r\n\r\n return lineMaxQuantity;\r\n};\r\n\r\nconst _getErrorMessage = (maxQuantity: number, currentQuantity: number, props: ICartLineItemsProps, lineIndex: number, isServiceItem: boolean, eoqQuantity:number): string | undefined => {\r\n \r\n const finalErrorMessage: string[] = [];\r\n if (props.includeErrors) {\r\n if (props.isStockCheckEnabled && !isServiceItem) {\r\n if (maxQuantity <= 0) {\r\n finalErrorMessage.push(props.outOfStockText);\r\n } else if (maxQuantity < currentQuantity) {\r\n if (maxQuantity === 1) {\r\n finalErrorMessage.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessage.push(props.outOfRangeFormatText.replace('{numLeft}', maxQuantity.toString()));\r\n }\r\n }\r\n }\r\n }\r\n const eoqErrorMessage = `Must be purchased in multiples of ${eoqQuantity}`;\r\n\r\n // server-side validation\r\n props.cartlinesErrors\r\n .filter(i => i.LineIndex === lineIndex)\r\n .forEach(i => {\r\n if (\r\n i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityViolatesMultiplicityOfConfiguredNumber\" ||\r\n i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityLessThanMinimumAndViolatesMultiplicityOfConfiguredNumber\") {\r\n finalErrorMessage.push(eoqErrorMessage);\r\n } else if (i.DataValidationFailure?.ErrorContext) {\r\n finalErrorMessage.push(i.DataValidationFailure.ErrorContext);\r\n }\r\n });\r\n\r\n if (finalErrorMessage.length > 0) {\r\n return finalErrorMessage.join(' ');\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions)\r\n : ICartlinesViewProps => {\r\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\r\n removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText,\r\n addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\r\n wishlists, defaultWishlistName, storeSelectorModuleId } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability,\r\n props.isQuantityLimitsFeatureEnabled ? product.Behavior?.MaximumQuantity : undefined);\r\n\r\n // check if the product is service or not by product type\r\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\r\n const isServiceItem = product.ItemTypeValue === PRODUCTASSERVICE;\r\n\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const eoqQuantity:number =isB2B? product.Behavior?.MultipleOfQuantity || 1 : 1;\r\n const errorMessage = _getErrorMessage(maxQuantity, cartline.Quantity!, props, index, isServiceItem, eoqQuantity);\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => { removeItemClickHandler(cartline); };\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}` : undefined;\r\n return {\r\n data: {\r\n product: product,\r\n cartline: cartline\r\n },\r\n error: errorMessage,\r\n cartline: (\r\n ),\r\n pickUpInStore: (\r\n PickUpInStore({\r\n storeSelectorModuleId: storeSelectorModuleId,\r\n cartState: props.cartState,\r\n cartline: cartline,\r\n product: product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: foundProductDeliveryOptions,\r\n pickupDeliveryModeCode: props.pickupDeliveryModeCode,\r\n locationChangedHandler: props.locationChangedHandler\r\n })\r\n ),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n addToWishlist: (\r\n isAuthenticated ? (\r\n \r\n ) :\r\n undefined\r\n ),\r\n addToOrderTemplate: (\r\n\r\n isAuthenticated && orderTemplates ? (\r\n //@ts-ignore\r\n \r\n ) :\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nconst _assembleCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Products content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n // console.log('product', product, 'cartline', cartline);\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(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\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 CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return (\r\n _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 { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n DeliveryOption,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n deliveryOption?: string;\r\n}\r\n\r\nexport interface IPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n retailMulitplePickupFeatureState?: boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = async (\r\n orgUnitLocation: OrgUnitLocation,\r\n cartState: ICartState | undefined,\r\n cartline: CartLine,\r\n deliveryMode?: string\r\n ) => {\r\n if (!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState\r\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\r\n\r\n if (isBopisSelected) {\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorModuleId,\r\n product,\r\n alreadySelectedLocation: {\r\n OrgUnitNumber: cartline.FulfillmentStoreId\r\n },\r\n deliveryOptions: props.deliveryOptions,\r\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\r\n }\r\n })\r\n .catch(error => {});\r\n } else {\r\n if (!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState\r\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n }\r\n };\r\n\r\n const _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\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText: string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined\r\n ): JSX.Element => {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = !!cartLine.FulfillmentStoreId;\r\n\r\n const toggleBOPIS = (isBopisSelected: boolean) => {\r\n return () => {\r\n _toggleBOPIS(isBopisSelected);\r\n };\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {cartLine.FulfillmentStoreId ? (\r\n
\r\n {orgUnitName}\r\n \r\n
\r\n ) : null}\r\n \r\n );\r\n };\r\n\r\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\r\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\r\n return delivery?.Description;\r\n };\r\n\r\n /**\r\n * Method to check if we have atleast one common delivery code between product and channel.\r\n * @param productdeliveryOptions - Product DeliveryOption List.\r\n * @param storePickUpOptionList - Channel DeliveryOption List.\r\n * @returns Boolean flag.\r\n */\r\n const matchDeliveryOptions = (\r\n productdeliveryOptions: DeliveryOption[] | undefined,\r\n storePickUpOptionList: string[] | undefined\r\n ): boolean => {\r\n const deliveryOption: string[] = [];\r\n productdeliveryOptions?.map(delivery => {\r\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\r\n if (pickup) {\r\n deliveryOption.push(pickup);\r\n }\r\n return deliveryOption;\r\n });\r\n\r\n return ArrayExtensions.hasElements(deliveryOption);\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\r\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\r\n return undefined;\r\n }\r\n } else if (\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(\r\n props.cartline,\r\n props.shipitText,\r\n props.pickUpInStoreText,\r\n props.changeStoreText,\r\n props.orgUnitLocations\r\n ),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\r\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n AddToOrderTemplateComponent,\r\n AddToWishlistComponent,\r\n CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources,\r\n ICartlineResourceString,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, {\r\n IAny,\r\n ICoreContext,\r\n IGeneric,\r\n IGridSettings,\r\n IImageSettings,\r\n ITelemetry,\r\n TelemetryEvent,\r\n isChannelTypeB2B\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n AsyncResult,\r\n CartLine,\r\n CartLineValidationResultsByLineId,\r\n ChannelDeliveryOptionConfiguration,\r\n CommerceList,\r\n Customer,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport {\r\n ArrayExtensions,\r\n getInvoiceDetailsPageUrlSync,\r\n getProductUrlSync,\r\n IProductInventoryInformation,\r\n ObjectExtensions,\r\n OrderTemplate\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from './citta-cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: CartLineValidationResultsByLineId;\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 retailMulitplePickupFeatureState?: boolean;\r\n\r\n /* GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n\r\n /* ImageSettings for the product image in cartline */\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 addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n hasInvoiceLine?: boolean;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateButtonTooltip: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n shouldIgnoreWarehouse: boolean | undefined;\r\n productAvailability?: AsyncResult;\r\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\r\n hsoConfig?: number;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n cartlineId?: string;\r\n hasError?: boolean;\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 productAvailability: IProductInventoryInformation | undefined\r\n): number => {\r\n if (\r\n !isStockCheckEnabled ||\r\n !productAvailability ||\r\n !productAvailability.ProductAvailableQuantity ||\r\n !productAvailability.IsProductAvailable ||\r\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\r\n ) {\r\n return 0;\r\n }\r\n\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\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 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\nconst _getErrorMessage = (\r\n availableQuantityInStock: number,\r\n currentQuantity: number,\r\n props: ICartLineItemsProps,\r\n shouldSkipStockCheck: boolean,\r\n cartLine: CartLine,\r\n lineId: string | undefined\r\n): string | undefined => {\r\n const finalErrorMessages: string[] = [];\r\n\r\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\r\n if (isLoadingDeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId &&\r\n productAvailability.InventLocationId === cartLine.WarehouseId\r\n );\r\n });\r\n if (foundProductAvailability === undefined) {\r\n return undefined;\r\n }\r\n }\r\n\r\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\r\n if (availableQuantityInStock <= 0) {\r\n finalErrorMessages.push(props.outOfStockText);\r\n } else if (availableQuantityInStock < currentQuantity) {\r\n if (availableQuantityInStock === 1) {\r\n finalErrorMessages.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\r\n }\r\n }\r\n }\r\n\r\n // Server-side validation\r\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\r\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\r\n if (errorsFoundByLineId !== undefined) {\r\n for (const i of errorsFoundByLineId) {\r\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\r\n i.ValidationFailures.forEach(validation => {\r\n if (validation.ErrorContext !== undefined) {\r\n finalErrorMessages.push(validation.ErrorContext);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\r\n return finalErrorMessages.join(' ');\r\n }\r\n\r\n return undefined;\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\n\r\n// eslint-disable-next-line complexity -- Auto-suppressed.\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct | undefined,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n productPickUpOptions?: ProductDeliveryOptions\r\n): ICartlinesViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n moveToWishlistSuccessHandler,\r\n addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateDialogResources,\r\n createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources,\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText,\r\n removeFromWishlistButtonText,\r\n orderTemplates,\r\n customerInformation,\r\n wishlists,\r\n defaultWishlistName,\r\n storeSelectorModuleId,\r\n hsoConfig\r\n } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, 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 // Skip stock check if the cart line is a service item or an invoice line\r\n //const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n let shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n \r\n if (hsoConfig) {\r\n const estimatedDateProperty = availableQuantityInStock\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n let estimatedDate = \"\";\r\n if (estimatedDateValue == undefined) {\r\n estimatedDate = \"\";\r\n } else {\r\n estimatedDate = estimatedDateValue.toString();\r\n }\r\n\r\n const StockThresholdprop = availableQuantityInStock\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n let StockThreshold = 0;\r\n if (StockThresholdpropval != undefined) {\r\n StockThreshold = StockThresholdpropval;\r\n }\r\n\r\n let onhand = 0;\r\n if (availableQuantityInStock != undefined) {\r\n onhand = Number(availableQuantityInStock);\r\n }\r\n\r\n if (StockThreshold == 0) {\r\n shouldSkipStockCheck = true;\r\n } else {\r\n if (onhand >= StockThreshold) {\r\n shouldSkipStockCheck = true;\r\n } else {\r\n if (estimatedDate != \"\") {\r\n shouldSkipStockCheck = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\r\n ? undefined\r\n : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, shouldSkipStockCheck, cartline, cartline.LineId);\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability\r\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\r\n : undefined;\r\n const productDimension = 4;\r\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\r\n const isCustomPriceSelected =\r\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\r\n 'Custom';\r\n\r\n let productUrl: string | undefined;\r\n if (product) {\r\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\r\n\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 } else {\r\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\r\n }\r\n\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n cartlineId: cartline.LineId,\r\n error: errorMessage,\r\n hasError: !shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false,\r\n cartline: (\r\n \r\n ),\r\n pickUpInStore: product\r\n ? PickUpInStore({\r\n storeSelectorModuleId,\r\n cartState: props.cartState,\r\n cartline,\r\n product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: productPickUpOptions,\r\n pickupDeliveryModeCode:\r\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\r\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\r\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\r\n locationChangedHandler: props.locationChangedHandler\r\n })\r\n : undefined,\r\n remove: (\r\n \r\n ),\r\n addToWishlist:\r\n isAuthenticated && product && !isCustomPriceSelected ? (\r\n \r\n ) : (\r\n undefined\r\n ),\r\n addToOrderTemplate:\r\n isAuthenticated && orderTemplates && product ? (\r\n \r\n ) : (\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nexport const assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\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 && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\r\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\r\n );\r\n });\r\n }\r\n\r\n let productPickUpOptions;\r\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\r\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n * @param props\r\n */\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\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 { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport groupBy from 'lodash/groupBy';\r\n\r\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './citta-cart-line-items';\r\n\r\nconst _assembleGroupCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Products content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\r\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\r\n const groupDelivery = getGroupByDelivery(cartlines);\r\n const cartLinesGroup: CartLine[] = [];\r\n\r\n // 1) Group by store and pick up mode\r\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\r\n // @ts-expect-error\r\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\r\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n });\r\n\r\n // 2) Create cartlines group\r\n Object.keys(cartLinesGroup).forEach(key => {\r\n const cartLines = cartLinesGroup[key];\r\n Object.keys(cartLines).forEach(index => {\r\n const cartLine = cartLines[index];\r\n const carLineViewProps = assembleCartlines(cartLine, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n });\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\nconst _assembleGroupInvoiceCartlines = (\r\n cartLines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\r\n if (cartLines && cartLines.length > 0) {\r\n // Create invoice cartLines group\r\n const carLineViewProps = assembleCartlines(cartLines, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n }\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLine Group component.\r\n * @param props\r\n */\r\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines, hasInvoiceLine } = props;\r\n return hasInvoiceLine\r\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\r\n : _assembleGroupCartlines(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 { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IPromotionData entity interface.\r\n */\r\nexport interface IPromotionData {\r\n promotionOptions?: CartPromotionLine[];\r\n}\r\n\r\n/**\r\n * Calls the Retail API and returns a promotion data.\r\n * @param ctx\r\n */\r\nexport async function getPromotionData(ctx: IActionContext): Promise {\r\n const promotionData: IPromotionData = {};\r\n\r\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(promotionOptions => {\r\n if (promotionOptions) {\r\n promotionData.promotionOptions = promotionOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n return {};\r\n });\r\n\r\n return promotionData;\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 {\r\n IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n ILinesAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult,\r\n PromoCodeComponent,\r\n SaveCartToOrderTemplateComponent\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IImageSettings, isChannelTypeB2B, isOboRequest } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport {\r\n ActiveCartProductsInput,\r\n ArrayExtensions,\r\n getActiveCartProductsAction,\r\n ICartLineInventoryValidationResult,\r\n ObjectExtensions,\r\n ProductPickUpOptionsForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Alert,\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n Waiting,\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\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-citta-cartlines';\r\n\r\nimport { ICittaCartData } from './citta-cart.data';\r\nimport { ICittaCartProps, ICittaCartResources } from './citta-cart.props.autogenerated';\r\nimport { CartLineGroupItems } from './components/citta-cart-line-groups';\r\nimport { CartLineItems, ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { cartPromotions, ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-citta-cart';\r\n\r\nimport { validateCartLinesInventory } from './components/hso-validate-cartlines-inventory';\r\n/**\r\n * Cart view props interface.\r\n */\r\nexport interface ICartViewProps extends ICittaCartProps {\r\n className: string;\r\n title?: React.ReactNode;\r\n CartlinesWrapper: INodeProps;\r\n cartlines?: ICartlinesViewProps[];\r\n cartLinesGroup?: ICartlinesViewProps[][];\r\n cart: ICartState | undefined;\r\n orderSummaryHeading: React.ReactNode;\r\n orderSummaryLineitems?: IOrderSummaryLines;\r\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\r\n OrderSummaryWrapper: INodeProps;\r\n OrderSummaryItems: INodeProps;\r\n OrderSummaryErrors?: IOrderSummaryErrors;\r\n checkoutAsGuestButton: React.ReactNode;\r\n checkoutAsSignInUserButton: React.ReactNode;\r\n storeSelector?: React.ReactNode;\r\n expressCheckoutButton?: React.ReactNode[];\r\n ExpressCheckoutSectionWrapper: INodeProps;\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promotionOptions?: ICartLineItemViewProps;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n multiplePickUpEnabled?: boolean;\r\n createTemplateFromCartButton: React.ReactNode;\r\n telemetryContent?: ITelemetryContent;\r\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\n/**\r\n * Order summary errors interface.\r\n */\r\nexport interface IOrderSummaryErrors {\r\n Wrapper: INodeProps;\r\n header: React.ReactNode;\r\n errors: React.ReactNode[];\r\n}\r\n\r\n/**\r\n * Cart component state interface.\r\n */\r\ninterface ICartComponentState {\r\n showPromotionDialog: boolean;\r\n cartlinesErrors: CartLineValidationResultsByLineId;\r\n promotionData: IPromotionData;\r\n isCartValid: boolean;\r\n productPickUpOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\n/**\r\n * Cart component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass Cart extends React.Component> {\r\n public state: ICartComponentState;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n private _isMounted: boolean = false;\r\n\r\n private readonly promotionPopupId: string = 'cart-promotion-popup';\r\n\r\n public constructor(props: ICittaCartProps) {\r\n super(props);\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 this.payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\r\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\r\n\r\n this.state = {\r\n showPromotionDialog: false,\r\n promotionData: {},\r\n isCartValid: true,\r\n productPickUpOptions: undefined,\r\n cartlinesErrors: {}\r\n };\r\n }\r\n\r\n /**\r\n * Component did mount function.\r\n */\r\n public async componentDidMount(): Promise {\r\n this._isMounted = true;\r\n const {\r\n config,\r\n context: { actionContext }\r\n } = this.props;\r\n\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this.validateCart();\r\n }\r\n\r\n if (config.showAvailablePromotions) {\r\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\r\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Component will unmount function.\r\n */\r\n public componentWillUnmount(): void {\r\n this._isMounted = false;\r\n }\r\n\r\n /**\r\n * Should component update function.\r\n * @param nextProps - Next props.\r\n * @param nextState - Next state.\r\n * @returns True if component should update, false otherwise.\r\n */\r\n public shouldComponentUpdate(nextProps: ICittaCartProps, nextState: ICartComponentState): 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 complexity -- Disabling complexity for render method */\r\n public render(): JSX.Element | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n products: { result: products }\r\n },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const backToShoppingUrl = getUrlSync('home', 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 const cartLines = this._getCartLines();\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n \r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n\r\n const validInventoryAcrossCartLines = validateCartLinesInventory(\r\n cart?.cart.CartLines ?? [],\r\n this.props.data.productAvailabilites.result ?? [],\r\n this.props.context.actionContext,\r\n products ?? [],\r\n emailDeliveryModeCode,\r\n HSOConfig\r\n );\r\n\r\n let hasError =\r\n !validInventoryAcrossCartLines?.isValid ||\r\n this._isCheckoutBlockedDueToUnavailableFunds() ||\r\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\r\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\r\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\r\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\r\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n\r\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\r\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\r\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\r\n for (const cartLineGroup of cartLinesGroup) {\r\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\r\n }\r\n }\r\n\r\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\r\n }\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('ms-cart'),\r\n title:

{resources.cartTitle}

,\r\n cart: this.props.data.cart.result,\r\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\r\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\r\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\r\n cartlines: cartLines,\r\n cartLinesGroup,\r\n promoCode: this._getPromoCode(),\r\n promotionOptions: this._getPromotions(),\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry: this.props.telemetry,\r\n id: this.props.id,\r\n multiplePickUpEnabled,\r\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\r\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\r\n cart?.hasInvoiceLine ? (\r\n

{resources.invoiceSummaryTitle}

\r\n ) : (\r\n

{resources.orderSummaryTitle}

\r\n )\r\n ) : null,\r\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\r\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\r\n checkoutAsSignInUserButton: !isCartEmpty ? (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n ) : null,\r\n checkoutAsGuestButton:\r\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n ) : null,\r\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\r\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\r\n backToShoppingButton: (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n ),\r\n createTemplateFromCartButton:\r\n this._displayAddCartToTemplate() && products ? (\r\n \r\n ) : null,\r\n checkoutBlockedDueToUnavailableFunds: this._isCheckoutBlockedDueToUnavailableFunds() ? (\r\n \r\n \r\n \r\n {resources.checkoutBlockedDueToUnavailableFundsTitle}\r\n {resources.checkoutBlockedDueToUnavailableFundsMessage}\r\n \r\n \r\n ) : null,\r\n storeSelector:\r\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n waitingComponent: ,\r\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\r\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\r\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\r\n telemetryContent: this.telemetryContent\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n /* eslint-enable complexity -- Disabling complexity for render method */\r\n\r\n /**\r\n * Promotion click event handler.\r\n * @param event - The mouse event.\r\n */\r\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\r\n this.setState({\r\n showPromotionDialog: !this.state.showPromotionDialog\r\n });\r\n };\r\n\r\n /**\r\n * Promotion close button click.\r\n */\r\n private readonly promotionCloseButtonclick = () => {\r\n this._hidePromotionDialog();\r\n };\r\n\r\n /**\r\n * Hide promotion dialog.\r\n */\r\n private _hidePromotionDialog(): void {\r\n this.setState({\r\n showPromotionDialog: false\r\n });\r\n }\r\n\r\n /**\r\n * Display add to cart template.\r\n * @returns True if should display, false otherwise.\r\n */\r\n private _displayAddCartToTemplate(): boolean {\r\n const cart = this.props.data.cart?.result;\r\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\r\n return false;\r\n }\r\n\r\n if (\r\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\r\n this.props.data.orderTemplates.result &&\r\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\r\n this.props.data.customerInformation.result\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get promotions.\r\n * @returns React node with the promotions.\r\n */\r\n private _getPromotions(): React.ReactNode {\r\n return (\r\n this.props.config.showAvailablePromotions &&\r\n cartPromotions({\r\n id: this.promotionPopupId,\r\n showPromotionPopup: this.state.showPromotionDialog,\r\n onSeeAllClick: this.promotionLinkClick,\r\n onCloseButtonClick: this.promotionCloseButtonclick,\r\n promotions: this.state.promotionData.promotionOptions,\r\n resources: {\r\n promotionStringHeading: this.props.resources.promotionStringHeading,\r\n promotionLinkText: this.props.resources.promotionLinkText,\r\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\r\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Add error message in cart line in case the quantity exceeds the current inventory.\r\n * @param cartLines - The cart lines.\r\n * @param cartLineInventoryValidationResult - The cart line inventory result.\r\n */\r\n private _updateCartLineErrorForInvalidInventory(\r\n cartLines: ICartlinesViewProps[] | null,\r\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\r\n ) {\r\n const { resources } = this.props;\r\n\r\n if (\r\n ArrayExtensions.hasElements(cartLines) &&\r\n !cartLineInventoryValidationResult.isValid &&\r\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\r\n ) {\r\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\r\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\r\n if (cartLine) {\r\n cartLine.error = resources.outOfStockErrorMessage;\r\n cartLine.hasError = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get order summary errors.\r\n * @param cartLines - The cart lines.\r\n * @returns Order summary errors.\r\n */\r\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\r\n const allErrors =\r\n (cartLines &&\r\n cartLines\r\n .map(cartline => {\r\n // Check if the product is service or not by product type\r\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n if (!isServiceItem && cartline.error) {\r\n const fullError =\r\n cartline.data && cartline.data.product?.Name\r\n ? `${cartline.data.product.Name}: ${cartline.error}`\r\n : cartline.error;\r\n\r\n return (\r\n
\r\n {fullError}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n })\r\n .filter((line): line is JSX.Element => !!line)) ||\r\n [];\r\n\r\n return {\r\n Wrapper: {\r\n tag: Alert,\r\n className: 'msc-alert',\r\n isOpen: allErrors.length > 0,\r\n color: 'danger',\r\n assertive: true,\r\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\r\n },\r\n header: (\r\n \r\n ),\r\n errors: allErrors\r\n };\r\n }\r\n\r\n private _isCheckoutBlockedDueToUnavailableFunds(): boolean {\r\n if (isOboRequest(this.props.context.request)) {\r\n const customerInfo = this.props.data.customerInformation && this.props.data.customerInformation?.result;\r\n return !!customerInfo && (!customerInfo.AllowOnAccountPayment || customerInfo.CreditLimit === 0);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets invoice summary line items.\r\n * @returns Invoice summary lines.\r\n */\r\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n return cart?.hasInvoiceLine\r\n ? InvoiceSummary({\r\n orderTotalLabel: resources.totalAmountLabel,\r\n invoiceLabel: resources.invoiceLabel,\r\n cart: cart.cart,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry,\r\n id: this.props.id\r\n })\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Gets order summary line items.\r\n * @returns Order summary lines.\r\n */\r\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n channelDeliveryOptionConfig\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const featureState = this.props?.data?.featureState;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\r\n\r\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\r\n ? OrderSummary({\r\n cart: cart!.cart,\r\n subTotalLabel: resources.itemsWithCountLabel,\r\n shippingLabel: resources.estimatedShippingLabel,\r\n otherChargeLabel: resources.otherCharges,\r\n taxLabel: resources.estimatedTaxLabel,\r\n orderTotalLabel: resources.orderTotal,\r\n totalDiscountsLabel: resources.totalDiscountsLabel,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n toBeCalculatedText: resources.yetToBeCalculatedText,\r\n freeText: resources.priceFree,\r\n channelConfiguration,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\r\n telemetry,\r\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\r\n isShowTaxBreakup: isShowOrHideTaxEnabled\r\n })\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Gets promo code.\r\n * @returns React node with the promo code.\r\n */\r\n private _getPromoCode(): React.ReactNode {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n return (\r\n cart && (\r\n \r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Generate add to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IAddToOrderTemplateDialogResources.\r\n */\r\n private _generateAddToOrderTemplateDialogResources(resources: ICittaCartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n /**\r\n * Generate item added to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IItemAddedToOrderTemplateDialogResources.\r\n */\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICittaCartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n /**\r\n * Generate lines added to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns ILinesAddedToOrderTemplateDialogResources.\r\n */\r\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICittaCartResources): ILinesAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\r\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\r\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\r\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\r\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\r\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\r\n };\r\n }\r\n\r\n /**\r\n * Generate duplicate items when adding to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\r\n */\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources: ICittaCartResources\r\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n /**\r\n * Generate order template name dialog resources.\r\n * @param resources - The resources.\r\n * @returns IOrderTemplateNameDialogResources.\r\n */\r\n private _generateOrderTemplateNameDialogResources(resources: ICittaCartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n\r\n /**\r\n * Gets the cart lines view props.\r\n * @returns ICartlinesViewProps [].\r\n */\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this.getImageSettings(config.imageSettings);\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n\r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n\r\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\r\n ? CartLineItems({\r\n cartlines: cart!.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n catalogs: this.props.data.catalogs?.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\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 retailMulitplePickupFeatureState: multiplePickUpEnabled,\r\n resources: {\r\n sizeString: \"Size:\" || resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n priceEditorResources: {\r\n ...resources\r\n }\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\r\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n productAvailability: this.props.data.productAvailabilites,\r\n hsoConfig: HSOConfig\r\n })\r\n : null;\r\n }\r\n\r\n /**\r\n * Gets the checkout URL.\r\n * @param isAuthenticated - Is authenticated flag.\r\n * @param guestCheckoutUrl - Guest checkout URL.\r\n * @param signInUrl -The sign in URL.\r\n * @returns The checkout URL.\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 (MsDyn365.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 * Gets the image settings.\r\n * @param imageSettings - Image settings.\r\n * @returns IImageSettings.\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 /**\r\n * Remove item from citta-cart handler.\r\n * @param cartlineToRemove - The cart line to remove.\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\r\n .removeCartLines(input)\r\n .then(() => {\r\n this.validateCart().catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .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 /**\r\n * Move to wish list handler.\r\n * @param result - The wish list action success result.\r\n * @param cartline - The cart line.\r\n */\r\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this.removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n /**\r\n * Updates the cart line quantity.\r\n * @param cartlineToUpdate - The cart line.\r\n * @param quantity - The quantity.\r\n * @param lineIndex - The line index.\r\n * @returns True if the cart line was updated, false otherwise.\r\n */\r\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\r\n cartLineQuantityUpdatedAsync(\r\n this.isQuantityLimitsFeatureEnabled,\r\n this.props.data.cart.result,\r\n this.props.telemetry,\r\n this.props.data.products.result,\r\n cartlineToUpdate,\r\n quantity\r\n )\r\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\r\n if (cartActionResult?.status === 'SUCCESS') {\r\n this.validateCart().catch(error => {\r\n this.props.telemetry.warning((error as Error).message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n\r\n return true;\r\n }\r\n\r\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\r\n // Show update line error message.\r\n const lineUpdateFailure: LineValidationResult = {\r\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\r\n ValidationFailures: [\r\n {\r\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\r\n ? cartActionResult.validationResults[0].ErrorContext\r\n : '',\r\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\r\n }\r\n ]\r\n };\r\n\r\n this.setState({\r\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\r\n });\r\n }\r\n\r\n return false;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * Fulfillment store id is updated.\r\n */\r\n private readonly fulfillmentStoreIdUpdated = () => {\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n // Refresh products (in props.data) based on latest cart.\r\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\r\n .then(async () => this.validateCart())\r\n .catch((error: Error) => {\r\n this.props.telemetry.warning(error.message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Validates cart.\r\n * @returns Void promise.\r\n */\r\n private async validateCart(): Promise {\r\n const {\r\n data: { cart },\r\n telemetry,\r\n context\r\n } = this.props;\r\n\r\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(\r\n // this.isQuantityLimitsFeatureEnabled, //version upgrade commented the line as this is not part of validateCartAsync method\r\n cart,\r\n telemetry,\r\n context,\r\n true\r\n );\r\n\r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n if (HSOConfig) {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n if (validationResults) {\r\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\r\n this.setState({\r\n cartlinesErrors: validationResults,\r\n isCartValid: isValid\r\n });\r\n } else {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n return AsyncResult.resolve();\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\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 return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\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 return false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the cart lines group.\r\n * @returns ICartlinesViewProps [][].\r\n */\r\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this.getImageSettings(config.imageSettings);\r\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n return this.props.data.products &&\r\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\r\n cart &&\r\n cart.cart.CartLines &&\r\n cart.cart.CartLines.length > 0 &&\r\n this.props.data.channelDeliveryOptionConfig?.result\r\n ? CartLineGroupItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n catalogs: this.props.data.catalogs?.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n hasInvoiceLine: cart?.hasInvoiceLine || 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 retailMulitplePickupFeatureState: multiplePickUpEnabled,\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 amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n priceEditorResources: {\r\n ...resources\r\n }\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\r\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\r\n productAvailability: this.props.data.productAvailabilites,\r\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result\r\n })\r\n : null;\r\n }\r\n}\r\n\r\nexport default Cart;\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\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport { ArrayExtensions, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\n/**\r\n * Cart line inventory validation result interface.\r\n */\r\nexport interface ICartLineInventoryValidationResult {\r\n /**\r\n * Define whether the cart lines inventory is valid across multiple cart lines.\r\n */\r\n readonly isValid: boolean;\r\n\r\n /**\r\n * Defines the list of product id with invalid inventory.\r\n */\r\n readonly productIdWithErrors: number[];\r\n}\r\n\r\n/**\r\n * Validates inventory across cart lines.\r\n * @param cartLines - The cart lines.\r\n * @param productAvailabilities - The product availability collection.\r\n * @param actionContext - The action context.\r\n * @param products - The products.\r\n * @param emailDeliveryModeCode - The emailDeliveryModeCode.\r\n * @returns True if all product quantity are available, false otherwise.\r\n */\r\n// eslint-disable-next-line complexity -- existing code.\r\nexport function validateCartLinesInventory(\r\n cartLines: CartLine[],\r\n productAvailabilities: IProductInventoryInformation[],\r\n actionContext: IActionContext,\r\n products?: SimpleProduct[],\r\n emailDeliveryModeCode?: string | undefined,\r\n hsoConfig?: number\r\n): ICartLineInventoryValidationResult {\r\n const cartLineMap = new Map();\r\n const defaultCartLineQuantity = 1;\r\n if (!actionContext.requestContext.app.config.enableStockCheck) {\r\n return {\r\n isValid: true,\r\n productIdWithErrors: []\r\n };\r\n }\r\n const productIdWithErrors = [];\r\n let isValid = true;\r\n\r\n if (ArrayExtensions.hasElements(cartLines) && ArrayExtensions.hasElements(productAvailabilities)) {\r\n // Consolidate products in different cart lines into single entry with the total cart quantity\r\n for (const cartLine of cartLines) {\r\n // Skip validation if is an invoice inline.\r\n if (cartLine.ProductId && !cartLine.IsInvoiceLine && !cartLine.IsGiftCardLine) {\r\n if (!cartLineMap.has(cartLine.ProductId)) {\r\n cartLineMap.set(cartLine.ProductId, cartLine.Quantity ?? defaultCartLineQuantity);\r\n } else {\r\n const cartLineTotal = cartLineMap.get(cartLine.ProductId) ?? 0;\r\n cartLineMap.delete(cartLine.ProductId);\r\n cartLineMap.set(cartLine.ProductId, cartLineTotal + (cartLine.Quantity ?? defaultCartLineQuantity));\r\n }\r\n }\r\n }\r\n\r\n // Hashing product availability object by product ID.\r\n const productAvailabilityMap = new Map();\r\n for (const productAvailability of productAvailabilities) {\r\n if (\r\n productAvailability.ProductAvailableQuantity.ProductId &&\r\n !productAvailabilityMap.has(productAvailability.ProductAvailableQuantity.ProductId)\r\n ) {\r\n productAvailabilityMap.set(productAvailability.ProductAvailableQuantity.ProductId, productAvailability);\r\n }\r\n }\r\n\r\n // Compare total quantity with the available quantity from the inventory API, also validate that the product is available.\r\n for (const productId of Array.from(cartLineMap.keys())) {\r\n const cartLineQty = cartLineMap.get(productId) ?? defaultCartLineQuantity;\r\n const productAvailability = productAvailabilityMap.get(productId);\r\n const availableQuantity = productAvailability?.ProductAvailableQuantity.AvailableQuantity ?? undefined;\r\n\r\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n const cartLine = cartLines.find(line => line.ProductId === productId);\r\n const cartLineProduct = products?.find(product => product.RecordId === productId);\r\n let isStockedItem = true;\r\n if (cartLineProduct) {\r\n isStockedItem = !!cartLineProduct.Behavior?.IsStockedProduct;\r\n }\r\n const isEmailDelivery =\r\n cartLine?.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\r\n let shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\r\n\r\n if (hsoConfig) {\r\n const estimatedDateProperty = availableQuantity\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n let estimatedDate = \"\";\r\n if (estimatedDateValue == undefined) {\r\n estimatedDate = \"\";\r\n } else {\r\n estimatedDate = estimatedDateValue.toString();\r\n }\r\n\r\n const StockThresholdprop = availableQuantity\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n let StockThreshold = 0;\r\n if (StockThresholdpropval != undefined) {\r\n StockThreshold = StockThresholdpropval;\r\n }\r\n\r\n let onhand = 0;\r\n if (availableQuantity != undefined) {\r\n onhand = Number(availableQuantity);\r\n }\r\n\r\n if (StockThreshold == 0) {\r\n shouldSkipInventoryCheck = true;\r\n } else {\r\n if (onhand >= StockThreshold) {\r\n shouldSkipInventoryCheck = true;\r\n } else {\r\n if (estimatedDate != \"\") {\r\n shouldSkipInventoryCheck = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n if (shouldSkipInventoryCheck) {\r\n continue;\r\n }\r\n if (!productAvailability?.IsProductAvailable || (availableQuantity && cartLineQty > availableQuantity)) {\r\n productIdWithErrors.push(productId);\r\n isValid = false;\r\n }\r\n }\r\n }\r\n return {\r\n isValid,\r\n productIdWithErrors\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 { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ICartLineItemPromotion {\r\n id: string;\r\n showPromotionPopup: boolean;\r\n promotions: CartPromotionLine[] | undefined;\r\n resources: ICartLineItemPromotionResourceString;\r\n onSeeAllClick(event: React.MouseEvent): void;\r\n onCloseButtonClick(): void;\r\n}\r\n\r\nexport interface ICartLineItemViewProps {\r\n promotionMessageWrapper: INodeProps;\r\n promotionMessage: React.ReactNode;\r\n promotionSeeAllLink: React.ReactElement;\r\n promotionDialog: React.ReactNode;\r\n}\r\n\r\nexport interface ICartLineItemPromotionResourceString {\r\n promotionLinkText: string;\r\n promotionStringHeading: string;\r\n promotionPopupHeading: string;\r\n promotionCloseButtonAriaLabel: string;\r\n}\r\n\r\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\r\n const {\r\n id,\r\n showPromotionPopup,\r\n promotions,\r\n resources: { promotionLinkText, promotionPopupHeading },\r\n onCloseButtonClick,\r\n onSeeAllClick\r\n } = props;\r\n\r\n if (!ArrayExtensions.hasElements(promotions)) {\r\n return;\r\n }\r\n\r\n const titleId = `${id}_title`;\r\n const className = 'msc-cart__promotion';\r\n return {\r\n promotionMessageWrapper: {\r\n className: 'msc-cart__promotion'\r\n },\r\n promotionMessage: (\r\n <>\r\n \r\n {props.resources.promotionStringHeading}\r\n \r\n ),\r\n promotionSeeAllLink: (\r\n \r\n {` `}\r\n {promotionLinkText} {` `}\r\n \r\n ),\r\n promotionDialog: (\r\n \r\n \r\n
\r\n {promotionPopupHeading}\r\n
\r\n
\r\n \r\n
    \r\n {promotions.map(_promotion => {\r\n return (\r\n
  • \r\n {_promotion.Promotion?.OfferName} {` `}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n \r\n
\r\n )\r\n };\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartViewProps, IOrderSummaryErrors } from './citta-cart';\r\nimport { ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return cartLines.map(cartLine => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n {cartLine.pickUpInStore.defaultComponent}\r\n ) : null}\r\n {cartLine.addToOrderTemplate ? (\r\n \r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n {cartLine.addToOrderTemplate}\r\n \r\n ) : (\r\n <>\r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n \r\n )}\r\n
\r\n );\r\n });\r\n }\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

\r\n {backToShoppingButton}\r\n
\r\n ) : (\r\n <>{waitingComponent}\r\n );\r\n};\r\n\r\n/**\r\n * Method will render error block.\r\n * @param errorData -The order summary errors interface.\r\n * @returns Jsx element.\r\n */\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render invoice summary lines.\r\n * @param invoiceSummaryLines -The invoicesummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderInvoiceSummarylines = (\r\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!invoiceSummaryLines) {\r\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {invoiceSummaryLines.invoices}\r\n {invoiceSummaryLines.giftCard}\r\n {invoiceSummaryLines.loyalty}\r\n {invoiceSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render order summary lines.\r\n * @param orderSummaryLines -The ordersummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {props.promoCode}\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.otherCharge}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cart promotions.\r\n * @param promotions -The cartline item view props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\r\n return (\r\n <>\r\n \r\n {promotions.promotionMessage}\r\n {promotions.promotionSeeAllLink}\r\n {promotions.promotionDialog}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines group title.\r\n * @param cartLine -The cartline view props.\r\n * @param titleSeparate -The title separate.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n return (\r\n <>\r\n \r\n {isBopisSelected ? (\r\n

\r\n {cartLine.pickUpInStore?.deliveryOption}\r\n {titleSeparate}\r\n {cartLine.pickUpInStore?.orgUnitName}\r\n

\r\n ) : null}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines groups header title.\r\n * @param pickUpText -The pickup text for group.\r\n * @param shippingText -The shipping text for group.\r\n * @param emailShippingText -The email shipping text for group.\r\n * @param titleSeparate -The title separator.\r\n * @param cartLine -The cartline view props.\r\n * @param emailDeliveryModeCode -The email delivery code from channel.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupHeader = (\r\n pickUpText: string,\r\n shippingText: string,\r\n emailShippingText: string,\r\n titleSeparate: string,\r\n cartLine: ICartlinesViewProps,\r\n emailDeliveryModeCode?: string\r\n) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n let groupTitle: string;\r\n\r\n groupTitle = isBopisSelected ? pickUpText : shippingText;\r\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\r\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n

\r\n

{groupTitle}

\r\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines in groups.\r\n * @param props -The cartline.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\r\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\r\n return (\r\n
\r\n {props.cartLinesGroup.map(cartlines => {\r\n return (\r\n
\r\n {renderCartLinesGroupHeader(\r\n props.resources.pickUpText,\r\n props.resources.shippingText,\r\n props.resources.emailshippingText,\r\n props.resources.titleSeparate,\r\n cartlines[0],\r\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\r\n )}\r\n {_renderCartlines(\r\n cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n return props.cartDataResult ? (\r\n
\r\n
\r\n

{props.resources.emptyCartText}

\r\n {props.backToShoppingButton}\r\n
\r\n
\r\n ) : (\r\n <>{props.waitingComponent}\r\n );\r\n};\r\n\r\nconst CartView: React.FC = (props: ICartViewProps) => (\r\n
\r\n {props.checkoutBlockedDueToUnavailableFunds}\r\n {props.title}\r\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\r\n {props.multiplePickUpEnabled ? (\r\n renderCartLinesGroup(props)\r\n ) : (\r\n \r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n \r\n )}\r\n {props.orderSummaryHeading && (\r\n \r\n {props.orderSummaryHeading}\r\n {props.cart?.hasInvoiceLine\r\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\r\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\r\n {_renderErrorBlock(props.OrderSummaryErrors)}\r\n {props.checkoutAsSignInUserButton}\r\n {props.checkoutAsGuestButton}\r\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\r\n {props.expressCheckoutButton}\r\n ) : null}\r\n {props.backToShoppingButton}\r\n {props.createTemplateFromCartButton}\r\n \r\n )}\r\n {props.storeSelector}\r\n
\r\n);\r\n\r\nexport default CartView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport interface ILogoProps {\r\n image: Msdyn365.IImageData;\r\n gridSettings?: Msdyn365.IGridSettings;\r\n link?: Msdyn365.ILinkData;\r\n className?: string;\r\n telemetryContent?: ITelemetryContent;\r\n requestContext: Msdyn365.IRequestContext;\r\n}\r\n\r\n// export interface ILinkData {\r\n// // linkUrl: Msdyn365.ILinkData;\r\n// destinationUrl?: string;\r\n// // openInNewTab?: boolean;\r\n// // linkText?: string;\r\n// }\r\n\r\n/**\r\n *\r\n * Logo component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class Logo extends React.PureComponent {\r\n\r\n private attributes?: Msdyn365.IDictionary;\r\n\r\n constructor(props: ILogoProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n public render():JSX.Element {\r\n return(\r\n
\r\n {this._renderLogo(this.props)}\r\n
\r\n );\r\n }\r\n\r\n private _renderLogo(config: ILogoProps):JSX.Element {\r\n if(config.link && config.link.destinationUrl) {\r\n return(\r\n \r\n {this._renderImage(config)}\r\n \r\n );\r\n }\r\n return(\r\n this._renderImage(config)\r\n );\r\n }\r\n\r\n private _renderImage(config: ILogoProps): JSX.Element {\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=132&h=28&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=160&h=48&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default Logo;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ICittaHeaderResources } from '../citta-header.props.autogenerated';\r\n\r\nexport interface INavIconProps {\r\n resources: ICittaHeaderResources;\r\n isExpanded: boolean;\r\n targetId: string;\r\n telemetryContent?: ITelemetryContent;\r\n toggleNavBar(): void;\r\n}\r\n\r\n/**\r\n *\r\n * NavIcon component\r\n * @extends {React.PureComponent}\r\n */\r\n\r\n@observer\r\nexport class NavIcon extends React.Component {\r\n\r\n private attributes?: Msdyn365.IDictionary;\r\n\r\n constructor(props: INavIconProps) {\r\n super(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\r\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n }\r\n\r\n public render():JSX.Element {\r\n return (\r\n \r\n );\r\n }\r\n}","// import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ICittaHeaderData } from '../citta-header.data';\r\nimport { ICittaHeaderProps } from '../citta-header.props.autogenerated';\r\n\r\n/**\r\n * The header preferred store component\r\n */\r\n// @observer\r\nexport class HeaderPreferredStore extends React.PureComponent> {\r\n\r\n // public handleClick = () => { return this._findPreferreStoreOnClick(this.props); };\r\n\r\n public render(): JSX.Element | undefined {\r\n // const {\r\n // data: {\r\n // storeSelectorStateManager: { result: storeSelectorStateManager }\r\n // },\r\n // slots,\r\n // resources\r\n // } = this.props;\r\n // if (slots && slots.storeSelector && slots.storeSelector.length) {\r\n // const storeName = storeSelectorStateManager!.preferredStore && storeSelectorStateManager!.preferredStore.StoreName ?\r\n // storeSelectorStateManager!.preferredStore.StoreName :\r\n // resources.headerPreferredStoreText;\r\n\r\n // return (\r\n //
\r\n // \r\n // {slots.storeSelector}\r\n //
\r\n // );\r\n // }\r\n\r\n return undefined;\r\n }\r\n\r\n // private async _findPreferreStoreOnClick(props: ICittaHeaderProps): Promise {\r\n // const { data: { storeSelectorStateManager: { result: storeSelectorStateManager } }, modules } = props;\r\n // if (!storeSelectorStateManager) {\r\n // return;\r\n // }\r\n // let storeSelectorId: string = '';\r\n // if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n // storeSelectorId = modules.storeSelector[0].id;\r\n // }\r\n // storeSelectorStateManager.openDialog({\r\n // id: storeSelectorId,\r\n // showMapViewLink: false,\r\n // onLocationSelected: orgUnitLocation => {\r\n // return Promise.resolve();\r\n // }\r\n // }).catch((error: Error) => {\r\n // if (props.telemetry) {\r\n // props.telemetry.error(error.message);\r\n // props.telemetry.debug('Unable to set preferred store');\r\n // }\r\n // return;\r\n // });\r\n // }\r\n}\r\n\r\nexport default HeaderPreferredStore;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes, Modal,\r\n ModalBody, ModalHeader, onTelemetryClick, TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { WishListIconComponent } from '@msdyn365-commerce/components';\r\nimport * as MsDyn365 from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { computed, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ICittaHeaderData } from './citta-header.data';\r\nimport { ICittaHeaderProps, ICittaHeaderResources, IMyAccountLinksData } from './citta-header.props.autogenerated';\r\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\r\nimport { CartIconComponent } from '../../themes/citta/views/components/cart-icon.component';\r\n\r\n\r\nexport interface IHeaderState {\r\n mobileMenuCollapsed: boolean;\r\n signinPopoverOpen: boolean;\r\n}\r\n\r\nexport interface IHeaderViewProps extends ICittaHeaderProps, IHeaderState {\r\n logo: React.ReactNode;\r\n wishListIconDesktop: React.ReactNode;\r\n wishListIconMobile: React.ReactNode;\r\n cartIcon: React.ReactNode;\r\n navIcon: React.ReactNode;\r\n className: string;\r\n menuBar: React.ReactNode[];\r\n search: React.ReactNode[];\r\n siteOptions: React.ReactNode[];\r\n categoryMenuBar: React.ReactNode[];\r\n customNavBar: React.ReactNode[];\r\n countryPicker: React.ReactNode[];\r\n HeaderTag: IModuleProps;\r\n HeaderContainer: INodeProps;\r\n MobileMenuContainer: INodeProps;\r\n MobileMenuHeader: React.ReactNode;\r\n MobileMenuBodyContainer: INodeProps;\r\n MobileMenuLinksContainer: INodeProps;\r\n HeaderTopBarContainer: INodeProps;\r\n HeaderTopBarRightContainer: INodeProps;\r\n Divider: INodeProps;\r\n\r\n AccountInfoDropdownParentContainer?: INodeProps;\r\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\r\n accountInfoDropdownButton?: React.ReactNode;\r\n\r\n signOutLink?: React.ReactNode;\r\n signInLink?: React.ReactNode;\r\n accountLinks?: React.ReactNode[];\r\n preferredStore?: React.ReactNode;\r\n}\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass Header extends React.PureComponent, IHeaderState> {\r\n private popOverRef: React.RefObject;\r\n private telemetryContent: ITelemetryContent;\r\n private cart: ICartState | undefined;\r\n @computed public get displayName(): Readonly {\r\n const customer = this.props.data.accountInformation?.result;\r\n const isB2B = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n if(isB2B){\r\n return customer ? customer.Name || customer.FirstName : undefined;\r\n }\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n @computed public get accountEmailAddress(): Readonly {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.Email || customer.Email : undefined;\r\n }\r\n\r\n constructor(props: ICittaHeaderProps) {\r\n super(props);\r\n this.popOverRef = React.createRef();\r\n this._toggleNavbar = this._toggleNavbar.bind(this);\r\n this._togglePopover = this._togglePopover.bind(this);\r\n this._keydown = this._keydown.bind(this);\r\n this.state = {\r\n mobileMenuCollapsed: true,\r\n signinPopoverOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.addEventListener('keydown', this._keydown);\r\n }\r\n reaction(\r\n () => this.props.data.cart.result,\r\n () => {\r\n this.cart = this.props.data.cart.result;\r\n }\r\n );\r\n\r\n this._stickyHeaderSetup();\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.msdyn365Commerce.isBrowser) {\r\n window.removeEventListener('keydown', this._keydown, false);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: { accountInformation,\r\n storeSelectorStateManager: {result: storeSelectorStateManager}\r\n },\r\n context: {\r\n request: {\r\n user\r\n }\r\n },\r\n context,\r\n resources: {\r\n cartLabel\r\n }\r\n } = this.props; \r\n\r\n const headerClassName = classnames('ms-header', this.props.config.className);\r\n const navbarKey = 'header-nav-mobile';\r\n const customer = accountInformation && accountInformation.result;\r\n const cartIconSlot = this._getSlot('cartIcon');\r\n const menuBarSlot = this._getSlot('menuBar');\r\n const searchSlot = this._getSlot('search');\r\n const siteOptionsSlot = this._getSlot('siteOptions');\r\n const preferredStoreSlot = this._getSlot('storeSelector');\r\n\r\n const categoryMenuBarSlot = this._getSlot('categoryMenuBar');\r\n const customNavBarSlot = this._getSlot('customNavMenuBar');\r\n const countryPickerSlot = this._getSlot('countryPicker');\r\n\r\n const logoSlot = this._getSlot('logo');\r\n // @ts-ignore\r\n const logoImage = logoSlot && logoSlot.length && logoSlot[0].props.config.image || {};\r\n // @ts-ignore\r\n const logoLink = logoSlot && logoSlot.length && logoSlot[0]?.props.config.imageLink || '';\r\n\r\n const viewProps: IHeaderViewProps = {\r\n ...(this.props as ICittaHeaderProps),\r\n ...(this.state),\r\n logo: ,\r\n wishListIconDesktop: (\r\n \r\n ),\r\n wishListIconMobile: (\r\n \r\n ),\r\n cartIcon: (cartIconSlot && cartIconSlot.length > 0)\r\n ? cartIconSlot[0]\r\n : , \r\n navIcon: ,\r\n menuBar: menuBarSlot && menuBarSlot.length && menuBarSlot || [],\r\n search: searchSlot && searchSlot.length && searchSlot || [],\r\n siteOptions: siteOptionsSlot && siteOptionsSlot.length && siteOptionsSlot || [],\r\n categoryMenuBar: categoryMenuBarSlot && categoryMenuBarSlot.length && categoryMenuBarSlot || [],\r\n customNavBar: customNavBarSlot && customNavBarSlot.length && customNavBarSlot || [],\r\n className: headerClassName,\r\n countryPicker: countryPickerSlot && countryPickerSlot.length && countryPickerSlot || [],\r\n HeaderTag: {\r\n moduleProps: this.props,\r\n className: classnames(headerClassName),\r\n tag: 'header'\r\n },\r\n HeaderContainer: {\r\n className: classnames('ms-header__container')\r\n },\r\n HeaderTopBarContainer: {\r\n className: classnames('ms-header__topbar')\r\n },\r\n HeaderTopBarRightContainer: {\r\n className: classnames('ms-header__topbar-right')\r\n },\r\n Divider: {\r\n className: classnames('ms-header__divider')\r\n },\r\n MobileMenuContainer: {\r\n tag: Modal,\r\n id: navbarKey,\r\n className: 'ms-header__mobile-hamburger',\r\n isOpen: !this.state.mobileMenuCollapsed,\r\n wrapClassName: `ms-header__citta-modal citta-header-mobile ${!this.state.mobileMenuCollapsed ? 'modal-open' : ''}`,\r\n toggle: this._toggleNavbar\r\n },\r\n MobileMenuHeader: (\r\n \r\n ),\r\n MobileMenuBodyContainer: {\r\n tag: ModalBody,\r\n className: 'ms-header__mobile-hamburger-menu-body',\r\n },\r\n MobileMenuLinksContainer: {\r\n className: 'ms-header__mobile-hamburger-menu-links',\r\n },\r\n AccountInfoDropdownParentContainer: {\r\n className: `ms-header__account-info ${this.state.signinPopoverOpen ? 'account-open' : ''}`\r\n },\r\n AccountInfoDropdownPopoverConentContainer: customer && this.displayName && {\r\n // tag: Popover,\r\n id: 'myprofilePopover',\r\n className: 'ms-header__account-info-content',\r\n placement: 'bottom',\r\n isOpen: this.state.signinPopoverOpen,\r\n target: this.popOverRef,\r\n toggle: this._togglePopover,\r\n } || undefined,\r\n signInLink: this._getSigninButton(customer, user, this.props.resources),\r\n signOutLink: this._getSignOutButton(customer, user, this.props.resources),\r\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(customer),\r\n accountLinks: this._getAccountLinks(customer),\r\n preferredStore: preferredStoreSlot\r\n && preferredStoreSlot.length\r\n && storeSelectorStateManager\r\n && ()\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /* Handle link text change*/\r\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent) => {\r\n if (this.props.config.myAccountLinks && this.props.config.myAccountLinks[linkIndex]) {\r\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\r\n }\r\n }\r\n\r\n private _stickyHeaderSetup(): void {\r\n // Set header update methods to trigger on scroll\r\n window.onscroll = () => {\r\n this._updateHeader();\r\n };\r\n this._updateHeader();\r\n }\r\n\r\n private _getSlot(slotName: string): React.ReactNode[] | null {\r\n const { slots } = this.props;\r\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\r\n }\r\n\r\n private _getSigninButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: ICittaHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return !customer && (\r\n \r\n {resources.signInLinkText}\r\n \r\n );\r\n }\r\n\r\n private _getSignOutButton(customer: Customer | undefined, user: MsDyn365.IRequestContextUser | undefined, resources: ICittaHeaderResources): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n \r\n {resources.signOutLinkText}\r\n \r\n );\r\n }\r\n\r\n private _getAccountInfoDropdownButton(customer: Customer | undefined): React.ReactNode | undefined {\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n return customer && this.displayName && (\r\n \r\n {this.displayName}\r\n {this.accountEmailAddress}\r\n \r\n );\r\n }\r\n\r\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\r\n const { myAccountLinks } = this.props.config;\r\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n if(!customer || ! this.displayName || !myAccountLinks || !myAccountLinks.length) {\r\n return undefined;\r\n }\r\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\r\n payLoad.contentAction.etext = cta.linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n const editableLink: MsDyn365.ILinksData = {\r\n ariaLabel: cta.ariaLabel,\r\n className: 'ms-signin-info__account-link-button',\r\n linkText: cta.linkText,\r\n linkUrl: cta.linkUrl.destinationUrl,\r\n openInNewTab: cta.openInNewTab,\r\n role: 'button',\r\n additionalProperties: attributes\r\n };\r\n\r\n return (\r\n \r\n );\r\n });\r\n }\r\n\r\n private _toggleNavbar(): void {\r\n this.setState({\r\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\r\n });\r\n this.state.mobileMenuCollapsed && this._setHeader(this.state.mobileMenuCollapsed);\r\n }\r\n\r\n private _togglePopover(): void {\r\n this.setState({\r\n signinPopoverOpen: !this.state.signinPopoverOpen\r\n });\r\n }\r\n\r\n private _keydown(e: KeyboardEvent): void {\r\n if (e.keyCode === KeyCodes.Escape) {\r\n this.setState({ mobileMenuCollapsed: true });\r\n this._setHeader(true);\r\n }\r\n }\r\n\r\n private _setHeader(lockHeader?: boolean): void {\r\n // Get heights of cookie and promotion banners\r\n const headerElem = document.querySelector('.ms-header');\r\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\r\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : 0;\r\n // triggers opacity change of header\r\n if (headerElem) {\r\n if (lockHeader || document.documentElement.scrollTop > bannerHeights) {\r\n headerElem.classList.add('lock-opaque');\r\n } else if (!window.document.body.classList.contains('search-open')) { \r\n headerElem.classList.remove('lock-opaque');\r\n }\r\n }\r\n }\r\n\r\n private _updateHeader(isInMobileMenu?: boolean): void {\r\n // triggers opacity change of header\r\n // Get heights of cookie and promotion banners\r\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\r\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : 0;\r\n if (this.state.mobileMenuCollapsed) {\r\n this._setHeader();\r\n }\r\n\r\n // Update sticky header position and opacity\r\n const stickyHeader: HTMLElement | null = document.querySelector('.ms-header__desktop-view');\r\n const headerLogo: HTMLElement | null = document.querySelector('.ms-header__topbar-center');\r\n const headerLeftActionItem: HTMLElement | null = document.querySelector('.ms-header__topbar-left');\r\n const headerRightActionItem: HTMLElement | null = document.querySelector('.ms-header__topbar-right');\r\n\r\n if (stickyHeader && headerLogo && headerLeftActionItem && headerRightActionItem) {\r\n // Fix center sticky header\r\n const navStickyPos = headerLogo.offsetHeight + bannerHeights;\r\n if (document.documentElement.scrollTop > navStickyPos) {\r\n stickyHeader.classList.add('fixed');\r\n } else {\r\n stickyHeader.classList.remove('fixed');\r\n }\r\n\r\n // Fix edge sticky headers\r\n if (document.documentElement.scrollTop > bannerHeights) {\r\n headerLeftActionItem.classList.add('fixed');\r\n headerRightActionItem.classList.add('fixed');\r\n } else {\r\n headerLeftActionItem.classList.remove('fixed');\r\n headerRightActionItem.classList.remove('fixed');\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Header;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IHeaderViewProps } from './citta-header';\r\n\r\nconst headerView: React.FC = props => {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer,\r\n HeaderTopBarRightContainer,\r\n MobileMenuContainer,\r\n MobileMenuBodyContainer,\r\n MobileMenuLinksContainer\r\n } = props;\r\n return (\r\n \r\n \r\n {_renderReactFragment(props.menuBar)}\r\n \r\n {props.navIcon}\r\n {props.logo}\r\n \r\n {_renderReactFragment(props.search)}\r\n {props.preferredStore}\r\n {_renderReactFragment(props.siteOptions)}\r\n {_renderDesktopAccountBlock(props)}\r\n {props.cartIcon}\r\n \r\n \r\n \r\n \r\n {_renderReactFragment(props.search)}\r\n { props.MobileMenuHeader }\r\n {_renderReactFragment(props.menuBar)}\r\n \r\n {/* {_renderReactFragment(props.search)} */}\r\n { props.accountLinks ? props.accountLinks.map(link => link) : false }\r\n {_renderMobileAccountBlock(props)}\r\n { props.siteOptions }\r\n {/* { props.signInLink } */}\r\n {/* { props.signOutLink } */}\r\n \r\n \r\n \r\n {_renderReactFragment(props.categoryMenuBar)}\r\n {_renderReactFragment(props.customNavBar)}\r\n {_renderReactFragment(props.countryPicker)}\r\n \r\n \r\n );\r\n};\r\n\r\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n \r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\n\r\nfunction _renderMobileAccountBlock(props: IHeaderViewProps): JSX.Element | null {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = props;\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinks ? accountLinks.map(link => link) : false }\r\n {signOutLink}\r\n \r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n}\r\n\r\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\r\n return (\r\n \r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return {slot};\r\n })\r\n : null}\r\n \r\n );\r\n}\r\n\r\nexport default headerView;","/* eslint-disable no-duplicate-imports */\r\nimport { getMediaLocationsForSelectedVariant, MediaLocationsForSelectedVariantInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext, IImageData, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { MediaLocation } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport async function getValidProductImages(productId: number, channelId: number, actionContext: IActionContext, imageSettings: IImageSettings): Promise {\r\n const actionInput = new MediaLocationsForSelectedVariantInput(\r\n productId,\r\n channelId,\r\n );\r\n\r\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\r\n .then(mediaLocations => {\r\n if (mediaLocations) {\r\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n });\r\n }\r\n\r\n return [];\r\n }).catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\r\n return [];\r\n });\r\n}\r\n\r\nexport async function validateProductImages(mediaLocations: MediaLocation[], actionContext: IActionContext, imageSettings: IImageSettings): Promise {\r\n return Promise.all(mediaLocations.map((mediaLocation) => validateMediaLocaionAsync(mediaLocation, imageSettings)))\r\n .then(pairs => {\r\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\r\n }).catch(error => {\r\n actionContext.telemetry.exception(error);\r\n actionContext.telemetry.debug('Unable to validate prodcut images');\r\n return [];\r\n });\r\n}\r\n\r\nasync function validateMediaLocaionAsync(mediaLocation: MediaLocation, imageSettings: IImageSettings): Promise<[IImageData, boolean]> {\r\n const imageData = {\r\n src: mediaLocation.Uri || '',\r\n altText: mediaLocation.AltText || ''\r\n };\r\n\r\n const imageSettingsVal = ((imageSettings.viewports?.lg!.q!).replace(/['\"]+/g, ''));\r\n\r\n if (imageData.src === '') {\r\n return [imageData, false];\r\n }\r\n\r\n const imageConcatVal = `${imageData.src}` + `&` + `${imageSettingsVal}`;\r\n\r\n return new Promise<[IImageData, boolean]>((resolve) => {\r\n try {\r\n const http = new XMLHttpRequest();\r\n http.open('HEAD', imageConcatVal, true);\r\n\r\n http.onload = () => {\r\n resolve([imageData, http.status === 200 || http.status === 201]);\r\n };\r\n\r\n http.onerror = () => {\r\n resolve([imageData, false]);\r\n };\r\n\r\n http.send();\r\n } catch (e) {\r\n resolve([imageData, false]);\r\n }\r\n });\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* eslint-disable no-duplicate-imports */\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { Carousel, ICarouselProps } from '@msdyn365-commerce/components';\r\n\r\nimport {\r\n IComponentNodeProps,\r\n ImagefullView,\r\n IModalViewProps,\r\n IModuleProps,\r\n inlineZoomImageOnHover,\r\n inlineZoomImageOnMouseMove,\r\n inlineZoomImageOnMouseOut,\r\n inlineZoomInit,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n KeyCodes,\r\n NodeTag,\r\n onContainerZoomInit,\r\n onMouseMoveLensContainer,\r\n onMouseOutLensContainer,\r\n onMouseOverImageContainer,\r\n removeInlineZoomStyle,\r\n SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n//@ts-ignore\r\nimport { imageSource, imageZoom, ICittaMediaGalleryData, ICittaMediaGalleryProps, thumbnailsOrientation } from '@msdyn365-commerce-modules/media-gallery';\r\nimport { getValidProductImages, validateProductImages } from './utils';\r\n\r\nexport interface IMediaGalleryState {\r\n animating: boolean;\r\n activeIndex: number;\r\n mediaGalleryItems: IImageData[] | undefined;\r\n isImageZoomed: boolean;\r\n modalIsOpen: boolean;\r\n lastUpdate?: number;\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailsViewProps {\r\n ThumbnailsContainerProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n items?: IMediaGalleryThumbnailItemViewProps[];\r\n}\r\n\r\nexport interface IMediaGalleryThumbnailItemViewProps {\r\n ThumbnailItemContainerProps: INodeProps;\r\n Picture: React.ReactElement;\r\n}\r\n\r\nexport interface IMediaGalleryViewProps extends ICittaMediaGalleryProps {\r\n state: IMediaGalleryState;\r\n MediaGallery: IModuleProps;\r\n CarouselProps: INodeProps;\r\n Thumbnails: IMediaGalleryThumbnailsViewProps;\r\n Modal?:React.ReactElement|null;\r\n}\r\n\r\n/**\r\n * Media gallery component\r\n */\r\nclass MediaGallery extends React.Component, IMediaGalleryState> {\r\n private _inlineZoomDivRef: Map = new Map();\r\n private readonly defaultGalleryImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\r\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\r\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n private readonly defaultThumbnailImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\r\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n };\r\n\r\n constructor(props: ICittaMediaGalleryProps) {\r\n super(props);\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this.state = { activeIndex: 0, animating: false, mediaGalleryItems: undefined, isImageZoomed: false, modalIsOpen:false };\r\n\r\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\r\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\r\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\r\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\r\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const source = this.props.config.imageSource || imageSource.pageContext;\r\n const curatedImage = this.props.config.images || [];\r\n\r\n if (source === imageSource.pageContext) {\r\n reaction(\r\n () => (this.props.data.product.result ? this.props.data.product.result.RecordId : null),\r\n async () => {\r\n if (this.props.data.product.result) {\r\n const images = await getValidProductImages(\r\n this.props.data.product.result.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: [...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n }\r\n }\r\n );\r\n }\r\n\r\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\r\n const images = await validateProductImages(\r\n this.props.data.mediaLocations.result,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else if (source === imageSource.pageContext && this.props.data.product.result) {\r\n const images = await getValidProductImages(\r\n this.props.data.product.result.RecordId,\r\n +this.props.context.request.apiSettings.channelId,\r\n this.props.context.actionContext,\r\n this.props.config.thumbnailImageSettings || this.defaultThumbnailImageSettings\r\n );\r\n\r\n this.setState({\r\n mediaGalleryItems: [...images, ...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n } else {\r\n this.setState({\r\n mediaGalleryItems: [...curatedImage],\r\n activeIndex: 0,\r\n lastUpdate: Date.now()\r\n });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n id,\r\n config,\r\n resources\r\n } = this.props;\r\n\r\n const mediaGalleryItems = this.state.mediaGalleryItems;\r\n const { className, showPaginationTooltip } = config;\r\n const galleryImageSettings = config.galleryImageSettings;\r\n if(galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n const thumbnailImageSettings = config.thumbnailImageSettings;\r\n if(thumbnailImageSettings) {\r\n thumbnailImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\r\n const allowFullscreen:boolean = config.allowFullScreen || false;\r\n const zoomViewMode: string =\r\n config.imageZoom === imageZoom.inline\r\n ? imageZoom.inline\r\n : config.imageZoom === imageZoom.container\r\n ? imageZoom.container\r\n : '';\r\n const zoomView = allowFullscreen ? 'fullscreen': zoomViewMode;\r\n\r\n const viewProps: IMediaGalleryViewProps = {\r\n ...(this.props as ICittaMediaGalleryProps),\r\n state: this.state,\r\n MediaGallery: {\r\n moduleProps: this.props,\r\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\r\n },\r\n Modal: allowFullscreen ? this.imageModalSlider(zoomViewMode): null,\r\n CarouselProps: {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(zoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: showPaginationTooltip === true,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n key: this.state.lastUpdate\r\n } as IComponentNodeProps,\r\n Thumbnails: {\r\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: 'ms-media-gallery__thumbnails',\r\n vertical: isVertical,\r\n flipperPrevLabel: resources.previousScreenshotFlipperText,\r\n flipperNextLabel: resources.nextScreenshotFlipperText,\r\n parentId: id,\r\n useTabList: true,\r\n key: this.state.lastUpdate\r\n } as IComponentNodeProps,\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._getThumbnailItem(item, thumbnailImageSettings || this.defaultThumbnailImageSettings, index, this.state.activeIndex))\r\n }\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private onExiting = () => {\r\n this.setState({ animating: true });\r\n };\r\n\r\n private onExited = () => {\r\n this.setState({ animating: false });\r\n };\r\n\r\n private next = (): void => {\r\n if (this.isLastItem() === undefined) {\r\n return;\r\n }\r\n\r\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private previous = (): void => {\r\n const nextIndex = this.isFirstItem()\r\n ? this.state.mediaGalleryItems\r\n ? this.state.mediaGalleryItems.length - 1\r\n : 0\r\n : this.state.activeIndex - 1;\r\n this.goToIndex(nextIndex);\r\n };\r\n\r\n private goToIndex = (index: number): void => {\r\n this.setState({ activeIndex: index });\r\n };\r\n\r\n private _renderCarouselItemImageView(zoomView: string, image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\r\n if (zoomView === 'container') {\r\n return this._renderImageInContainerOnZoom(image, imageSettings, index);\r\n } else if (zoomView === 'inline') {\r\n return this._renderImageInlineOnZoom(image, imageSettings, index);\r\n } else if (zoomView === 'fullscreen') {\r\n return this._renderImageFullScreenOnZoom(image, imageSettings, index);\r\n } else {\r\n return {this._getCarouselItem(image, imageSettings, index)};\r\n }\r\n }\r\n\r\n private _getCarouselItem = (image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode => (\r\n \r\n );\r\n\r\n private _getThumbnailItem = (image: IImageData, imageSettings: IImageSettings, index: number, modifiedActiveIndex: number): IMediaGalleryThumbnailItemViewProps => {\r\n const classes = classnames(\r\n 'ms-media-gallery__thumbnail-item',\r\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\r\n );\r\n\r\n return {\r\n ThumbnailItemContainerProps: {\r\n tag: 'li' as NodeTag,\r\n className: classes,\r\n role: 'tab',\r\n tabIndex: 0,\r\n key: index,\r\n 'aria-label': image.altText,\r\n 'aria-selected': modifiedActiveIndex === index,\r\n 'aria-controls': `${this.props.id}__carousel-item__${index}`,\r\n onClick: this._generateOnThumbnailClick(index),\r\n onKeyDown: this._generateOnThumbnailKeyDown(index)\r\n },\r\n Picture: (\r\n \r\n )\r\n };\r\n };\r\n\r\n private _generateOnThumbnailKeyDown = (index: number) => {\r\n return (event: React.KeyboardEvent) => {\r\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n }\r\n };\r\n };\r\n\r\n private _generateOnThumbnailClick = (index: number) => {\r\n return (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n\r\n this.goToIndex(index);\r\n };\r\n };\r\n\r\n private _renderImageInlineOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n // tslint:disable-next-line: react-this-binding-issue\r\n
this._inlineZoomDivRef.set(index, divRef!)} data-scale={this.props.config.dataScale}>\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\r\n inlineZoomImageOnHover(event, this.props.config.dataScale);\r\n }\r\n\r\n private _onInlineImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\r\n return;\r\n }\r\n\r\n inlineZoomInit(event, this.props.config.dataScale);\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onImageMouseOut(event: React.MouseEvent): void {\r\n inlineZoomImageOnMouseOut(event);\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n\r\n }\r\n\r\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\r\n if (window.innerWidth <= 768) { // $msv-breakpoint-m\r\n return;\r\n }\r\n\r\n onContainerZoomInit(event);\r\n\r\n this.setState({\r\n isImageZoomed: true\r\n });\r\n }\r\n\r\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\r\n onMouseOutLensContainer(event);\r\n\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n\r\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings:IImageSettings, index: number): React.ReactNode {\r\n return (\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n private _mapProductToImageData(product: SimpleProduct): IImageData {\r\n return {\r\n src: product.PrimaryImageUrl || ''\r\n };\r\n }\r\n\r\n private isFirstItem = () => this.state.activeIndex === 0;\r\n\r\n private isLastItem = () => this.state.mediaGalleryItems && this.state.activeIndex === this.state.mediaGalleryItems.length - 1;\r\n\r\n private openModalDialog = (): void => {\r\n this._toggleModal();\r\n }\r\n\r\n private _toggleModal(): void {\r\n if (this.state.modalIsOpen) {\r\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\r\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\r\n const image = parentDiv.children[1].querySelector('img');\r\n if (image) {\r\n image.removeAttribute('style');\r\n }\r\n }\r\n this.setState({\r\n isImageZoomed: false\r\n });\r\n }\r\n this.setState({\r\n isImageZoomed: false,\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n removeInlineZoomStyle();\r\n }\r\n\r\n private imageModalSlider=(ZoomView:string):React.ReactElement => {\r\n const {\r\n data: {\r\n product: { result: product }\r\n },\r\n resources,\r\n config\r\n } = this.props;\r\n let mediaGalleryItems = this.state.mediaGalleryItems;\r\n\r\n if (!mediaGalleryItems && product) {\r\n mediaGalleryItems = [this._mapProductToImageData(product)];\r\n }\r\n\r\n const galleryImageSettings = config.galleryImageSettings;\r\n if(galleryImageSettings) {\r\n galleryImageSettings.cropFocalRegion = true;\r\n }\r\n\r\n const carouselprops = {\r\n tag: Carousel,\r\n className: 'ms-media-gallery__carousel',\r\n items:\r\n mediaGalleryItems &&\r\n mediaGalleryItems.map((item: IImageData, index: number) => this._renderCarouselItemImageView(ZoomView, item, galleryImageSettings || this.defaultGalleryImageSettings, index)),\r\n activeIndex: this.state.activeIndex,\r\n next: this.next,\r\n previous: this.previous,\r\n interval: false,\r\n directionTextPrev: resources.previousScreenshotFlipperText,\r\n directionTextNext: resources.nextScreenshotFlipperText,\r\n onIndicatorsClickHandler: this.goToIndex,\r\n showPaginationTooltip: true,\r\n hideIndicator: true,\r\n handleOnExited: this.onExited,\r\n handleOnExiting: this.onExiting,\r\n } as IComponentNodeProps;\r\n\r\n const carousel = ;\r\n\r\n const imageModalSliderProps:IModalViewProps = {\r\n modalIsOpen:this.state.modalIsOpen,\r\n ontoggle:this._toggleModal,\r\n galleryCarousel: carousel\r\n };\r\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\r\n }\r\n}\r\n\r\nexport default MediaGallery;\r\n","/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '@msdyn365-commerce-modules/media-gallery';\r\n\r\nconst MediaGalleryView: React.FC = props => {\r\n const {CarouselProps, Thumbnails, MediaGallery, Modal} = props;\r\n\r\n return (\r\n \r\n \r\n {Modal}\r\n {_renderThumbnails(Thumbnails)}\r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\r\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\r\n\r\n return (\r\n \r\n \r\n {items && items.map(_renderThumbnailItem)}\r\n \r\n \r\n );\r\n};\r\n\r\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\r\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\r\n\r\n return (\r\n \r\n {Picture}\r\n \r\n );\r\n};\r\n\r\nexport default MediaGalleryView;","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n ICartlinesViewProps,\r\n ICartResources,\r\n ICartViewProps,\r\n IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent}\r\n */\r\nexport class CartView extends React.PureComponent, ICartViewState> {\r\n private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n public state: ICartViewState = {\r\n cartlinesErrors: []\r\n };\r\n\r\n private createLogMessage = (message: string): string => {\r\n const url: string = decodeURI(window.location.search);\r\n const origin = window.location.origin;\r\n const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n return logMessage;\r\n }\r\n\r\n private logMessage = (message: string): void => {\r\n this.cittaTelemetry.trace(this.createLogMessage(message));\r\n }\r\n\r\n // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n constructor(props: ICartViewProps & ICartProps<{}>) {\r\n super(props);\r\n\r\n this._renderCartlines = this._renderCartlines.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n // if (this.isQuantityLimitsFeatureEnabled) {\r\n // await this._validateCart();\r\n // }\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n this.logMessage('landed on cart page');\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n return (\r\n
\r\n {this.props.title}\r\n \r\n {this._renderCartlines()}\r\n \r\n {this.props.orderSummaryHeading &&\r\n < Node {...this.props.OrderSummaryWrapper}>\r\n {this.props.orderSummaryHeading}\r\n {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n {_renderGIftCardError(this.props)}\r\n {this.props.config.freightCalculationText ?
{this.props.config.freightCalculationText}
: null}\r\n
\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null :
{this.props.resources.orLabel}
}\r\n
\r\n {_renderBackToShoppingButton(this.props.resources)}\r\n {this.props.checkoutAsGuestButton}\r\n
\r\n
\r\n \r\n }\r\n {this.props.storeSelector}\r\n
\r\n );\r\n }\r\n\r\n private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n const { emptyCartText } = this.props.resources;\r\n\r\n if (this.props.cartLoadingStatus) {\r\n return <>{this.props.cartLoadingStatus};\r\n }\r\n const cartLines = this._getCartLines();\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n
\r\n {cartLine.addToWishlist}\r\n {cartLine.remove}\r\n
\r\n
\r\n );\r\n });\r\n } else {\r\n return (this.props.cartDataResult ?\r\n (\r\n
\r\n

{emptyCartText}

\r\n {this.props.backToShoppingButton}\r\n
\r\n ) : <>{this.props.waitingComponent}\r\n );\r\n }\r\n }\r\n\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors: cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: 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: \"Colour:\" || resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.props.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates: orderTemplates,\r\n customerInformation: customerInformation\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return 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 private _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)\r\n .then(() => {\r\n this._validateCart()\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .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 _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n return true;\r\n }\r\n return false;\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _fulfillmentStoreIdUpdated = () => {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\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 return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\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 return false;\r\n }\r\n }\r\n\r\n private async _validateCart(retry: boolean = true): Promise {\r\n if (!this.isQuantityLimitsFeatureEnabled) {\r\n return AsyncResult.resolve();\r\n }\r\n\r\n const {\r\n data: { cart: cart }\r\n } = this.props;\r\n let cartResult: ICartState;\r\n try {\r\n cartResult = await cart;\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n return AsyncResult.resolve();\r\n }\r\n const cartVersion = cartResult.cart?.Version;\r\n if (cartVersion) {\r\n try {\r\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n return AsyncResult.resolve();\r\n } catch (error) {\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n try {\r\n await cartResult.refreshCart({});\r\n } catch (refreshError) {\r\n this.props.telemetry.warning(refreshError);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n return AsyncResult.resolve();\r\n }\r\n try {\r\n await this._validateCart(false);\r\n return AsyncResult.resolve();\r\n } catch (validateError) {\r\n this.props.telemetry.warning(validateError);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n } else {\r\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n}\r\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n return (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n if (!cartLine.pickUpInStore || !storeSelector) {\r\n return null;\r\n }\r\n\r\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n const toggleBopis = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n const changeStore = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n return (\r\n \r\n
\r\n {isBopisSelected ? {pickUpAtStoreWithLocationText} : {shipToAddressDisplayText}}\r\n
\r\n {\r\n isBopisSelected &&\r\n
\r\n {cartLine.pickUpInStore.orgUnitName}\r\n \r\n
\r\n }\r\n \r\n
\r\n );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || errorData.errors.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\nconst _renderGIftCardError = (props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n function checkAvailability(arr:any, val:string) {\r\n return arr.some(function(arrVal:any) {\r\n return val === arrVal.data?.product?.ItemId;\r\n });\r\n }\r\n let hasGiftCard = checkAvailability(props.cartlines, \"GiftCard\");\r\n let cartlinesLength = props.cartlines?.length || 0;\r\n if(hasGiftCard && cartlinesLength > 1) {\r\n return (\r\n
\r\n {props.config.giftCardErrorMessage || \"At this stage, we cannot process gift cards with product. Please purchase gift cards in a separate transaction.\"}\r\n
\r\n );\r\n } else {\r\n return null\r\n }\r\n};\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n \r\n {props.promoCode}\r\n {_renderSubTotal(props)}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.shipping}\r\n {props.config.hideTaxLine ? null : orderSummaryLines.tax}\r\n {_renderAmountDue(props)}\r\n {/* {_renderTotalSavings(props)} */}\r\n \r\n );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const OrderSubTotal = props.data.cart.result?.cart?.NetPrice;\r\n return (\r\n

\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n {props.resources.subTotalHeadingLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\n// function _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n// const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n// const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n// return (\r\n//

\r\n// {taxLabel}\r\n// {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n// \r\n// ) : (\r\n// {props.resources.yetToBeCalculatedText}\r\n// )}\r\n//

\r\n// );\r\n// }\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n return (\r\n

\r\n {props.resources.totalAmountLabel}\r\n {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\n// function _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n// const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n// return (\r\n//

\r\n// {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n// <>\r\n// {props.resources.totalSavings}\r\n// \r\n// \r\n// ) : null}\r\n//

\r\n// );\r\n// }","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n ICartlinesViewProps,\r\n ICartResources,\r\n ICartViewProps,\r\n IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent}\r\n */\r\nexport class CartView extends React.PureComponent, ICartViewState> {\r\n private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n public state: ICartViewState = {\r\n cartlinesErrors: []\r\n };\r\n\r\n private createLogMessage = (message: string): string => {\r\n const url: string = decodeURI(window.location.search);\r\n const origin = window.location.origin;\r\n const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n return logMessage;\r\n }\r\n\r\n private logMessage = (message: string): void => {\r\n this.cittaTelemetry.trace(this.createLogMessage(message));\r\n }\r\n\r\n // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n constructor(props: ICartViewProps & ICartProps<{}>) {\r\n super(props);\r\n\r\n this._renderCartlines = this._renderCartlines.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n // if (this.isQuantityLimitsFeatureEnabled) {\r\n // await this._validateCart();\r\n // }\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n this.logMessage('landed on cart page');\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n return (\r\n
\r\n {this.props.title}\r\n \r\n {this._renderCartlines()}\r\n \r\n {this.props.orderSummaryHeading &&\r\n < Node {...this.props.OrderSummaryWrapper}>\r\n {this.props.orderSummaryHeading}\r\n {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n {_renderUnder200sError(this.props)}\r\n {this.props.config.freightCalculationText ?
{this.props.config.freightCalculationText}
: null}\r\n
\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null :
{this.props.resources.orLabel}
}\r\n
\r\n {_renderBackToShoppingButton(this.props.resources)}\r\n {this.props.checkoutAsGuestButton}\r\n
\r\n
\r\n \r\n }\r\n {this.props.storeSelector}\r\n
\r\n );\r\n }\r\n\r\n private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n const { emptyCartText } = this.props.resources;\r\n\r\n if (this.props.cartLoadingStatus) {\r\n return <>{this.props.cartLoadingStatus};\r\n }\r\n const cartLines = this._getCartLines();\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n
\r\n {cartLine.addToWishlist}\r\n {cartLine.remove}\r\n
\r\n
\r\n );\r\n });\r\n } else {\r\n return (this.props.cartDataResult ?\r\n (\r\n
\r\n

{emptyCartText}

\r\n {this.props.backToShoppingButton}\r\n
\r\n ) : <>{this.props.waitingComponent}\r\n );\r\n }\r\n }\r\n\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors: cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: 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: \"Size:\" || resources.productDimensionTypeSize,\r\n colorString: \"Colour:\" || resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.props.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates: orderTemplates,\r\n customerInformation: customerInformation\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return 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 private _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)\r\n .then(() => {\r\n this._validateCart()\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .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 _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n return true;\r\n }\r\n return false;\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _fulfillmentStoreIdUpdated = () => {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\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 return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\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 return false;\r\n }\r\n }\r\n\r\n private async _validateCart(retry: boolean = true): Promise {\r\n if (!this.isQuantityLimitsFeatureEnabled) {\r\n return AsyncResult.resolve();\r\n }\r\n\r\n const {\r\n data: { cart: cart }\r\n } = this.props;\r\n let cartResult: ICartState;\r\n try {\r\n cartResult = await cart;\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n return AsyncResult.resolve();\r\n }\r\n const cartVersion = cartResult.cart?.Version;\r\n if (cartVersion) {\r\n try {\r\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n return AsyncResult.resolve();\r\n } catch (error) {\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n try {\r\n await cartResult.refreshCart({});\r\n } catch (refreshError) {\r\n this.props.telemetry.warning(refreshError);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n return AsyncResult.resolve();\r\n }\r\n try {\r\n await this._validateCart(false);\r\n return AsyncResult.resolve();\r\n } catch (validateError) {\r\n this.props.telemetry.warning(validateError);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n } else {\r\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n }\r\n\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n}\r\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n return (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n if (!cartLine.pickUpInStore || !storeSelector) {\r\n return null;\r\n }\r\n\r\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n const toggleBopis = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n const changeStore = (event: React.MouseEvent) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n return (\r\n \r\n
\r\n {isBopisSelected ? {pickUpAtStoreWithLocationText} : {shipToAddressDisplayText}}\r\n
\r\n {\r\n isBopisSelected &&\r\n
\r\n {cartLine.pickUpInStore.orgUnitName}\r\n \r\n
\r\n }\r\n \r\n
\r\n );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || errorData.errors.length === 0) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\nconst _renderUnder200sError = (props:any): JSX.Element | null => {\r\n const OrderSubTotal = props.data.cart.result?.cart?.SubtotalAmount;\r\n const { request } = props.context;\r\n const market = request && request.apiSettings && request.apiSettings.oun;\r\n const isB2BI = market && market === \"B2BI\";\r\n let minimumOrder = 200;\r\n const discountLevel = props.data.customerInformation.result!.LineDiscountGroup;\r\n if(isB2BI) {\r\n switch(discountLevel){\r\n case \"Level 1\":\r\n minimumOrder = 1500;\r\n break;\r\n case \"Level 4\":\r\n minimumOrder = 500;\r\n break;\r\n case \"Level 5\":\r\n minimumOrder = 500;\r\n break;\r\n default:\r\n minimumOrder = 200;\r\n }\r\n }\r\n let isGiftCardOnly = props.data.cart.result?.cart && props.data.cart.result?.cart.CartLines && props.data.cart.result?.cart.CartLines.length === 1 && props.data.cart.result?.cart.CartLines[0].ItemId === \"GiftCard\";\r\n if(!isGiftCardOnly && OrderSubTotal < minimumOrder) {\r\n return (\r\n
\r\n
Your order must be a minimum of ${minimumOrder}. Please update your cart to place an order.
\r\n
\r\n );\r\n }\r\n return null\r\n};\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n return (\r\n \r\n {isB2B? null : props.promoCode}\r\n {isB2B? orderSummaryLines.subtotal : _renderSubTotal(props)}\r\n {props.config.hideTaxLine ? null : _renderTax(props)}\r\n {isB2B ? orderSummaryLines.subtotal : (orderSummaryLines.totalDiscounts ? orderSummaryLines.subtotal : null)}\r\n {isB2B? null : _renderAmountDue(props)}\r\n {isB2B? null : _renderTotalSavings(props)}\r\n \r\n );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const OrderSubTotal = props.data.cart.result?.cart?.NetPrice;\r\n return (\r\n

\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n {props.resources.subTotalHeadingLabel}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n return (\r\n

\r\n {taxLabel}\r\n {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n return (\r\n

\r\n {props.resources.amountDueLabel}\r\n {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n \r\n ) : (\r\n {props.resources.yetToBeCalculatedText}\r\n )}\r\n

\r\n );\r\n}\r\n\r\nfunction _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n return (\r\n

\r\n {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n <>\r\n {props.resources.totalSavings}\r\n \r\n \r\n ) : null}\r\n

\r\n );\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { getUrlSync, IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nexport interface ICartIconData {\r\n cart: ICartState;\r\n}\r\n\r\nexport interface ICartIconComponentProps extends IComponentProps {\r\n className?: string;\r\n cartLabel: string;\r\n}\r\n\r\nexport interface ICartIconComponent extends IComponent {\r\n}\r\n\r\nconst CartIconComponentActions = {\r\n};\r\n\r\ninterface ICartIconState {\r\n countChanged: boolean;\r\n}\r\n\r\ninterface ICartLineData{\r\n quantity?: number;\r\n price?: number;\r\n item?: string;\r\n }\r\n\r\n/**\r\n *\r\n * CartIcon component\r\n * @extends {React.FC}\r\n */\r\n@observer\r\nclass CartIcon extends React.Component {\r\n private cartItemCount: string | undefined;\r\n\r\n constructor(props: ICartIconComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n countChanged: false\r\n };\r\n }\r\n public render(): JSX.Element {\r\n const { cartLabel, data: { cart } } = this.props;\r\n\r\n if (!cart) {\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n const cartLink = getUrlSync('cart', this.props.context.actionContext);\r\n\r\n const cartItem = `${this._getCartLineQuantities(cart.cart)}`;\r\n\r\n const label = format(cartLabel, cartItem) || `Shopping bag, ${cartItem} items`;\r\n\r\n if (!this.state.countChanged && this.cartItemCount && this.cartItemCount < cartItem) {\r\n this.setState({\r\n countChanged: true\r\n });\r\n // tslint:disable-next-line: no-floating-promises\r\n this._resetClass();\r\n }\r\n this.cartItemCount = cartItem;\r\n const hiddenCartLines = this._createHiddenCartLines(cart.cart);\r\n return (\r\n \r\n
\r\n ({cartItem})\r\n
\r\n {hiddenCartLines}\r\n
\r\n );\r\n }\r\n\r\n private _timeout(ms: number): Promise {\r\n // tslint:disable-next-line: no-string-based-set-timeout\r\n return new Promise(res => setTimeout(res, ms));\r\n }\r\n\r\n private async _resetClass(): Promise {\r\n await this._timeout(1500);\r\n this.setState({\r\n countChanged: false\r\n });\r\n return;\r\n }\r\n\r\n private _getCartLineQuantities = (cart: Cart | undefined): string => {\r\n if(!cart) {\r\n return '0';\r\n }\r\n\r\n let quantity = 0;\r\n\r\n if(cart.CartLines && cart.CartLines.length > 0) {\r\n cart.CartLines.forEach(cartLine => {\r\n quantity += cartLine.Quantity || 1;\r\n });\r\n }\r\n\r\n return quantity.toString();\r\n }\r\n\r\n private _createHiddenCartLines = (cart: Cart | undefined): any => {\r\n if (!cart || !cart.CartLines?.length) {\r\n return
;\r\n }\r\n\r\n let cartLines: ICartLineData[] = [];\r\n\r\n cart.CartLines?.forEach(line => {\r\n cartLines.push({\r\n quantity: line.Quantity,\r\n price: line.Price,\r\n item: line.ItemId\r\n });\r\n });\r\n\r\n return
;\r\n }\r\n}\r\n\r\n// @ts-ignore\r\nexport const CartIconComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'CartIcon',\r\n { component: CartIcon, ...CartIconComponentActions }\r\n);","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IHeaderViewProps } from '@msdyn365-commerce-modules/header';\r\nimport { Collapse, Drawer, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { format } from '@msdyn365-commerce/retail-proxy';\r\nimport { IHeaderProps } from '../definition-extensions/header.ext.props.autogenerated';\r\nimport { CartIconComponent } from './components/cart-icon.component';\r\n// import { ContactInfoClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\n\r\n/**\r\n *\r\n * Header component\r\n * @extends {React.PureComponent>}\r\n */\r\nclass HeaderView extends React.Component> {\r\n constructor(props: IHeaderViewProps & IHeaderProps<{}>) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount(): void {\r\n this._stickyHeaderSetup();\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n HeaderTag,\r\n HeaderContainer,\r\n HeaderTopBarContainer\r\n } = this.props;\r\n return (\r\n \r\n \r\n \r\n {this._renderTopBarLeft()}\r\n {this._renderTopBarCenter()}\r\n {this._renderTopBarRight()}\r\n \r\n {this._renderCollapseMenu()}\r\n \r\n {this._renderReactFragment(this.props.menuBar)}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private _renderTopBarLeft = (): JSX.Element | null => {\r\n return (\r\n
\r\n {this.props.navIcon}\r\n {this.props.logo}\r\n {this._renderReactFragment(this.props.search)}\r\n
\r\n );\r\n }\r\n\r\n private _renderTopBarRight = (): JSX.Element | null => {\r\n const {Divider} = this.props;\r\n return (\r\n
\r\n {this._renderReactFragment(this.props.slots.countryPicker)}\r\n {this._renderReactFragment(this.props.slots.siteOptions)}\r\n {this._renderAccountBlock(false)}\r\n {this.props.wishListIconDesktop}\r\n \r\n
{this._renderCartIcon()}
\r\n
\r\n );\r\n }\r\n\r\n private _renderTopBarCenter = (): JSX.Element | null => {\r\n return (\r\n
\r\n {this._renderReactFragment(this.props.slots.cittaLogo)}\r\n
\r\n );\r\n }\r\n\r\n private _renderCartIcon = (): JSX.Element | null => {\r\n\r\n if (this.props.data.cart.result) {\r\n const cartItem = `${this.props.data.cart.result.totalItemsInCart}`;\r\n const itemCount = cartItem && parseInt(cartItem, 10) || 0;\r\n let label = this.props.resources.cartLabelNoItems || 'Shopping bag, having no items';\r\n if (itemCount === 1) {\r\n label = this.props.resources.cartLabelWithOneItem || 'Shopping bag, having one item';\r\n } else if (itemCount > 1) {\r\n label = this.props.resources.cartLabel && format(this.props.resources.cartLabel, cartItem) || `Shopping bag, having ${itemCount} items`;\r\n }\r\n return (\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n private _renderCollapseMenu = (): JSX.Element | null => {\r\n const {Divider, MobileMenuLinksContainer, mobileMenuCollapsed} = this.props;\r\n return (\r\n \r\n \r\n {this._renderReactFragment(this.props.search)}\r\n {this._renderMobileAccountBlock(true)}\r\n { this.props.wishListIconMobile }\r\n \r\n \r\n {this._renderReactFragment(this.props.menuBar)}\r\n \r\n );\r\n }\r\n\r\n private renderCustomerName = (): React.ReactChild => {\r\n const { accountInformation } = this.props.data;\r\n const customer = accountInformation && accountInformation.result;\r\n return (\r\n <>{customer ? customer.FirstName || customer.Name : ''}\r\n );\r\n };\r\n\r\n private _renderMobileAccountBlock = (renderForMobile: boolean): JSX.Element | null => {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n signOutLink,\r\n signInLink,\r\n accountLinks} = this.props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n const accountClassName = classnames('ms-header__drawer', AccountInfoDropdownParentContainer.className, renderForMobile ? 'account-mobile' : 'account-desktop');\r\n\r\n if (accountLinks) {\r\n return (\r\n \r\n
\r\n { accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false }\r\n {signOutLink}\r\n
\r\n
\r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _renderAccountBlock = (renderForMobile: boolean): JSX.Element | null => {\r\n const {\r\n AccountInfoDropdownParentContainer,\r\n AccountInfoDropdownPopoverConentContainer,\r\n accountInfoDropdownButton,\r\n signOutLink,\r\n signInLink,\r\n accountLinks,\r\n } = this.props;\r\n\r\n if (AccountInfoDropdownParentContainer) {\r\n if (AccountInfoDropdownPopoverConentContainer) {\r\n return (\r\n \r\n {accountInfoDropdownButton}\r\n \r\n { accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false }\r\n {signOutLink}\r\n \r\n \r\n );\r\n } else if (signInLink) {\r\n return (\r\n \r\n {signInLink}\r\n \r\n );\r\n }\r\n }\r\n this.props.context.telemetry.error('Header content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n private _renderReactFragment = (items: React.ReactNode[]): JSX.Element | null => {\r\n return (\r\n \r\n {items && items.length\r\n ? items.map((slot: React.ReactNode, index: number) => {\r\n return {slot};\r\n })\r\n : null}\r\n \r\n );\r\n }\r\n\r\n private _stickyHeaderSetup(): void {\r\n // Set header update methods to trigger on scroll\r\n window.onscroll = () => {\r\n this._updateHeader();\r\n };\r\n this._updateHeader();\r\n }\r\n\r\n private _updateHeader(): void {\r\n // Get heights of cookie and promotion banners\r\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\r\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : 0;\r\n\r\n // triggers opacity change of header\r\n const headerElem = document.querySelector('.ms-header');\r\n if (headerElem) {\r\n if (document.documentElement.scrollTop > bannerHeights) {\r\n headerElem.classList.add('lock-opaque');\r\n } else {\r\n headerElem.classList.remove('lock-opaque');\r\n }\r\n }\r\n\r\n // Update sticky header position and opacity\r\n const stickyHeader: HTMLElement | null = document.querySelector('.ms-header__desktop-view');\r\n const headerLogo: HTMLElement | null = document.querySelector('.ms-header__topbar-center');\r\n const headerLeftActionItem: HTMLElement | null = document.querySelector('.ms-header__topbar-left');\r\n const headerRightActionItem: HTMLElement | null = document.querySelector('.ms-header__topbar-right');\r\n\r\n if (stickyHeader && headerLogo && headerLeftActionItem && headerRightActionItem) {\r\n // Fix center sticky header\r\n const navStickyPos = headerLogo.offsetHeight + bannerHeights;\r\n if (document.documentElement.scrollTop > navStickyPos) {\r\n stickyHeader.classList.add('fixed');\r\n } else {\r\n stickyHeader.classList.remove('fixed');\r\n }\r\n\r\n // Fix edge sticky headers\r\n if (document.documentElement.scrollTop > bannerHeights) {\r\n headerLeftActionItem.classList.add('fixed');\r\n headerRightActionItem.classList.add('fixed');\r\n } else {\r\n headerLeftActionItem.classList.remove('fixed');\r\n headerRightActionItem.classList.remove('fixed');\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default HeaderView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise {\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\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 { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n \n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n \n );\n });\n};\n\nconst CartIconView: React.FC = (props: ICartIconViewProps) => (\n \n {props.cartIcon}\n {props.FlyoutContainer ? (\n \n {props.flyoutTitle}\n {props.checkoutBlockedDueToUnavailableFunds}\n {_renderCartlines(props.cartlines, props)}\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.goToCartButton}\n \n ) : (\n false\n )}\n \n);\n\nexport default CartIconView;\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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n ActiveCartProductsInput,\n QueryResultSettingsProxy,\n buildCacheKey,\n getActiveCartProductsAction\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Input class for pickup delivery options for items in cart.\n */\nexport class ProductPickUpOptionsForCartLineItems implements IActionInput {\n public readonly apiSettings: ICommerceApiSettings;\n\n public constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => buildCacheKey('ActiveCartLineItemsPickUpOptions', this.apiSettings);\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ActiveCartLineItemsPickUpOptions';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetPickUpOptionCartLineItems method.\n * @param inputData - The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nconst createInput = (inputData: ICreateActionContext>) => {\n return new ProductPickUpOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetPickUpOptionCartLineItems data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Order Template object.\n */\nexport async function getPickUpOptionsForCartLineItems(\n input: ProductPickUpOptionsForCartLineItems,\n context: IActionContext\n): Promise {\n // If no input is provided fail out\n if (!input.apiSettings.channelId) {\n throw new Error('[getPickUpOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(context);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), context);\n const filterOption = 4;\n const response: ProductDeliveryOptions[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code.\n if (cart === undefined || !ArrayExtensions.hasElements(products)) {\n return Promise.resolve(response);\n }\n\n const pickupoptions = await ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n products.map(product => product.RecordId),\n {},\n filterOption\n );\n\n return pickupoptions;\n}\n\n/**\n * The GetPickupOptionCartLineItems Data Action\n * Returns pickup options.\n */\nexport const getPickUpOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-pickup-options-for-cartlines',\n action: getPickUpOptionsForCartLineItems as IAction,\n input: createInput\n});\n\nexport default getPickUpOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n });\n\n return reactNodes;\n};\n\nconst _assembleGroupInvoiceCartlines = (\n cartLines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (cartLines && cartLines.length > 0) {\n // Create invoice cartLines group\n const carLineViewProps = assembleCartlines(cartLines, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n }\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines, hasInvoiceLine } = props;\n return hasInvoiceLine\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\n : _assembleGroupCartlines(cartlines, products, props);\n};\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 { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n ILinesAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult,\n PromoCodeComponent,\n SaveCartToOrderTemplateComponent\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, getUrlSync, IImageSettings, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\nimport { FeatureState, ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory,\n ProductPickUpOptionsForCartLineItems,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant,\n Waiting,\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';\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-cartlines';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode[];\n ExpressCheckoutSectionWrapper: INodeProps;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: CartLineValidationResultsByLineId;\n promotionData: IPromotionData;\n isCartValid: boolean;\n productPickUpOptions?: ProductDeliveryOptions[];\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass Cart extends React.Component> {\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n\n this.state = {\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true,\n productPickUpOptions: undefined,\n cartlinesErrors: {}\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise {\n this._isMounted = true;\n const {\n config,\n context: { actionContext }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled =\n (await this.getOrderQuantityLimitsFeatureFlag()) || (await this._isChannelLimitsFeatureEnabled());\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\n }\n }\n );\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps, nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', 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 const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode\n );\n\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title:

{resources.cartTitle}

,\n cart: this.props.data.cart.result,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n multiplePickUpEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n cart?.hasInvoiceLine ? (\n

{resources.invoiceSummaryTitle}

\n ) : (\n

{resources.orderSummaryTitle}

\n )\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: !isCartEmpty ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: (\n \n {resources.backToShoppingButtonTitle}\n \n ),\n createTemplateFromCartButton:\n this._displayAddCartToTemplate() && products ? (\n \n ) : null,\n checkoutBlockedDueToUnavailableFunds: null,\n storeSelector:\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: ,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n if (\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\n this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\n this.props.data.customerInformation.result\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null,\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\n ) {\n const { resources } = this.props;\n\n if (\n ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\n ) {\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors =\n (cartLines &&\n cartLines\n .map(cartline => {\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError =\n cartline.data && cartline.data.product?.Name\n ? `${cartline.data.product.Name}: ${cartline.error}`\n : cartline.error;\n\n return (\n
\n {fullError}\n
\n );\n }\n\n return null;\n })\n .filter((line): line is JSX.Element => !!line)) ||\n [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n \n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine\n ? InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\n ? OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry,\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n })\n : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return (\n cart && (\n \n )\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: ICartResources\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n this.props.data.featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled ||\n false;\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\n ? CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\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 (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\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 /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\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\n .removeCartLines(input)\n .then(() => {\n this.validateCart().catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity\n )\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch(error => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineValidationResult = {\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\n ValidationFailures: [\n {\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\n ? cartActionResult.validationResults[0].ErrorContext\n : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n ]\n };\n\n this.setState({\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise {\n if (!this.isQuantityLimitsFeatureEnabled) {\n this.setState({ isCartValid: true });\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(cart, telemetry, context, true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\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 return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n try {\n const customerInfo = await this.props.data.customerInformation;\n return (\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const { featureState } = this.props.data;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n return this.props.data.products &&\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\n cart &&\n cart.cart.CartLines &&\n cart.cart.CartLines.length > 0 &&\n this.props.data.channelDeliveryOptionConfig?.result\n ? CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n hasInvoiceLine: cart?.hasInvoiceLine || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\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 amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites,\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n}\n\nexport default Cart;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (\n cartLines: ICartlinesViewProps[] | undefined,\n cartEmptyText: string,\n CartlinesWrapper: INodeProps,\n storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode,\n waitingComponent: React.ReactNode,\n cartLoadingStatus: string,\n cartDataResult: boolean\n): JSX.Element[] | JSX.Element => {\n if (cartLoadingStatus) {\n return <>{cartLoadingStatus};\n }\n if (cartLines) {\n return cartLines.map(cartLine => {\n return (\n
\n {cartLine.cartline}\n {storeSelector && cartLine.pickUpInStore ? (\n {cartLine.pickUpInStore.defaultComponent}\n ) : null}\n {cartLine.addToOrderTemplate ? (\n \n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n \n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n \n )}\n
\n );\n });\n }\n return cartDataResult ? (\n
\n

{cartEmptyText}

\n {backToShoppingButton}\n
\n ) : (\n <>{waitingComponent}\n );\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n \n {errorData.header}\n {errorData.errors}\n \n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n \n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n \n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (\n orderSummaryLines: IOrderSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n \n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n \n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n \n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n \n \n );\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n \n {isBopisSelected ? (\n

\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n

\n ) : null}\n
\n \n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (\n pickUpText: string,\n shippingText: string,\n emailShippingText: string,\n titleSeparate: string,\n cartLine: ICartlinesViewProps,\n emailDeliveryModeCode?: string\n) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n }\n\n return (\n <>\n
\n

\n

{groupTitle}

\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n
\n \n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n
\n {props.cartLinesGroup.map(cartlines => {\n return (\n
\n {renderCartLinesGroupHeader(\n props.resources.pickUpText,\n props.resources.shippingText,\n props.resources.emailshippingText,\n props.resources.titleSeparate,\n cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\n )}\n {_renderCartlines(\n cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n
\n );\n })}\n
\n );\n }\n return props.cartDataResult ? (\n
\n
\n

{props.resources.emptyCartText}

\n {props.backToShoppingButton}\n
\n
\n ) : (\n <>{props.waitingComponent}\n );\n};\n\nconst CartView: React.FC = (props: ICartViewProps) => (\n
\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? (\n renderCartLinesGroup(props)\n ) : (\n \n {_renderCartlines(\n props.cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n \n )}\n {props.orderSummaryHeading && (\n \n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\n {props.expressCheckoutButton}\n ) : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n \n )}\n {props.storeSelector}\n
\n);\n\nexport default CartView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: { promotionLinkText, promotionPopupHeading },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n \n {props.resources.promotionStringHeading}\n \n ),\n promotionSeeAllLink: (\n \n {` `}\n {promotionLinkText} {` `}\n \n ),\n promotionDialog: (\n \n \n
\n {promotionPopupHeading}\n
\n
\n \n
    \n {promotions.map(_promotion => {\n return (\n
  • \n {_promotion.Promotion?.OfferName} {` `}\n
  • \n );\n })}\n
\n
\n \n
\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n CartLineItemComponent,\n IAddToOrderTemplateDialogResources,\n ICartlineResourceString,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult\n} from '@msdyn365-commerce/components';\nimport MsDyn365, {\n IAny,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageSettings,\n ITelemetry,\n TelemetryEvent,\n isChannelTypeB2B\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResultsByLineId,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n isCartLineItemPickUpType,\n ObjectExtensions,\n OrderTemplate,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: CartLineValidationResultsByLineId;\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 retailMulitplePickupFeatureState?: boolean;\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n hasInvoiceLine?: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult;\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogId?: number;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n productAvailability: IProductInventoryInformation | undefined\n): number => {\n if (\n !isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\n ) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\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 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\nconst _getErrorMessage = (\n availableQuantityInStock: number,\n currentQuantity: number,\n props: ICartLineItemsProps,\n shouldSkipStockCheck: boolean,\n cartLine: CartLine,\n lineId: string | undefined,\n foundProductAvailability?: IProductInventoryInformation\n): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n // check availability passed as prop for each cartline\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n if (foundProductAvailability === undefined) {\n finalErrorMessages.push(props.outOfStockText);\n return finalErrorMessages.toString();\n }\n }\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\n if (errorsFoundByLineId !== undefined) {\n for (const i of errorsFoundByLineId) {\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\n i.ValidationFailures.forEach(validation => {\n if (validation.ErrorContext !== undefined) {\n finalErrorMessages.push(validation.ErrorContext);\n }\n });\n }\n }\n }\n\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\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};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n productPickUpOptions?: ProductDeliveryOptions\n): ICartlinesViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler,\n moveToWishlistSuccessHandler,\n addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources,\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText,\n removeFromWishlistButtonText,\n orderTemplates,\n customerInformation,\n wishlists,\n defaultWishlistName,\n storeSelectorModuleId,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, 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 // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\n ? undefined\n : _getErrorMessage(\n availableQuantityInStock,\n cartline.Quantity!,\n props,\n shouldSkipStockCheck,\n cartline,\n cartline.LineId,\n foundProductAvailability\n );\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\n : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected =\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\n 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\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 } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError:\n (!shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false) ||\n (!ObjectExtensions.isNullOrUndefined(errorMessage) && !StringExtensions.isNullOrEmpty(errorMessage)),\n cartline: (\n \n ),\n pickUpInStore: product\n ? PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: productPickUpOptions,\n pickupDeliveryModeCode:\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\n locationChangedHandler: props.locationChangedHandler\n })\n : undefined,\n remove: (\n \n ),\n addToWishlist:\n isAuthenticated && product && !isCustomPriceSelected ? (\n \n ) : (\n undefined\n ),\n addToOrderTemplate:\n isAuthenticated && orderTemplates && product ? (\n \n ) : (\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\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\n // check if cartlineitem is pickup item\n const isPickUpItem = isCartLineItemPickUpType(\n cartline,\n props.retailMulitplePickupFeatureState,\n props.channelDeliveryOptionConfig,\n props.pickupDeliveryModeCode\n );\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n if (!props.shouldIgnoreWarehouse && isPickUpItem) {\n // check warehouse only if siteBuilder setting is not \"Based on aggregate for shipping and pickup warehouses\" and cartlineitem is pickupitem\n return (\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\n );\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartline.ProductId;\n });\n }\n\n let productPickUpOptions;\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n DeliveryOption,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n retailMulitplePickupFeatureState?: boolean;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (\n orgUnitLocation: OrgUnitLocation,\n cartState: ICartState | undefined,\n cartline: CartLine,\n deliveryMode?: string\n ) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager\n .openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _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\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined\n ): JSX.Element => {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n \n \n {cartLine.FulfillmentStoreId ? (\n
\n {orgUnitName}\n \n
\n ) : null}\n \n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n /**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\n const matchDeliveryOptions = (\n productdeliveryOptions: DeliveryOption[] | undefined,\n storePickUpOptionList: string[] | undefined\n ): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(\n props.cartline,\n props.shipitText,\n props.pickUpInStoreText,\n props.changeStoreText,\n props.orgUnitLocations\n ),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\n/**\n * The payment error.\n */\nexport interface IPaymentError {\n title: string;\n message: string;\n className?: string;\n}\n\n/**\n * The payment error.\n * @param param0 - First param.\n * @param param0.title - Title.\n * @param param0.message - Message.\n * @param param0.className - ClassName.\n * @returns React node.\n */\nexport const ErrorComponent: React.FC = ({ title, message, className = 'ms-checkout-payment-instrument' }) => (\n
\n

{title}

\n

{message}

\n
\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n private readonly player: React.RefObject = React.createRef();\n\n private mediaGalleryImages: IImageData[] = [];\n\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage},${emptyPlaceHolderImage}`;\n }\n if (this.props.config.skipImageValidation && !this.state.mediaGalleryItems && this.state.isInitialLoad) {\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n )\n };\n });\n const curatedImages = this.props.config.images ?? [];\n this.mediaGalleryImages = [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems ?? this.mediaGalleryImages;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (isInPopup || zoomView !== 'fullscreen') {\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\n }\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n \n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n
\n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n /**\n * Render the video thumbnail in full screen.\n * @param mediaData - Media Data.\n * @param index - Index\n * @param imageSettings - Image settings.\n * @returns - JSX.Element\n */\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n
\n \n
\n {}\n \n
\n
\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n commerceApiRequest,\n commerceVideoMetadataRequest,\n getCatalogId,\n IActionContext,\n IImageData,\n IImageSettings,\n IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getMediaLocationsForSelectedVariant,\n MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise {\n let videoPlayerData: IVideoData | undefined;\n if (videoId) {\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n if (response.status !== 200) {\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n return;\n }\n\n const videoData = response.data as [];\n if (videoData && ArrayExtensions.hasElements(videoData)) {\n videoPlayerData = videoData[0];\n }\n }\n return videoPlayerData;\n}\n"],"names":["_assembleCartlines","cartlines","products","props","reactNodes","length","map","cartline","index","product","_getProduct","productId","undefined","find","RecordId","ProductId","foundProductAvailability","foundProductDeliveryOption","productAvailabilites","productAvailability","_productAvailability$","ProductAvailableQuantity","productDeliveryOptions","deliveryOption","push","_assembleNode","foundProductDeliveryOptions","_product$Behavior","_props$context","_product$Behavior2","_foundProductAvailabi","_props$cartState","imageSettings","gridSettings","id","typeName","context","resources","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","customerInformation","wishlists","defaultWishlistName","storeSelectorModuleId","isAuthenticated","request","user","nameOfWishlist","Name","maxQuantity","_getCartItemMaxQuantity","maxCartlineQuantity","isStockCheckEnabled","productMaxQuantity","lineMaxQuantity","IsProductAvailable","AvailableQuantity","isQuantityLimitsFeatureEnabled","Behavior","MaximumQuantity","isServiceItem","ItemTypeValue","eoqQuantity","app","platform","enableDefaultOrderQuantityLimits","MultipleOfQuantity","errorMessage","_getErrorMessage","currentQuantity","lineIndex","finalErrorMessage","includeErrors","outOfStockText","outOfRangeOneText","outOfRangeFormatText","replace","toString","eoqErrorMessage","cartlinesErrors","filter","i","LineIndex","forEach","_i$DataValidationFail","_i$DataValidationFail2","_i$DataValidationFail3","DataValidationFailure","ErrorResourceId","ErrorContext","join","Quantity","payload","getPayloadObject","TelemetryEvent","RemoveFromCart","telemetryContent","attributes","getTelemetryAttributes","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","toLowerCase","data","error","React","CartLineItemComponent","cartLine","isOutOfStock","productUrl","getProductUrlSync","actionContext","key","isQuantityEditable","quantityOnChange","updateCartLinesQuantitySuccessHandler","primaryImageUrl","PrimaryImageUrl","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","cartState","status","showShippingChargesForLineItems","pickUpInStore","PickUpInStore","shipitText","shipItText","pickUpInStoreText","pickitUpText","changeStoreText","storeSelectorStateManager","orgUnitLocations","deliveryOptions","pickupDeliveryModeCode","locationChangedHandler","remove","Button","Object","assign","className","onClick","event","title","addToWishlist","AddToWishlistComponent","LineId","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","quantity","telemetry","CartLineItems","_toggleBOPIS","isBopisSelected","openDialog","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","onLocationSelected","async","orgUnitLocation","deliveryMode","updateCartLinePickupLocation","cartLineId","location","then","result","catch","Promise","resolve","_onLocationChangedCallback","DeliveryMode","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","retailMulitplePickupFeatureState","channelDeliveryOptionConfig","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","delivery","pickup","deliveryCode","Code","ArrayExtensions","hasElements","PickupDeliveryModeCodes","option","callbacks","toggleBopis","defaultComponent","_renderShippingMethod","pickupInStoretext","orgUnitName","bopisSelected","toggleBOPIS","type","name","onChange","value","checked","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","Description","ContainerProps","productPickUpOptions","_product$Dimensions","addToOrderTemplateButtonTooltip","hsoConfig","availableQuantityInStock","_getCartItemAvailableQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","shouldSkipStockCheck","ReleasedProductType","Service","IsInvoiceLine","estimatedDateProperty","ExtensionProperties","property","Key","estimatedDateValue","Value","StringValue","estimatedDate","StockThresholdprop","StockThresholdpropval","IntegerValue","StockThreshold","onhand","Number","ObjectExtensions","isNullOrUndefined","lineId","_props$productAvailab","finalErrorMessages","shouldIgnoreWarehouse","InventLocationId","WarehouseId","checkForErrors","ValidationResultsPairs","errorsFoundByLineId","ValidationFailures","validation","onRemoveClickHandler","onRemoveClickFunction","isCustomPriceSelected","Dimensions","dimension","DimensionTypeValue","DimensionValue","MsDyn365","isBrowser","isChannelTypeB2B","requestContext","_cartline$CatalogId","fullUrl","URL","window","href","searchParams","set","CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","hasError","catalogs","ariaRole","classnames","shouldShowButtonFailedTooltip","disableButton","config","disableTooltip","assembleCartlines","getProductByProductIdAndWarehouse","getProductByProductId","_productAvailability$2","_productAvailability$3","_cartline$WarehouseId","toUpperCase","CartLineGroupItems","hasInvoiceLine","_assembleGroupInvoiceCartlines","cartLines","carLineViewProps","_assembleGroupCartlines","getGroupByStorePickup","items","groupBy","item","groupDelivery","cartLinesGroup","entries","_ref","deliveryType","groupByDeliveryType","keys","getPromotionData","ctx","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","apiSettings","promotionOptions","exception","Cart","constructor","super","_isMounted","promotionPopupId","promotionLinkClick","this","setState","showPromotionDialog","state","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","removeItemFromCartHandler","cartlineToRemove","cart","input","cartLineIds","removeCartLines","validateCart","warning","debug","updateCartlineQuantity","cartlineToUpdate","cartLineQuantityUpdatedAsync","cartActionResult","message","_cartActionResult$err","lineUpdateFailure","validationResults","LocalizedMessage","errorDetails","fulfillmentStoreIdUpdated","getActiveCartProductsAction","ActiveCartProductsInput","getTelemetryObject","telemetryPageName","friendlyName","payLoad","bind","isCartValid","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","CartLines","reaction","_this$props$data$cart2","_this$props$data$cart3","ProductPickUpOptionsForCartLineItems","getPickUpOptionsForCartLineItems","componentWillUnmount","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$r","_cart$cart$CartLines","_this$props$data$prod","_this$props$data$feat","signInUrl","guestCheckoutUrl","getUrlSync","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","emailDeliveryModeCode","channel","EmailDeliveryModeCode","HSOConfigprop","channelConfiguration","HSOConfig","validInventoryAcrossCartLines","productAvailabilities","cartLineMap","Map","enableStockCheck","isValid","productIdWithErrors","IsGiftCardLine","has","_cartLineMap$get","_cartLine$Quantity2","cartLineTotal","get","delete","_cartLine$Quantity","productAvailabilityMap","Array","from","_cartLineMap$get2","cartLineQty","availableQuantity","line","cartLineProduct","isStockedItem","_cartLineProduct$Beha","IsStockedProduct","isEmailDelivery","shouldSkipInventoryCheck","validateCartLinesInventory","_isCheckoutBlockedDueToUnavailableFunds","some","RetailMultiplePickupFeatureState","featureState","multiplePickUpEnabled","IsEnabled","getCartLinesGroup","contentAction","etext","TelemetryConstant","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","viewProps","_objectSpread","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","disabled","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","slots","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","checkoutBlockedDueToUnavailableFunds","checkoutBlockedDueToUnavailableFundsTitle","checkoutBlockedDueToUnavailableFundsMessage","storeSelector","waitingComponent","Waiting","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","renderView","_this$props$data$cart4","_cart$cart","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","promotionStringHeading","promotionSeeAllLink","tabIndex","role","promotionDialog","Modal","isOpen","toggle","ModalHeader","ModalBody","_promotion","_promotion$Promotion","Promotion","OfferName","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithError","element","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","Wrapper","tag","Alert","color","assertive","outOfStockErrorMessageHeader","header","errors","isOboRequest","_this$props$data$cust","customerInfo","AllowOnAccountPayment","CreditLimit","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_this$props","_featureState$result","_this$props$context$r2","retailMultiplePickUpOptionEnabled","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","otherCharges","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","priceFree","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","freePriceText","originalPriceText","currentPriceText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","_this$props$data$feat2","_this$props$data$cata","PickupDeliveryModeCode","modules","storeSelectorId","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","warehouseAggregation","sizeString","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","amountString","productDimensionTypeAmount","quantityDisplayString","quantityDisplayText","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","discountStringText","shippingChargesText","shippingCharges","salesAgreementPricePrompt","priceEditorResources","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","urlCheck","returnURL","origin","includes","validateCartAsync","AsyncResult","_this$props$context","defaultOrderQuantityLimitsFeatureConfig","_featureStatuses$find","featureStatuses","IsB2b","_this$props$data$feat3","_this$props$data$chan","_this$props$data$cata2","_this$props$data$chan2","_this$props$data$cart5","productDimensionTypeSize","cartLinesPickUpOptions","__decorate","observer","_renderCartlines","cartEmptyText","_cartLine$cartlineId","Node","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","groupTitle","StringExtensions","isNullOrEmpty","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","_props$cart","_props$cart2","errorData","renderModuleAttributes","_props$context$action","emailshippingText","emptyCartText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","giftCard","loyalty","_renderOrderSummarylines","orderSummaryLines","subtotal","shipping","otherCharge","tax","totalDiscounts","Logo","_renderLogo","link","destinationUrl","_renderImage","defaultImageSettings","Msdyn365","image","loadFailureBehavior","editProps","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","isExpanded","targetId","HeaderPreferredStore","Header","handleLinkTextChange","linkIndex","myAccountLinks","linkText","target","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","displayName","_this$props$data$acco","customer","accountInformation","FirstName","accountEmailAddress","_this$props$data$acco2","Email","componentDidMount","addEventListener","_stickyHeaderSetup","removeEventListener","_logoSlot$","cartLabel","headerClassName","navbarKey","cartIconSlot","_getSlot","menuBarSlot","searchSlot","siteOptionsSlot","preferredStoreSlot","categoryMenuBarSlot","customNavBarSlot","countryPickerSlot","logoSlot","logoImage","logoLink","imageLink","logo","wishListIconDesktop","WishListIconComponent","wishlistTooltipText","wishListIconMobile","cartIcon","CartIconComponent","navIcon","menuBar","search","siteOptions","categoryMenuBar","customNavBar","countryPicker","HeaderTag","moduleProps","HeaderContainer","HeaderTopBarContainer","HeaderTopBarRightContainer","Divider","MobileMenuContainer","wrapClassName","MobileMenuHeader","MobileMenuBodyContainer","MobileMenuLinksContainer","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","placement","signInLink","_getSigninButton","signOutLink","_getSignOutButton","accountInfoDropdownButton","_getAccountInfoDropdownButton","accountLinks","_getAccountLinks","preferredStore","onscroll","_updateHeader","slotName","SignIn","signInLinkText","signInLinkAriaText","onTelemetryClick","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","MyProfile","innerRef","cta","editableLink","ariaLabel","linkUrl","openInNewTab","additionalProperties","onTextChange","_setHeader","e","keyCode","KeyCodes","Escape","lockHeader","headerElem","document","querySelector","headerAlertsContainer","bannerHeights","offsetHeight","documentElement","scrollTop","classList","add","body","contains","isInMobileMenu","stickyHeader","headerLogo","headerLeftActionItem","headerRightActionItem","navStickyPos","computed","_renderReactFragment","slot","Module","_renderDesktopAccountBlock","_renderMobileAccountBlock","getValidProductImages","channelId","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","mediaLocations","all","mediaLocation","validateMediaLocaionAsync","pairs","pair","_imageSettings$viewpo","imageData","src","Uri","altText","AltText","imageSettingsVal","imageConcatVal","http","XMLHttpRequest","open","onload","onerror","send","MediaGallery","_inlineZoomDivRef","defaultGalleryImageSettings","md","cropFocalRegion","defaultThumbnailImageSettings","onExiting","animating","onExited","next","isLastItem","nextIndex","activeIndex","goToIndex","previous","isFirstItem","mediaGalleryItems","_getCarouselItem","Image","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","which","Enter","Space","preventDefault","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","galleryImageSettings","carouselprops","Carousel","_renderCarouselItemImageView","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","handleOnExited","handleOnExiting","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","ImagefullView","isImageZoomed","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","source","imageSource","pageContext","curatedImage","images","thumbnailImageSettings","lastUpdate","Date","now","validateProductImages","isVertical","thumbnailsOrientation","vertical","allowFullscreen","allowFullScreen","zoomViewMode","imageZoom","inline","container","zoomView","CarouselProps","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperNextLabel","parentId","useTabList","_renderImageInContainerOnZoom","_renderImageInlineOnZoom","_renderImageFullScreenOnZoom","ref","divRef","dataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","inlineZoomImageOnHover","innerWidth","inlineZoomInit","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","fullScreenTitleText","parentDiv","children","removeAttribute","removeInlineZoomStyle","_renderThumbnails","thumbnails","_renderThumbnailItem","thumbnail","CartView","cittaTelemetry","CittaTelemetry","cittaInstrumentationKey","createLogMessage","decodeURI","logMessage","trace","_getImageSettings","_removeItemFromCartHandler","_validateCart","_moveToWishlistSuccessHandler","_updateCartlineQuantity","newQuantity","orderQuantityLimitsFeatureIsEnabled","updateCartLineQuantity","_fulfillmentStoreIdUpdated","_renderErrorBlock","_renderGIftCardError","freightCalculationText","orLabel","_goToPreviousPage","_renderBOPISBlock","_cartResult$cart","retry","arguments","cartResult","cartVersion","Version","_cartResult","validationResult","validateForCheckoutAsync","callerContext","Id","ValidationFailuresByCartLines","refreshCart","refreshError","validateError","history","back","shipToAddressDisplayText","pickUpAtStoreWithLocationText","_props$cartlines","hasGiftCard","arr","val","arrVal","_arrVal$data","ItemId","cartlinesLength","giftCardErrorMessage","_props$data$cart$resu","OrderSubTotal","NetPrice","subTotalHeadingLabel","PriceComponent","price","CustomerContextualPrice","_renderSubTotal","hideTaxLine","_props$data$cart$resu2","_props$data$cart$resu3","_props$data$cart$resu4","TotalAmount","_renderAmountDue","_renderUnder200sError","_props$data$cart$resu5","SubtotalAmount","market","oun","isB2BI","minimumOrder","discountLevel","LineDiscountGroup","isB2B","_props$data$cart$resu6","_props$data$cart$resu7","_props$data$cart$resu8","_props$data$cart$resu9","DiscountAmount","TaxAmount","_renderTax","_props$data$cart$resu10","_props$data$cart$resu11","_props$data$cart$resu12","amountDueLabel","_props$data$cart$resu13","DiscountAmountWithoutTax","totalSavings","_renderTotalSavings","CartIcon","_getCartLineQuantities","_createHiddenCartLines","_cart$CartLines","_cart$CartLines2","Price","style","display","JSON","stringify","countChanged","cartLink","cartItem","label","format","cartItemCount","_resetClass","hiddenCartLines","_timeout","ms","res","setTimeout","msdyn365Commerce","createComponent","component","HeaderView","_renderTopBarLeft","_renderTopBarRight","_renderAccountBlock","_renderCartIcon","_renderTopBarCenter","cittaLogo","totalItemsInCart","itemCount","parseInt","cartLabelNoItems","cartLabelWithOneItem","_renderCollapseMenu","Collapse","renderCustomerName","renderForMobile","accountClassName","Drawer","openGlyph","closeGlyph","glyphPlacement","toggleButtonText","propsContext","shouldRetry","_validationResult$Val","CartsDataActions","bypassCache","ValidationResultsByLineId","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","updateLineResult","warehouseId","targetWarehouseValue","InventoryLocationId","getMiniCartData","miniCartData","Error","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","getSortedCartLines","sortOrder","lines","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","CheckOut","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","_setQuantityLimitsFeatureFlag","componentDidUpdate","prevProps","_this$state$miniCartD","_this$state$miniCartD2","enableHoverCart","isAnonymousCheckout","cartUrl","_getCheckoutURL","shouldShowMiniCart","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","includeFlyout","goToCartButtonText","goToCartButtonTitle","flyoutTitle","flyoutTooltip","UncontrolledTooltip","hideArrow","trigger","displayMode","shouldShowCloseButton","cartPageUrl","hideAriaHidden","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","feature","cartQtyLabel","FlyoutContainer","miniCartWrapper","miniCartItemWrapper","goToCartButton","totalPrice","_cart$result$cart$Ver","_cart$result","lastValidatedCartVersion","FlyoutCartLineItems","cartLinesSortOrder","outOfStockThreshold","_featureStatuses$find2","storeLocation","_renderDeliveryLocation","deliverylocation","_foundProductDelivery","_renderStoreLocation","RemoveCartItem","removeCartItemAttribute","deliveryLocation","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","getCartState","response","ProductsDataActions","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","createObservableDataAction","action","inputData","_isChannelLimitsFeatureEnabled","isMultipleCatalogsFeatureEnabled","currentCatalogId","getCatalogId","validateCatalogId","isMultipleCatalogFeatureEnabledInHq","catalogId","_featureState$result2","isChannelLimitsFeatureEnabledInHq","_this$props$data$feat4","_featureState$result3","_context$request$chan","priceCurrency","Currency","isPickUpItem","isCartLineItemPickUpType","ErrorComponent","_this","_props$config$zoomedI","fullScreenOverlayButtonRef","player","mediaGalleryImages","updateZoomedInImage","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","MediaType","Video","current","play","_this$player$current2","pause","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","videoMetaData","videoId","duration","playTime","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","Player","playerData","isEditor","params","_renderEmptyImage","isInPopup","fallBackSrc","fallbackImage","shouldSkipToMainImage","bypassHideOnFailure","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","_renderVideoThumbnail","_zoomedImageSettings","keyboard","isDisabledFunctionality","isMobileImageZoomed","classNames","shouldUseCmsAltText","altTextSource","isInitialLoad","skipImageValidation","zoomedImageSettings","isMobile","variant","VariantType","Viewport","_this$props$config$im","shouldUpdateOnPartialDimensionSelection","_setRenderType","OmniChannelMedia","mediaLocationsForSelectedVariant","_this$props$config$th","_setImages","_this$props$config$th2","productVariant","_product$productVaria","_this$props$context$a","_this$props$config$th3","getProductImages","fireImmediately","_this$props$config$th4","_this$props$config$im2","_this$props$context$a2","isFullscreenAllowed","emptyPlaceHolderImage","placeholderImageName","getFallbackImageUrl","_this$props$config$im3","_mediaLocation$Uri","getAltText","curatedImages","_filterMasterImageFromVariant","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","indicatorAriaText","ariaLabelForSlide","_this$state$mediaGall","defaultKey","_getEmptyThumbnailItem","_this$state$mediaGall2","mediaToSet","getVideoMetadataFromApi","media","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","MasterProductId","itemId","_item$additionalPrope","isApplicableForChildEntities","_this$props$config$da","defaultDataScale","_this$props$config$da2","String","_handleMobileViewZoomedImageClick","currentTarget","mobileZoomedInImageClassName","transform","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","scrollTo","_this$props$config$da4","inlineZoomInitClick","_this$props$config$da5","_product$PrimaryImage","_this$fullScreenOverl","focus","removeContainerZoomStyle","productName","imageAltText","_context$app","validateMediaLocationAsync","IsApplicableForChildEntities","_unused","selectedProduct","_actionContext$reques","isPreview","commerceApiRequest","previewImageData","displayOrder","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","commerceVideoMetadataRequest"],"sourceRoot":""}