{"version":3,"file":"static/js/9a28ba2c272d860551ce.bundle.js","mappings":"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","sources":["webpack://Dobbies.Commerce/./src/modules/dobbies-cart/components/dobbies-cart-pick-up-in-store.tsx?3ea1","webpack://Dobbies.Commerce/./src/modules/dobbies-cart/components/dobbies-cart-line-items.tsx?9baa","webpack://Dobbies.Commerce/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://Dobbies.Commerce/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://Dobbies.Commerce/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\n//import { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n AttributeValue,\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 productAttributes?: AttributeValue[];\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 const onlyInStoreVal = props.productAttributes?.find(a => a.Name?.toLowerCase() === 'onlyinstore');\r\n const isOnlyInStore = onlyInStoreVal?.TextValue?.toLowerCase() === 'yes';\r\n if (isOnlyInStore) {\r\n return (\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 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 // customization- remove code to get the change store item on cart page\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\r\n if (\r\n !props.deliveryOptions ||\r\n !props.deliveryOptions.DeliveryOptions ||\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, { IAny, ICoreContext, IGeneric, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n AsyncResult,\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n CommerceList,\r\n Customer,\r\n LineDataValidationFailure,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ProductCatalog,\r\n ProductDimensionType,\r\n ProductSearchResult,\r\n ReleasedProductType\r\n} 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 './dobbies-cart-pick-up-in-store';\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 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 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 productsWithAttributes?: AsyncResult;\r\n productAvailability?: AsyncResult;\r\n //productPickUpOptions?: ProductDeliveryOptions[] | undefined;\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\nexport const _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 lineIndex: number,\r\n shouldSkipStockCheck: boolean,\r\n cartLine: CartLine\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 if (props.cartlinesErrors && props.cartlinesErrors.length && Array.isArray(props.cartlinesErrors)) {\r\n props.cartlinesErrors\r\n .filter(i => i.LineIndex === lineIndex)\r\n .forEach(i => {\r\n if (i.DataValidationFailure?.LocalizedMessage ?? i.DataValidationFailure?.ErrorResourceId) {\r\n finalErrorMessages.push(i.DataValidationFailure?.LocalizedMessage ?? i.DataValidationFailure?.ErrorResourceId ?? '');\r\n }\r\n });\r\n }\r\n\r\n if (finalErrorMessages.length > 0) {\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 } = 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\r\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\r\n ? undefined\r\n : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, index, shouldSkipStockCheck, cartline);\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) {\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 const productWithAtts = props.productsWithAttributes?.result?.find(p => p.RecordId === product?.RecordId);\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 productAttributes: productWithAtts?.AttributeValues,\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 if (cartline.DeliveryMode === '') {\r\n cartline.WarehouseId = 'ECOM';\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.productDeliveryOptions !== undefined && props.productDeliveryOptions.length > 0) {\r\n productPickUpOptions = props.productDeliveryOptions.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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ActiveCartProductsInput,\n getActiveCartProductsAction,\n getAvailabilitiesForCartLineItems,\n getDeliveryOptionsForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n ProductDeliveryOptionsForCartLineItems\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CartLineValidationResultsByLineId,\n OrgUnitLocation\n} from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n UncontrolledTooltip,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n isQuantityLimitsFeatureEnabled: boolean;\n isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps {\n className: string;\n cartIcon: React.ReactNode;\n FlyoutContainer?: INodeProps;\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n isCartLoading: boolean;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass CartIcon extends React.Component, IMiniCartState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly checkoutBySignInAttributes: IDictionary | undefined;\n\n private readonly checkoutByGuestAttributes: IDictionary | undefined;\n\n private readonly viewShoppingBagAttributes: IDictionary | undefined;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private lastValidatedCartVersion: number | undefined;\n\n constructor(props: ICartIconProps) {\n super(props);\n this.state = {\n miniCartData: {},\n isCartValid: true,\n isQuantityLimitsFeatureEnabled: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n await this._setQuantityLimitsFeatureFlag();\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations?.result\n });\n\n this._validateCart();\n }\n\n public componentDidUpdate(prevProps: ICartIconProps): void {\n this._validateCart();\n }\n\n public shouldComponentUpdate(nextProps: ICartIconProps, nextState: IMiniCartState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: { enableHoverCart, isAnonymousCheckout },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n const hasInvoiceLine = cart?.hasInvoiceLine;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const cartLines = this._getCartLines();\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.state.miniCartData.productAvailabilites ?? [],\n this.props.context.actionContext,\n this.state.miniCartData.products ?? [],\n emailDeliveryModeCode\n );\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n const flyoutTitle = resources.flyoutTitle;\n const flyoutTooltip = {\n tag: UncontrolledTooltip,\n shouldShowMiniCart,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover',\n displayMode: 'FLYOUT',\n target: id,\n shouldShowCloseButton: true,\n cartPageUrl: cartUrl,\n hideAriaHidden: true\n };\n\n // If there are invoice lines, don't update mini cart price\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\n const priceString = price\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\n : '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n cartIcon: (\n \n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n\n // If there are invoice lines, don't update mini cart checkout button\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n checkoutAsSignInUserButton:\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n goToCartButton: (\n \n {goToCartButtonText}\n \n ),\n checkoutBlockedDueToUnavailableFunds: null,\n flyoutTitle: {flyoutTitle},\n totalPrice:
{priceString}
\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _validateCart(): void {\n const {\n data: { cart }\n } = this.props;\n const cartVersion = cart.result?.cart?.Version ?? undefined;\n if (this.lastValidatedCartVersion === cartVersion) {\n return;\n }\n\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n\n if (this.state.isQuantityLimitsFeatureEnabled) {\n validateCartAsync(cart, this.props.telemetry, this.props.context)\n .then((result: CartLineValidationResultsByLineId | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\n } else {\n this.setState({ isCartValid: true });\n }\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Sort cartline items.\n * @param cartlines - Cartlines to be sorted.\n * @param sortOrder - Ascending or descending.\n * @returns - Sorted cartlines.\n */\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n const lines: CartLine[] = [...cartlines];\n const zero: number = 0;\n\n if (sortOrder === cartLinesSortOrder.descending) {\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n }\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n };\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n // Cart-icon could be placed in each page\n // so we check cart content to reduce number of RS calls\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\n ? FlyoutCartLineItems({\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n quantityDisplayString: resources.quantityDisplayText,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n inputQuantityAriaLabel: '', // Not used\n discountStringText: '', // Not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: '',\n shippingText: resources.shippingText\n },\n telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // Not used\n outOfRangeOneText: '', // Not used\n outOfRangeFormatText: '', // Not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\n catalogs: this.props.data.catalogs?.result\n })\n : null;\n }\n\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input).catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n private async _setQuantityLimitsFeatureFlag(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n return;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result =\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n this.setState({ isQuantityLimitsFeatureEnabled: !(cartConfiguration?.IgnoreOrderSettings ?? false) });\n return;\n }\n }\n}\n\nexport default CartIcon;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n ProductAvailableQuantity,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n\n /**\n * GridSettings for the product image in cartline\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartline\n */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isQuantityLimitsFeatureEnabled: boolean;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n outOfStockThreshold: number,\n productAvailability?: ProductAvailableQuantity\n): number => {\n if (isStockCheckEnabled) {\n if (\n !productAvailability ||\n !productAvailability.AvailableQuantity ||\n productAvailability.AvailableQuantity <= 0 ||\n productAvailability.AvailableQuantity <= outOfStockThreshold\n ) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return 0;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props: IFlyoutCartLineItemsProps,\n index: number,\n foundProductAvailability?: ProductAvailableQuantity,\n foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\n\n const availableQuantityInStock = _getCartItemAvailableQuantity(\n props.isStockCheckEnabled,\n props.outOfStockThreshold,\n foundProductAvailability\n );\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Check if the product is service or not by product type\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return {\n data: {\n product,\n cartline\n },\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n \n ),\n remove: (\n \n {removeButtonText}\n \n ),\n storeLocation: _renderStoreLocation(cartline, props)\n };\n};\n\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\n let deliverylocation;\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\n });\n }\n const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\n const location = delivery?.Description;\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n if (location) {\n deliverylocation = `${location}, ${orgUnitName}`;\n } else {\n deliverylocation = `${orgUnitName}`;\n }\n } else {\n deliverylocation = props.resources.shippingText;\n }\n return deliverylocation;\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if (orgUnitName) {\n return (\n
\n {orgUnitName}\n
\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n};\n\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps\n): IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\n\n if (!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if (product) {\n reactNodes.push(\n _assembleNode(\n cartline,\n product,\n props,\n index,\n foundProductAvailability?.ProductAvailableQuantity,\n foundProductDeliveryOption\n )\n );\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return _assembleCartlines(cartlines, products, props);\n};\n"],"names":["PickUpInStore","props","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","product","cartline","cartState","storeSelectorModuleId","openDialog","id","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","deliveryOptions","onLocationSelected","async","orgUnitLocation","deliveryMode","updateCartLinePickupLocation","cartLineId","LineId","location","then","result","status","locationChangedHandler","catch","error","Promise","resolve","_onLocationChangedCallback","DeliveryMode","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","length","foundLocation","find","OrgUnitName","DeliveryOptions","pickupDeliveryModeCode","option","Code","callbacks","toggleBopis","defaultComponent","_renderShippingMethod","cartLine","shipItText","pickupInStoretext","changeStoreText","_props$productAttribu","_onlyInStoreVal$TextV","orgUnitName","bopisSelected","toggleBOPIS","onlyInStoreVal","productAttributes","a","_a$Name","Name","toLowerCase","TextValue","React","className","type","name","onChange","value","checked","key","onClick","shipitText","pickUpInStoreText","deliveryOption","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","delivery","Description","ContainerProps","_getCartItemMaxQuantity","maxQuantityByConfig","isStockCheckEnabled","availableQuantityInStock","isQuantityLimitsFeatureEnabled","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","_assembleNode","index","foundProductAvailability","productPickUpOptions","_product$Behavior","_foundProductAvailabi","_product$Dimensions","_props$productsWithAt","_props$cartState","imageSettings","gridSettings","typeName","context","resources","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","customerInformation","wishlists","defaultWishlistName","isAuthenticated","request","user","nameOfWishlist","productAvailability","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","_getCartItemAvailableQuantity","maxQuantity","maxCartlineQuantity","Behavior","MaximumQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","IsInvoiceLine","errorMessage","ObjectExtensions","isNullOrUndefined","undefined","_getErrorMessage","currentQuantity","lineIndex","_props$productAvailab","finalErrorMessages","productAvailabilites","ArrayExtensions","hasElements","shouldIgnoreWarehouse","ProductId","InventLocationId","WarehouseId","includeErrors","push","outOfStockText","outOfRangeOneText","outOfRangeFormatText","replace","toString","cartlinesErrors","Array","isArray","filter","i","LineIndex","forEach","_i$DataValidationFail","_i$DataValidationFail2","_i$DataValidationFail3","_ref","_i$DataValidationFail4","_i$DataValidationFail5","_i$DataValidationFail6","DataValidationFailure","LocalizedMessage","ErrorResourceId","join","Quantity","onRemoveClickHandler","onRemoveClickFunction","payload","getPayloadObject","TelemetryEvent","RemoveFromCart","telemetryContent","attributes","getTelemetryAttributes","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","isCustomPriceSelected","Dimensions","dimension","DimensionTypeValue","DimensionValue","Value","productUrl","getProductUrlSync","actionContext","MsDyn365","isBrowser","_cartline$CatalogId","fullUrl","URL","window","href","searchParams","set","CatalogId","getInvoiceDetailsPageUrlSync","productWithAtts","productsWithAttributes","p","RecordId","data","cartlineId","hasError","CartLineItemComponent","catalogs","isOutOfStock","isQuantityEditable","quantityOnChange","updateCartLinesQuantitySuccessHandler","primaryImageUrl","PrimaryImageUrl","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","showShippingChargesForLineItems","channelDeliveryOptionConfig","pickUpInStore","pickitUpText","AttributeValues","remove","Button","Object","assign","title","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","classnames","quantity","shouldShowButtonFailedTooltip","disableButton","app","config","disableTooltip","assembleCartlines","cartlines","products","reactNodes","map","getProductByProductIdAndWarehouse","getProductByProductId","_productAvailability$2","_productAvailability$3","_cartline$WarehouseId","_productAvailability$","toUpperCase","productDeliveryOptions","CartLineItems","getMiniCartData","ctx","miniCartData","cart","CartLines","hasInvoiceLine","getActiveCartProductsAction","ActiveCartProductsInput","telemetry","exception","Error","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","requestContext","apiSettings","availableQuantity","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","CartIcon","constructor","super","retailMultiplePickUpOptionEnabled","getSortedCartLines","sortOrder","lines","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","_getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","_removeItemFromCartHandler","cartlineToRemove","this","input","cartLineIds","removeCartLines","warning","debug","state","isCartValid","getTelemetryObject","telemetryPageName","friendlyName","CheckOut","TelemetryConstant","Checkout","checkoutBySignInAttributes","contentAction","etext","GuestCheckout","checkoutByGuestAttributes","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","reaction","_this$props$data$cart","setState","_setQuantityLimitsFeatureFlag","_validateCart","componentDidUpdate","prevProps","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$r","_cart$cart$CartLines","_this$state$miniCartD","_this$state$miniCartD2","_this$props$data$chan","_this$props$data$feat","enableHoverCart","isAnonymousCheckout","signInUrl","guestCheckoutUrl","getUrlSync","cartUrl","checkoutURL","_getCheckoutURL","isCartEmpty","shouldShowMiniCart","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","emailDeliveryModeCode","channel","EmailDeliveryModeCode","cartLines","_getCartLines","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","some","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","flyoutTitle","flyoutTooltip","tag","UncontrolledTooltip","placement","hideArrow","trigger","displayMode","target","shouldShowCloseButton","cartPageUrl","hideAriaHidden","price","TotalAmount","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","featureState","feature","IsEnabled","viewProps","_objectSpread","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","CartlinesWrapper","miniCartWrapper","miniCartItemWrapper","checkoutAsSignInUserButton","disabled","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","goToCartButton","checkoutBlockedDueToUnavailableFunds","totalPrice","renderView","_cart$result$cart$Ver","_cart$result","cartVersion","Version","lastValidatedCartVersion","validateCartAsync","ValidationResultsPairs","isAbsoluteUrl","urlCheck","returnURL","msdyn365Commerce","origin","includes","_this$props$data$cata","PickupDeliveryModeCode","FlyoutCartLineItems","cartLinesSortOrder","outOfStockThreshold","enableStockCheck","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","quantityDisplayString","quantityDisplayText","salesAgreementPricePrompt","inputQuantityAriaLabel","discountStringText","originalPriceText","currentPriceText","shippingChargesText","shippingText","removeCartButtonText","_featureStatuses$find","_featureStatuses$find2","featureStatuses","_this$props$context","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","_featureStatuses$find3","customerInfo","IsB2b","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","__decorate","observer","_renderDeliveryLocation","deliverylocation","_foundProductDelivery","foundProductDeliveryOption","_renderStoreLocation","_assembleCartlines","foundProductDeliveryOptions","isServiceItem","payLoad","RemoveCartItem","removeCartItemAttribute","isChannelTypeB2B","deliveryLocation","storeLocation"],"sourceRoot":""}