{"version":3,"file":"static/js/0f1b7da297431255f6bc.bundle.js","mappings":"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","sources":["webpack://msdyn365.commerce.online/./src/actions/get-on-account-guest-checkout-state.ts?1a00","webpack://msdyn365.commerce.online/./src/common/utils/helper.tsx?25b9","webpack://msdyn365.commerce.online/./src/modules/c-cart-icon/c-cart-icon.props.autogenerated.ts?e2d2","webpack://msdyn365.commerce.online/./src/modules/c-cart-icon/components/flyout-cart-line-items.tsx?f4b9","webpack://msdyn365.commerce.online/./src/modules/c-cart-icon/utils/get-products-in-mini-cart.ts?fbfe","webpack://msdyn365.commerce.online/./src/modules/c-cart-icon/c-cart-icon.tsx?f0dd","webpack://msdyn365.commerce.online/./src/modules/c-cart-icon/c-cart-icon.view.tsx?63c5","webpack://msdyn365.commerce.online/./lib/c-cart-icon/module-registration.js?cfd9","webpack://msdyn365.commerce.online/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://msdyn365.commerce.online/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://msdyn365.commerce.online/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4","webpack://msdyn365.commerce.online/external var \"React\"?0d3b","webpack://msdyn365.commerce.online/external var \"ReactDOM\"?853b"],"sourcesContent":["// on-account-guest-checkout-state.ts\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nexport interface IOnAccountGuestCheckoutState {\r\n appliedOnAccount: boolean;\r\n receiptEmail: string;\r\n rentOptIn: boolean;\r\n emailOptIn: boolean;\r\n}\r\n\r\n/**\r\n * OnAccountGuestCheckoutState - action input\r\n */\r\nexport class OnAccountGuestCheckoutStateInput implements IActionInput {\r\n public getCacheKey = () => `OnAccountGuestCheckoutState`;\r\n public getCacheObjectType = () => 'OnAccountGuestCheckoutState';\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n/**\r\n * OnAccountGuestCheckoutState - action\r\n */\r\nexport async function onAccountGuestCheckoutStateAction(\r\n input: OnAccountGuestCheckoutStateInput,\r\n ctx: IActionContext\r\n): Promise {\r\n return { appliedOnAccount: false, receiptEmail: '', rentOptIn: false, emailOptIn: false };\r\n}\r\n\r\n/**\r\n * OnAccountGuestCheckoutState - create new input for create action\r\n */\r\nconst createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new OnAccountGuestCheckoutStateInput();\r\n};\r\n\r\n/**\r\n * OnAccountGuestCheckoutState - create action\r\n */\r\nexport default createObservableDataAction({\r\n action: >onAccountGuestCheckoutStateAction,\r\n input: createInput\r\n});\r\n","/* eslint-disable security/detect-object-injection */\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport {\r\n AttributeValueBase,\r\n AttributeTextValue,\r\n CartLine,\r\n SimpleProduct,\r\n CustomerAttribute,\r\n AsyncResult,\r\n CommerceProperty\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ObjectExtensions,\r\n IDimensionForSelectedVariant,\r\n IDimensionValueForSelectedVariant\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ICartState } from '../../modules/c-checkout/mod/state-interfaces';\r\nimport { IOnAccountGuestCheckoutState, OnAccountGuestCheckoutStateInput } from '../../actions/get-on-account-guest-checkout-state';\r\n\r\n// Created Custom Interface for Cart Attributes\r\nexport interface ICartAttributes {\r\n attributeName: string;\r\n attributeValue: boolean | string;\r\n}\r\n\r\n// Set Customer Attribues\r\nexport const setCustomerAttribute = (attributeName: string, attributeValue: string): CustomerAttribute => {\r\n const privIdAttribute: CustomerAttribute = {\r\n Name: attributeName,\r\n KeyName: attributeName,\r\n ExtensionProperties: [],\r\n AttributeValue: {\r\n StringValue: attributeValue\r\n },\r\n NameTranslations: []\r\n };\r\n\r\n return privIdAttribute;\r\n};\r\n\r\n// Find Customer Attributes if exist update it other wise push\r\nexport const findCustomerAttribute = async (\r\n currentAttributes: CustomerAttribute[],\r\n attributeObj: CustomerAttribute\r\n): Promise => {\r\n const attributeIndex = currentAttributes.findIndex(\r\n (attribute: CustomerAttribute) => attribute.Name?.toLowerCase() === attributeObj.Name?.toLowerCase()\r\n );\r\n if (attributeIndex > -1) {\r\n currentAttributes[attributeIndex] = attributeObj;\r\n } else {\r\n currentAttributes.push(attributeObj);\r\n }\r\n\r\n return currentAttributes;\r\n};\r\n\r\n// Set Order and Cart Attribues\r\nexport const setNameAttribute = (attributeName: string, attributeValue: string): AttributeValueBase => {\r\n const privIdAttribute = {\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: attributeName,\r\n ExtensionProperties: [],\r\n TextValue: attributeValue,\r\n TextValueTranslations: []\r\n };\r\n\r\n return privIdAttribute as AttributeTextValue;\r\n};\r\n\r\n// Find attribute if exist update it other wise push\r\n\r\nexport const findAttribute = async (\r\n currentAttributes: AttributeTextValue[],\r\n attributeObj: AttributeTextValue\r\n): Promise => {\r\n const attributeIndex = currentAttributes.findIndex(\r\n (attribute: AttributeTextValue) => attribute.Name?.toLowerCase() === attributeObj.Name?.toLowerCase()\r\n );\r\n\r\n if (attributeIndex > -1) {\r\n currentAttributes[attributeIndex] = attributeObj;\r\n } else {\r\n currentAttributes.push(attributeObj);\r\n }\r\n\r\n return currentAttributes;\r\n};\r\n\r\n// Set Extension Properties\r\nexport const setExtensionProperties = (attributeName: string, attributeValue: string | boolean | number): CommerceProperty => {\r\n const privIdExtensionProperty: CommerceProperty = {\r\n Key: attributeName\r\n };\r\n if (typeof attributeValue === 'string') {\r\n privIdExtensionProperty.Value = {\r\n StringValue: attributeValue\r\n };\r\n } else if (typeof attributeValue === 'boolean') {\r\n privIdExtensionProperty.Value = {\r\n BooleanValue: attributeValue\r\n };\r\n }\r\n\r\n return privIdExtensionProperty;\r\n};\r\n\r\n// Find Extension Properties if exist update it other wise push\r\nexport const findExtensionProperty = async (\r\n currentProperties: CommerceProperty[],\r\n attributeObj: CommerceProperty\r\n): Promise => {\r\n const propertyIndex = currentProperties.findIndex(\r\n (property: CommerceProperty) => property.Key?.toLowerCase() === attributeObj.Key?.toLowerCase()\r\n );\r\n\r\n if (propertyIndex > -1) {\r\n currentProperties[propertyIndex] = attributeObj;\r\n } else {\r\n currentProperties.push(attributeObj);\r\n }\r\n\r\n return currentProperties;\r\n};\r\n\r\n// Find Extension Properties if exist update it other wise push\r\nexport const findToRemoveExtensionProperty = async (\r\n currentProperties: CommerceProperty[],\r\n attributeObj: CommerceProperty\r\n): Promise => {\r\n const propertyIndex = currentProperties.findIndex(\r\n (property: CommerceProperty) => property.Key?.toLowerCase() === attributeObj.Key?.toLowerCase()\r\n );\r\n\r\n if (propertyIndex > -1) {\r\n currentProperties.splice(propertyIndex, 1);\r\n }\r\n\r\n return currentProperties;\r\n};\r\n\r\nexport const getNBFlagForCartLine = (cartline: CartLine): boolean | undefined => {\r\n const NBFlag: AttributeTextValue | undefined = cartline.AttributeValues?.find(attr => attr.Name === 'NonBackOrderableFlag');\r\n if (NBFlag && NBFlag.TextValue) {\r\n const value = JSON.parse(NBFlag.TextValue);\r\n return value;\r\n }\r\n return;\r\n};\r\n\r\n// ITS - Customization to get dimension value for selected product\r\nexport const getDiemnsionValueForSelectedProduct = (\r\n productDimensions: IDimensionForSelectedVariant[],\r\n product: SimpleProduct\r\n): IDimensionValueForSelectedVariant | undefined => {\r\n const dimensions = (productDimensions[0].dimensionValuesWithInventory ??\r\n productDimensions[0].DimensionValues ??\r\n []) as IDimensionValueForSelectedVariant[];\r\n let dimension = dimensions.find(\r\n value =>\r\n !ObjectExtensions.isNullOrUndefined(value.DimensionValue?.RecordId ?? value.RecordId) &&\r\n value.ProductIds &&\r\n value.ProductIds.find(prod => prod === product.RecordId)\r\n );\r\n dimension = dimension && dimension.DimensionValue;\r\n return dimension;\r\n};\r\n\r\nexport const getNBFlagFromProductDimensions = (\r\n productDimensions: IDimensionForSelectedVariant[],\r\n product: SimpleProduct\r\n): boolean | undefined => {\r\n const dimension = getDiemnsionValueForSelectedProduct(productDimensions, product);\r\n const NBFlag =\r\n dimension &&\r\n dimension.ExtensionProperties &&\r\n dimension.ExtensionProperties[0] &&\r\n dimension.ExtensionProperties[0].Key === 'NonBackOrderableFlag'\r\n ? dimension.ExtensionProperties[0].Value?.BooleanValue\r\n : false;\r\n return NBFlag;\r\n};\r\n// ITS - Customization End\r\n\r\n// ITS Customization\r\n// export const updateCartAttributes = async (checkoutCart: ICartState, attributeName: string, attributeValue: string) => {\r\n// const newCart = {...checkoutCart.cart};\r\n// const newAttribute = setNameAttribute(attributeName, attributeValue);\r\n// let currentAttributes: AttributeValueBase[] = newCart?.AttributeValues || [];\r\n// currentAttributes = await findAttribute(currentAttributes, newAttribute);\r\n// newCart.AttributeValues = currentAttributes; // Updates cart with Attribute Values\r\n// updateCart(checkoutCart, newCart);\r\n// // await checkoutCart.updateAttributeValues({ newAttributeValues: newCart.AttributeValues })\r\n// };\r\n\r\nexport const updateCartExtensionProperties = async (\r\n checkoutCart: ICartState,\r\n attributeName: string,\r\n attributeValue: string,\r\n context?: ICoreContext\r\n) => {\r\n const newCart = { ...checkoutCart.cart };\r\n const newProperty = setExtensionProperties(attributeName, attributeValue);\r\n let currentExtensionProperties: CommerceProperty[] = newCart?.ExtensionProperties || [];\r\n currentExtensionProperties = await findExtensionProperty(currentExtensionProperties, newProperty);\r\n newCart.ExtensionProperties = currentExtensionProperties; // Updates cart with Extension Properties\r\n // newCart.ExtensionProperties && await updateAsync({callerContext: context?.actionContext!}, newCart);\r\n newCart.ExtensionProperties && (await checkoutCart.updateExtensionProperties({ newExtensionProperties: newCart.ExtensionProperties }));\r\n};\r\n\r\nexport const removeCartExtensionProperties = async (checkoutCart: ICartState, attributeName: string, context?: ICoreContext) => {\r\n const newCart = { ...checkoutCart.cart };\r\n const currentExtensionProperties: CommerceProperty[] = newCart?.ExtensionProperties || [];\r\n const newExtensionProperties = currentExtensionProperties.filter(\r\n (property: CommerceProperty) => property.Key?.toLowerCase() !== attributeName.toLowerCase()\r\n );\r\n newCart.ExtensionProperties = newExtensionProperties; // Updates cart with Extension Properties\r\n console.log(newCart.ExtensionProperties, newExtensionProperties);\r\n newCart.ExtensionProperties && (await updateAsync({ callerContext: context?.actionContext! }, newCart));\r\n // newCart.ExtensionProperties && await checkoutCart.updateExtensionProperties({ newExtensionProperties: newCart.ExtensionProperties });\r\n};\r\n\r\nexport const updateCartProperties = async (checkoutCart: ICartState, attributesArr: ICartAttributes[]) => {\r\n const newCart = { ...checkoutCart.cart };\r\n let currentExtensionProperties: CommerceProperty[] = newCart?.ExtensionProperties || [];\r\n await (async function() {\r\n for (const attr of attributesArr) {\r\n const newProperty = setExtensionProperties(attr.attributeName, attr.attributeValue);\r\n currentExtensionProperties = await findExtensionProperty(currentExtensionProperties, newProperty);\r\n }\r\n })();\r\n newCart.ExtensionProperties = [...currentExtensionProperties]; // Updates cart with Extension Properties\r\n newCart.ExtensionProperties && (await checkoutCart.updateExtensionProperties({ newExtensionProperties: newCart.ExtensionProperties }));\r\n};\r\n// ITS Customization\r\n// export const updateCartAttributes = async (checkoutCart: ICartState, attributesArr: ICartAttributes[]) => {\r\n// const newCart = {...checkoutCart.cart};\r\n// let currentAttributes: AttributeValueBase[] = newCart?.AttributeValues || [];\r\n// await (async function() {\r\n// for (const attr of attributesArr) {\r\n// const newAttribute = setNameAttribute(attr.attributeName, attr.attributeValue);\r\n// currentAttributes = await findAttribute(currentAttributes, newAttribute);\r\n// newCart.AttributeValues = currentAttributes; // Updates cart with Attribute Values\r\n// console.log('newCart Attrbiutes::::', newCart.AttributeValues, ' with the attribuite::::', attr);\r\n// }\r\n// })();\r\n// newCart.AttributeValues && await checkoutCart.updateAttributeValues({ newAttributeValues: newCart.AttributeValues });\r\n// console.log('newCart Attrbiutes::::', newCart.AttributeValues);\r\n// };\r\n\r\nexport const updateContext = (context: ICoreContext>, key: string, attributeValue: boolean | string) => {\r\n const input = new OnAccountGuestCheckoutStateInput();\r\n const value = context.actionContext.get(input.getCacheObjectType(), input.getCacheKey()) as AsyncResult;\r\n context.actionContext.update(input, { ...value.result, [key]: attributeValue });\r\n};\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * ICCartIcon containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum cartLinesSortOrder {\r\n ascending = 'ascending',\r\n descending = 'descending'\r\n}\r\n\r\nexport interface ICCartIconConfig extends Msdyn365.IModuleConfig {\r\n imageSettings?: Msdyn365.IImageSettings;\r\n enableHoverCart?: boolean;\r\n cartLinesSortOrder?: cartLinesSortOrder;\r\n isAnonymousCheckout?: boolean;\r\n freeShippingThreshold?: number;\r\n freeShippingThresholdShowUS?: boolean;\r\n freeShippingThresholdShowUK?: boolean;\r\n freeShippingThresholdShowDE?: boolean;\r\n freeShippingThresholdQualifyText?: string;\r\n freeShippingThresholdNotQualifyText?: string;\r\n saveBtnURL?: string;\r\n}\r\n\r\nexport interface ICCartIconResources {\r\n goToCartButtonTitle: string;\r\n totalPriceFormatString: string;\r\n guestCheckoutButtonTitle: string;\r\n checkoutButtonTitle: string;\r\n productDimensionTypeColor: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n productDimensionTypeConfiguration: string;\r\n quantityDisplayText: string;\r\n removeCartButtonText: string;\r\n cartLabel: string;\r\n cartQtyLabel: string;\r\n flyoutTitle: string;\r\n saveBagText: string;\r\n}\r\n\r\nexport interface ICCartIconProps extends Msdyn365.IModule {\r\n resources: ICCartIconResources;\r\n config: ICCartIconConfig;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, ChannelDeliveryOptionConfiguration, OrgUnitLocation, ProductAvailableQuantity, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\nimport { getNBFlagForCartLine } from '../../../common/utils/helper';\r\n\r\nexport interface IFlyoutCartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n\r\n /**\r\n * GridSettings for the product image in cartline\r\n */\r\n gridSettings: IGridSettings;\r\n\r\n /**\r\n * ImageSettings for the product image in cartline\r\n */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n maxCartlineQuantity: number;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n disableStockCheckInAppForBackorderableProducts: boolean,\r\n telemetryContent?: ITelemetryContent;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\nexport interface IFlyoutCartLineItemViewProps {\r\n cartline: React.ReactNode;\r\n remove: React.ReactNode;\r\n storeLocation: React.ReactNode;\r\n hasError: boolean;\r\n\r\n data: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (isStockCheckEnabled: boolean, outOfStockThreshold: number, disableStockCheckInAppForBackorderableProducts: boolean, cartline: CartLine, maxCartlineQuantity: number, productAvailability?: ProductAvailableQuantity): number => {\r\n if (isStockCheckEnabled) {\r\n if(disableStockCheckInAppForBackorderableProducts && cartline) {\r\n const NBFlag: boolean | undefined = getNBFlagForCartLine(cartline);\r\n if(!NBFlag) {\r\n if (!productAvailability || !productAvailability.AvailableQuantity || productAvailability.AvailableQuantity <= 0 || productAvailability.AvailableQuantity <= outOfStockThreshold) {\r\n return maxCartlineQuantity;\r\n } else {\r\n return productAvailability.AvailableQuantity - outOfStockThreshold;\r\n }\r\n }\r\n }\r\n if (!productAvailability || !productAvailability.AvailableQuantity || productAvailability.AvailableQuantity <= 0 || productAvailability.AvailableQuantity <= outOfStockThreshold) {\r\n return 0;\r\n }\r\n return productAvailability.AvailableQuantity - outOfStockThreshold;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxQuantityByConfig: number,\r\n isStockCheckEnabled: boolean,\r\n availableQuantityInStock: number,\r\n isQuantityLimitsFeatureEnabled: boolean,\r\n maxByQuantityLimitsFeature: number) => {\r\n if (isQuantityLimitsFeatureEnabled) {\r\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\r\n // and consider available qty if stock check enabled and max from config in site settings.\r\n if (!maxByQuantityLimitsFeature) {\r\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n }\r\n\r\n return isStockCheckEnabled ? (maxByQuantityLimitsFeatureResult < availableQuantityInStock ? maxByQuantityLimitsFeatureResult : availableQuantityInStock) : maxByQuantityLimitsFeatureResult;\r\n }\r\n if (isStockCheckEnabled) {\r\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\r\n }\r\n return maxQuantityByConfig;\r\n\r\n};\r\n\r\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n removeItemClickHandler(cartline);\r\n};\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: IFlyoutCartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: ProductAvailableQuantity,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions\r\n): IFlyoutCartLineItemViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler } = props;\r\n\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, props.outOfStockThreshold, props.disableStockCheckInAppForBackorderableProducts, cartline, props.maxCartlineQuantity, foundProductAvailability);\r\n const maxQuantity = product && _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 // Check if the product is service or not by product type\r\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\r\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n hasError: (!isServiceItem && props.isStockCheckEnabled) ? cartline.Quantity! > maxQuantity : false,\r\n cartline: (\r\n ),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n storeLocation: (\r\n _renderStoreLocation(cartline, props)\r\n )\r\n };\r\n};\r\n\r\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\r\n if (cartLine && cartLine.FulfillmentStoreId) {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\r\n\r\n if (orgUnitName) {\r\n return (\r\n
\r\n \r\n {orgUnitName}\r\n \r\n
\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n }\r\n return fulfillmentStoreId;\r\n\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: IFlyoutCartLineItemsProps): IFlyoutCartLineItemViewProps[] | null => {\r\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n let product;\r\n if (props.isQuantityLimitsFeatureEnabled) {\r\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n // to check productId and WarehouseId for identification.\r\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n } else {\r\n product = getProductByProductId(cartline.ProductId, products);\r\n }\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability?.ProductAvailableQuantity, 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 FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return (\r\n _assembleCartlines(cartlines, products, props)\r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ActiveCartProductsInput, getActiveCartProductsAction, getAvailabilitiesForCartLineItems, getDeliveryOptionsForCartLineItems, IProductInventoryInformation, ProductAvailabilitiesForCartLineItems, ProductDeliveryOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IMiniCartData entity interface.\r\n */\r\nexport interface IMiniCartData {\r\n products?: SimpleProduct[];\r\n productAvailabilites?: IProductInventoryInformation[];\r\n deliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\nexport const createInput = () => {\r\n return new ActiveCartProductsInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a mini cart data.\r\n * @param ctx\r\n * @param cartState\r\n */\r\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise {\r\n const miniCartData: IMiniCartData = {};\r\n\r\n const cart = cartState.cart;\r\n\r\n // If there are cart lines, make call to get products\r\n // If there are invocie linese, then there is no products, so don't make call to get products\r\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\r\n await getActiveCartProductsAction(\r\n new ActiveCartProductsInput(),\r\n ctx\r\n )\r\n .then(products => {\r\n if (products) {\r\n miniCartData.products = products;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n await getAvailabilitiesForCartLineItems(\r\n new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings),\r\n ctx\r\n )\r\n .then(availableQuantity => {\r\n if (availableQuantity) {\r\n miniCartData.productAvailabilites = availableQuantity;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n await getDeliveryOptionsForCartLineItems(\r\n new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings),\r\n ctx\r\n )\r\n .then(deliveryOptions => {\r\n if (deliveryOptions) {\r\n miniCartData.deliveryOptions = deliveryOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n }\r\n\r\n return miniCartData;\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { CartLine, ChannelDeliveryOptionConfiguration, LineDataValidationFailure, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, getTelemetryObject, INodeProps,\r\n ITelemetryContent, TelemetryConstant, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\n\r\nimport { ICCartIconData } from './c-cart-icon.data';\r\nimport { cartLinesSortOrder, ICCartIconProps } from './c-cart-icon.props.autogenerated';\r\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\r\n\r\nexport interface IMiniCartState {\r\n miniCartData: IMiniCartData;\r\n orgUnitLocations?: OrgUnitLocation[];\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n isCartValid: boolean;\r\n}\r\n\r\nexport interface ICartIconViewProps extends ICCartIconProps {\r\n className: string;\r\n cartIcon: React.ReactNode;\r\n FlyoutContainer?: INodeProps;\r\n CartlinesWrapper: INodeProps;\r\n miniCartWrapper: INodeProps;\r\n miniCartItemWrapper: INodeProps;\r\n cartlines?: IFlyoutCartLineItemViewProps[];\r\n flyoutTitle: React.ReactNode;\r\n totalPrice: React.ReactNode;\r\n checkoutAsGuestButton?: React.ReactNode;\r\n checkoutAsSignInUserButton?: React.ReactNode;\r\n goToCartButton?: React.ReactNode;\r\n waitingComponent?: React.ReactNode;\r\n isCartLoading: boolean;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass CartIcon extends React.Component, IMiniCartState> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly checkoutBySignInAttributes: IDictionary | undefined;\r\n\r\n private readonly checkoutByGuestAttributes: IDictionary | undefined;\r\n\r\n private readonly viewShoppingBagAttributes: IDictionary | undefined;\r\n\r\n private retailMultiplePickUpOptionEnabled?: boolean = false;\r\n\r\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n private lastValidatedCartVersion: number | undefined;\r\n\r\n constructor(props: ICCartIconProps) {\r\n super(props);\r\n this.state = {\r\n miniCartData: {},\r\n isCartValid: true,\r\n isQuantityLimitsFeatureEnabled: false\r\n };\r\n this.telemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!, this.props.friendlyName, this.props.telemetry);\r\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\r\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n\r\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n\r\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\r\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const context = this.props.context.actionContext;\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n this.setState({\r\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\r\n });\r\n }\r\n );\r\n\r\n this.setState({\r\n orgUnitLocations: this.props.data.orgUnitLocations?.result\r\n });\r\n await this._setOrderQuantityLimitsFeatureFlag();\r\n this._validateCart();\r\n }\r\n\r\n public componentDidUpdate(prevProps: ICCartIconProps): void {\r\n this._validateCart();\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ICCartIconProps,\r\n nextState: IMiniCartState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n config: {\r\n enableHoverCart,\r\n isAnonymousCheckout\r\n },\r\n context: {\r\n request: {\r\n user: {\r\n isAuthenticated,\r\n signInUrl\r\n }\r\n }\r\n },\r\n context,\r\n resources\r\n } = this.props;\r\n\r\n const cart = this.props.data.cart && this.props.data.cart.result || undefined;\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart = cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n const hasInvoiceLine = cart?.hasInvoiceLine;\r\n const cartLines = this._getCartLines();\r\n const hasError = !this.state.isCartValid || (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\r\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\r\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\r\n const flyoutTitle = resources.flyoutTitle;\r\n const flyoutTooltip = {\r\n tag: UncontrolledTooltip,\r\n shouldShowMiniCart,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__flyout-container',\r\n trigger: 'hover',\r\n displayMode: 'FLYOUT',\r\n target: id,\r\n shouldShowCloseButton: true,\r\n cartPageUrl: cartUrl\r\n };\r\n\r\n // If there are invoice lines, don't update mini cart price\r\n const price = cart && !cart.hasInvoiceLine && cart.cart.TotalAmount || undefined;\r\n const priceString = price ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price)) : '';\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\r\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result\r\n ?.find(feature => feature.Name === multiplePickupStoreSwitchName)?.IsEnabled;\r\n\r\n const viewProps = {\r\n ...this.props,\r\n cartIcon: (\r\n \r\n ),\r\n cartlines: cartLines,\r\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\r\n CartlinesWrapper: {\r\n className: 'ms-cart-icon__cart-lines'\r\n },\r\n miniCartWrapper: {\r\n className: classnames('ms-cart-icon'),\r\n id: this.props.id\r\n },\r\n miniCartItemWrapper: {\r\n className: classnames('msc-cart-lines-item')\r\n },\r\n\r\n // If there are invoice lines, don't update mini cart checkout button\r\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\r\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\r\n checkoutAsSignInUserButton: (!isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated)) ? (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n ) : null,\r\n checkoutAsGuestButton: (isAnonymousCheckout && !isCartEmpty && !isAuthenticated) ? (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n ) : null,\r\n goToCartButton:\r\n (\r\n \r\n {goToCartButtonText}\r\n \r\n ),\r\n flyoutTitle:\r\n (\r\n \r\n {flyoutTitle}\r\n \r\n ),\r\n totalPrice:\r\n (\r\n
\r\n {priceString}\r\n
\r\n )\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _validateCart(): void {\r\n const {\r\n data: { cart }\r\n } = this.props;\r\n const cartVersion = cart.result?.cart?.Version ?? undefined;\r\n if (this.lastValidatedCartVersion === cartVersion) {\r\n return;\r\n }\r\n\r\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\r\n validateCartAsync(this.state.isQuantityLimitsFeatureEnabled, cart, this.props.telemetry, this.props.context)\r\n .then((result: LineDataValidationFailure[] | undefined) => {\r\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result) });\r\n })\r\n .catch(() => {\r\n this.setState({ isCartValid: false });\r\n });\r\n }\r\n\r\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n // eslint-disable-next-line security/detect-unsafe-regex\r\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n const isAbsoluteUrl = absoluteUrlRegExp.test(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n /**\r\n * Sort cartline items.\r\n * @param cartlines - Cartlines to be sorted.\r\n * @param sortOrder - Ascending or descending.\r\n * @returns - Sorted cartlines.\r\n */\r\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\r\n const lines: CartLine[] = [...cartlines];\r\n const zero: number = 0;\r\n\r\n if (sortOrder === cartLinesSortOrder.descending) {\r\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\r\n }\r\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\r\n };\r\n\r\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\r\n const {\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n // ,\r\n // app: {\r\n // config: {\r\n // enableStockCheck,\r\n // disableStockCheckInAppForBackorderableProducts,\r\n // maxQuantityForCartLineItem\r\n // }\r\n // }\r\n },\r\n config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n const cart = this.props.data.cart && this.props.data.cart.result;\r\n // let productAvailabilites = this.state.miniCartData.productAvailabilites;\r\n\r\n // if(enableStockCheck && disableStockCheckInAppForBackorderableProducts) {\r\n // productAvailabilites = maxQuantityForCartLineItem\r\n // }\r\n\r\n // Cart-icon could be placed in each page\r\n // so we check cart content to reduce number of RS calls\r\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ?\r\n (\r\n FlyoutCartLineItems({\r\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\r\n products: this.state.miniCartData.products,\r\n productAvailabilites: this.state.miniCartData.productAvailabilites,\r\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\r\n imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n disableStockCheckInAppForBackorderableProducts: this.props.context.app.config.disableStockCheckInAppForBackorderableProducts,\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: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: '', // Not used\r\n discountStringText: '', // Not used\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: ''\r\n },\r\n telemetry,\r\n removeButtonText: resources.removeCartButtonText,\r\n outOfStockText: '', // Not used\r\n outOfRangeOneText: '', // Not used\r\n outOfRangeFormatText: '', // Not used\r\n cartState: cart,\r\n orgUnitLocations: this.state.orgUnitLocations,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n telemetryContent: this.telemetryContent,\r\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\r\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled\r\n })\r\n ) : null;\r\n }\r\n\r\n private readonly _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 readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\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 async _setOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq = featureStatuses\r\n .find(featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature')?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\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 this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n this.setState({ isQuantityLimitsFeatureEnabled: true });\r\n } else {\r\n this.props.data.customerInformation\r\n .then(customerInfo => {\r\n const result = !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\r\n this.setState({ isQuantityLimitsFeatureEnabled: result });\r\n }).catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport default CartIcon;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\n// import { getUrlSync } from '@msdyn365-commerce/core-internal';\r\nimport * as React from 'react';\r\n\r\nimport { ICartIconViewProps } from './c-cart-icon';\r\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\n\r\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\r\n if (!cartLines) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n \r\n {cartLine.cartline}\r\n {cartLine.storeLocation}\r\n {cartLine.remove}\r\n \r\n );\r\n });\r\n};\r\n\r\nconst loginUrlFunction = (props: ICartIconViewProps): React.ReactNode | undefined => {\r\n //const loginUrl = getUrlSync('sign-in', props.context.actionContext) || '';\r\n return (\r\n \r\n {props.resources.saveBagText}\r\n \r\n ); //custom-work\r\n};\r\nconst shippingMessages = (props: ICartIconViewProps): React.ReactNode | undefined => {\r\n if (\r\n props.config.freeShippingThresholdShowUS === true ||\r\n props.config.freeShippingThresholdShowUK === true ||\r\n props.config.freeShippingThresholdShowDE === true\r\n ) {\r\n let away;\r\n const cart = (props.data.cart && props.data.cart.result) || undefined;\r\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\r\n const limit = props.config.freeShippingThreshold || 0;\r\n if (price) {\r\n away = limit - price;\r\n if (away <= 0) {\r\n return
{props.config.freeShippingThresholdQualifyText}
;\r\n } else {\r\n const priceString: string | undefined = away\r\n ? props?.config?.freeShippingThresholdNotQualifyText?.replace(\r\n '{away}',\r\n props.context.cultureFormatter.formatCurrency(away)\r\n )\r\n : '';\r\n return
{priceString}
;\r\n }\r\n } else {\r\n return;\r\n }\r\n } else {\r\n return;\r\n }\r\n};\r\n\r\nconst CartIconView: React.FC = (props: ICartIconViewProps) => (\r\n \r\n {props.cartIcon}\r\n {props.FlyoutContainer ? (\r\n \r\n
\r\n
{props.flyoutTitle}
\r\n
\r\n {_renderCartlines(props.cartlines, props)}\r\n
{props.totalPrice}
\r\n
\r\n {props.goToCartButton}\r\n {loginUrlFunction(props)}\r\n
\r\n
{props.checkoutAsSignInUserButton}
\r\n
{shippingMessages(props)}
\r\n
\r\n ) : (\r\n false\r\n )}\r\n
\r\n);\r\n\r\nexport default CartIconView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['c-cart-icon'] = {\n c: () => require('partner/modules/c-cart-icon/c-cart-icon.tsx'),\n $type: 'containerModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action', runOn: 1},{name:'channelDeliveryOptionConfig', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration', runOn: 0},{name:'customerInformation', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'orgUnitLocations', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'c-cart-icon',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/c-cart-icon'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|c-cart-icon|c-cart-icon'] = {\n c: () => require('partner/modules/c-cart-icon/c-cart-icon.view.tsx'),\n cn: '__local__-__local__-c-cart-icon'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\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 { CartLine, ChannelDeliveryOptionConfiguration, LineDataValidationFailure, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n UncontrolledTooltip\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\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\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations?.result\n });\n await this._setOrderQuantityLimitsFeatureFlag();\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 cartLines = this._getCartLines();\n const hasError = !this.state.isCartValid || (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 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 validateCartAsync(this.state.isQuantityLimitsFeatureEnabled, cart, this.props.telemetry, this.props.context)\n .then((result: LineDataValidationFailure[] | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const absoluteUrlRegExp = new RegExp('^(?:[a-z]+:)?//', 'i');\n const isAbsoluteUrl = absoluteUrlRegExp.test(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: 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 })\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 _setOrderQuantityLimitsFeatureFlag(): Promise {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result =\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n }\n}\n\nexport default CartIcon;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry } 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 { 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\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) {\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","module.exports = React;","module.exports = ReactDOM;"],"names":["OnAccountGuestCheckoutStateInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","async","onAccountGuestCheckoutStateAction","input","ctx","appliedOnAccount","receiptEmail","rentOptIn","emailOptIn","createObservableDataAction","action","inputData","setNameAttribute","attributeName","attributeValue","Name","ExtensionProperties","TextValue","TextValueTranslations","findAttribute","currentAttributes","attributeObj","attributeIndex","findIndex","attribute","toLowerCase","push","setExtensionProperties","privIdExtensionProperty","Key","Value","StringValue","BooleanValue","findExtensionProperty","currentProperties","propertyIndex","property","getNBFlagForCartLine","cartline","NBFlag","AttributeValues","find","attr","JSON","parse","getDiemnsionValueForSelectedProduct","productDimensions","product","dimension","dimensionValuesWithInventory","DimensionValues","value","ObjectExtensions","isNullOrUndefined","DimensionValue","RecordId","ProductIds","prod","getNBFlagFromProductDimensions","updateCartExtensionProperties","checkoutCart","context","newCart","cart","newProperty","currentExtensionProperties","updateExtensionProperties","newExtensionProperties","removeCartExtensionProperties","filter","console","log","updateAsync","callerContext","actionContext","updateCartProperties","attributesArr","updateContext","key","get","update","result","cartLinesSortOrder","_assembleNode","props","index","foundProductAvailability","foundProductDeliveryOptions","imageSettings","gridSettings","id","typeName","resources","removeButtonText","removeItemClickHandler","availableQuantityInStock","isStockCheckEnabled","outOfStockThreshold","disableStockCheckInAppForBackorderableProducts","maxCartlineQuantity","productAvailability","AvailableQuantity","_getCartItemAvailableQuantity","maxQuantity","maxQuantityByConfig","isQuantityLimitsFeatureEnabled","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","_getCartItemMaxQuantity","Behavior","MaximumQuantity","isServiceItem","ItemTypeValue","ReleasedProductType","Service","onRemoveClickHandler","onRemoveClickFunction","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","RemoveCartItem","removeCartItemAttribute","getTelemetryAttributes","data","hasError","Quantity","React","CartLineItemComponent","cartLine","currentQuantity","isOutOfStock","productUrl","getProductUrlSync","undefined","isQuantityEditable","primaryImageUrl","PrimaryImageUrl","displayMode","channelDeliveryOptionConfig","remove","Button","className","onClick","title","storeLocation","_renderStoreLocation","FulfillmentStoreId","orgUnitName","_getOrgUnitName","orgUnitLocations","fulfillmentStoreId","length","foundLocation","orgUnitLocation","OrgUnitNumber","OrgUnitName","FlyoutCartLineItems","products","cartlines","reactNodes","map","foundProductDeliveryOption","getProductByProductIdAndWarehouse","ProductId","WarehouseId","cartState","getProductByProductId","productAvailabilites","ProductAvailableQuantity","productDeliveryOptions","deliveryOption","telemetry","error","_assembleCartlines","getMiniCartData","miniCartData","CartLines","hasInvoiceLine","getActiveCartProductsAction","ActiveCartProductsInput","then","catch","exception","Error","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","requestContext","apiSettings","availableQuantity","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","deliveryOptions","CartIcon","super","retailMultiplePickUpOptionEnabled","getSortedCartLines","sortOrder","lines","descending","sort","item1","item2","LineNumber","_getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","_removeItemFromCartHandler","cartlineToRemove","this","cartLineIds","LineId","toString","removeCartLines","warning","debug","state","isCartValid","getTelemetryObject","request","telemetryPageName","friendlyName","payload","TelemetryEvent","CheckOut","Checkout","checkoutBySignInAttributes","contentAction","etext","GuestCheckout","checkoutByGuestAttributes","ViewShoppingBag","viewShoppingBagAttributes","reaction","setState","_setOrderQuantityLimitsFeatureFlag","_validateCart","componentDidUpdate","prevProps","shouldComponentUpdate","nextProps","nextState","render","config","enableHoverCart","isAnonymousCheckout","user","isAuthenticated","signInUrl","guestCheckoutUrl","getUrlSync","cartUrl","checkoutURL","_getCheckoutURL","isCartEmpty","shouldShowMiniCart","isProductAddedToCart","app","addToCartBehavior","AddToCartBehavior","showMiniCart","cartLines","_getCartLines","some","includeFlyout","status","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","replace","flyoutTitle","flyoutTooltip","tag","UncontrolledTooltip","placement","hideArrow","trigger","target","shouldShowCloseButton","cartPageUrl","price","TotalAmount","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","featureState","feature","IsEnabled","viewProps","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","CartlinesWrapper","miniCartWrapper","classnames","miniCartItemWrapper","checkoutAsSignInUserButton","disabled","href","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","goToCartButton","totalPrice","renderView","cartVersion","Version","lastValidatedCartVersion","validateCartAsync","ArrayExtensions","hasElements","isAbsoluteUrl","RegExp","test","returnURL","msdyn365Commerce","isBrowser","window","location","origin","includes","channel","PickupDeliveryModeCode","enableStockCheck","maxQuantityForCartLineItem","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","quantityDisplayString","quantityDisplayText","inputQuantityAriaLabel","discountStringText","originalPriceText","currentPriceText","shippingChargesText","removeCartButtonText","outOfStockText","outOfRangeOneText","outOfRangeFormatText","pickupDeliveryModeCode","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","featureStatuses","customerInformation","customerInfo","IsB2b","observer","Node","renderModuleAttributes","_renderCartlines","saveBtnURL","saveBagText","loginUrlFunction","freeShippingThresholdShowUS","freeShippingThresholdShowUK","freeShippingThresholdShowDE","away","limit","freeShippingThreshold","freeShippingThresholdQualifyText","freeShippingThresholdNotQualifyText","shippingMessages","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","md","__bindings__","viewDictionary","cn","hideAriaHidden","salesAgreementPricePrompt","shippingText","_renderDeliveryLocation","deliverylocation","delivery","DeliveryOptions","option","Code","DeliveryMode","Description","MsDyn365","fullUrl","URL","searchParams","set","CatalogId","deliveryLocation","module","exports","ReactDOM"],"sourceRoot":""}