{"version":3,"file":"static/js/131d7a454653d097566e.bundle.js","mappings":"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","sources":["webpack://united-malt/./src/themes/country-malt-group/views/cart-icon.view.tsx?c800","webpack://united-malt/./src/themes/cryer-malt/views/cart-icon.view.tsx?c35c","webpack://united-malt/./src/utilities/analytics/analytics-dispatcher.ts?75be","webpack://united-malt/./src/utilities/cart-attribute-helpers.ts?c7b6","webpack://united-malt/./src/utilities/data-attribute-parser.ts?7345","webpack://united-malt/./lib/cart-icon/module-registration.js?4d28","webpack://united-malt/./src/validate-cart.ts?cd50","webpack://united-malt/./src/Common/get-product.ts?0a21","webpack://united-malt/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4","webpack://united-malt/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://united-malt/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://united-malt/./src/modules/cart-icon/cart-icon.view.tsx?f9dd","webpack://united-malt/../../src/search-org-unit-locations.ts?d18d","webpack://united-malt/external var \"React\"?0d3b","webpack://united-malt/external var \"ReactDOM\"?853b"],"sourcesContent":["/*--------------------------------------------------------------\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\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartIconViewProps, IFlyoutCartLineItemViewProps } from '@msdyn365-commerce-modules/cart';\r\n\r\n//==========================================================\r\n// @CUSTOM: Imports custom customer info and cart info to\r\n// determine first time buyer and over limit or on hold\r\n// customer status\r\n//==========================================================\r\nimport { convertCustomerAttributes, convertProductAttributes } from '../../../utilities/data-attribute-parser';\r\nimport { CustomerStatus } from '../../../settings/app.settings';\r\nimport { addOverridesToCartState } from '../../../utilities/cart-attribute-helpers';\r\nimport { CartLine, AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { publish } from '../../../utilities/analytics/analytics-dispatcher';\r\nimport { RemoveFromCartEvent } from '../../../utilities/analytics/analytics-events';\r\n//==========================================================\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 {_modifyRemoveButton(cartLine.remove, cartLine.data.cartline, props) /* @CUSTOM */}\r\n \r\n );\r\n });\r\n};\r\n\r\n// @CUSTOM: wrap remove event with GA4 event\r\nconst _modifyRemoveButton = (button: any, cartLine: CartLine, props: ICartIconViewProps) => {\r\n\r\n if (typeof window !== 'undefined') {\r\n const originalHandler = button.props.onClick;\r\n\r\n button.props.onClick = () => {\r\n\r\n const formattedAttribs = {};\r\n const productAttributes = convertProductAttributes(cartLine.AttributeValues as AttributeValue[]);\r\n\r\n for (var key in productAttributes) {\r\n if (productAttributes[key]) {\r\n formattedAttribs[key] = productAttributes[key];\r\n }\r\n }\r\n\r\n // Emit a cart removal event\r\n const gaData: RemoveFromCartEvent = {\r\n itemID: cartLine.ItemId!,\r\n recordID: cartLine.ProductId!,\r\n variant: cartLine.ItemId!,\r\n name: '',\r\n quantity: cartLine.Quantity || 0,\r\n price: cartLine.Price || 0,\r\n discount: cartLine.DiscountAmount,\r\n currency: props.context.request.channel?.Currency || 'USD',\r\n unitOfMeasure: cartLine.UnitOfMeasureSymbol,\r\n attributes: formattedAttribs\r\n };\r\n\r\n publish('removeFromCart', gaData);\r\n\r\n // Call the original handler to actually remove the item from the cart\r\n originalHandler();\r\n };\r\n }\r\n //------------------------------------------------------\r\n\r\n return button;\r\n};\r\n\r\nconst CartIconView: React.FC = (props: ICartIconViewProps) => {\r\n //======================================================\r\n // @CUSTOM: Removes checkout button if customer status\r\n // is first time buyer and over limit or customer status\r\n // is on hold\r\n //======================================================\r\n const customerData = props.data.customerInformation.result;\r\n\r\n const customerAttributes = convertCustomerAttributes(customerData?.Attributes || []);\r\n const onBoardingStatus = customerAttributes.CusOnboardStatus;\r\n const cartTotal = props.data.cart.result?.cart.TotalAmount;\r\n const creditLimit = props.context.app.config.firstTimeLimit;\r\n const customerStatusIds = props.context.app.config.customerStatus as CustomerStatus;\r\n\r\n if (props.data.cart.result) {\r\n addOverridesToCartState(props.data.cart.result);\r\n }\r\n\r\n const isBlocked = !!customerData?.Blocked;\r\n let isOnHold = false;\r\n let isNewCust = false;\r\n\r\n if (onBoardingStatus === customerStatusIds.customerOnHoldId) {\r\n isOnHold = true;\r\n }\r\n\r\n if (onBoardingStatus === customerStatusIds.customerFirstTimeBuyerId && cartTotal && cartTotal > creditLimit) {\r\n isNewCust = true;\r\n }\r\n //======================================================\r\n\r\n return (\r\n \r\n {props.cartIcon}\r\n {props.FlyoutContainer ? (\r\n \r\n {props.flyoutTitle}\r\n \r\n {_renderCartlines(props.cartlines, props)}\r\n \r\n {props.totalPrice}\r\n\r\n {/* @CUSTOM: Remove checkout button based on customer status */}\r\n {!isBlocked && !isNewCust && !isOnHold && props.checkoutAsSignInUserButton}\r\n {/*----------------------------------------------------------*/}\r\n\r\n {/* @CUSTOM: Remove guest checkout */}\r\n\r\n {props.goToCartButton}\r\n \r\n ) : false }\r\n \r\n );\r\n};\r\n\r\nexport default CartIconView;\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\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartIconViewProps, IFlyoutCartLineItemViewProps } from '@msdyn365-commerce-modules/cart';\r\n\r\n//==========================================================\r\n// @CUSTOM: Imports custom customer info and cart info to\r\n// determine first time buyer and over limit or on hold\r\n// customer status\r\n//==========================================================\r\nimport { convertCustomerAttributes } from '../../../utilities/data-attribute-parser';\r\nimport { CustomerStatus } from '../../../settings/app.settings';\r\n//==========================================================\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 CartIconView: React.FC = (props: ICartIconViewProps) => {\r\n //======================================================\r\n // @CUSTOM: Removes checkout button if customer status\r\n // is first time buyer and over limit or customer status\r\n // is on hold\r\n //======================================================\r\n const customerData = props.data.customerInformation.result;\r\n\r\n const customerAttributes = convertCustomerAttributes(customerData?.Attributes || []);\r\n const onBoardingStatus = customerAttributes.CusOnboardStatus;\r\n const cartTotal = props.data.cart.result?.cart.TotalAmount;\r\n const creditLimit = props.context.app.config.firstTimeLimit;\r\n const customerStatusIds = props.context.app.config.customerStatus as CustomerStatus;\r\n\r\n const isBlocked = !!customerData?.Blocked;\r\n let isOnHold = false;\r\n let isNewCust = false;\r\n\r\n if (onBoardingStatus === customerStatusIds.customerOnHoldId) {\r\n isOnHold = true;\r\n }\r\n\r\n if (onBoardingStatus === customerStatusIds.customerFirstTimeBuyerId && cartTotal && cartTotal > creditLimit) {\r\n isNewCust = true;\r\n }\r\n //======================================================\r\n\r\n return (\r\n \r\n {props.cartIcon}\r\n {props.FlyoutContainer ? (\r\n \r\n {props.flyoutTitle}\r\n \r\n {_renderCartlines(props.cartlines, props)}\r\n \r\n {props.totalPrice}\r\n\r\n {/* @CUSTOM: Remove checkout button based on customer status */}\r\n {!isBlocked && !isNewCust && !isOnHold && props.checkoutAsSignInUserButton}\r\n {/*----------------------------------------------------------*/}\r\n\r\n {/* @CUSTOM: Remove guest checkout */}\r\n\r\n {props.goToCartButton}\r\n \r\n ) : false }\r\n \r\n );\r\n};\r\n\r\nexport default CartIconView;\r\n","//==============================================================================\r\n// Analytics Event Dispatcher (Simple Pub-Sub system)\r\n//\r\n// This module receives events and forwards them to the appropriate handlers\r\n// Subscriptions are managed using a subscriber ID to aid in unsubscribing\r\n//\r\n// NOTE: Singletons aren't compatible with SSR. This module acts as a singleton,\r\n// maintaining its data as a global. Modules MUST call subscribe on the client\r\n// ONLY (via componentDidMount).\r\n//\r\n// @TODO: Currently, only client-side events will be processed. Events generated\r\n// during server-side renders will be lost. If we move data to a data action\r\n// it can be persisted from server to client. That will allow us to queue up\r\n// events generated on the server or before subscriptions occur, and emit\r\n// them immediately upon subscription.\r\n//==============================================================================\r\nimport { EventHandler } from \"./analytics-events\";\r\n\r\n//==============================================================================\r\n// INTERFACES\r\n//==============================================================================\r\n\r\n// List of subscribers to a single event\r\ninterface EventSubscribers {\r\n [subscriber: string]: EventHandler;\r\n}\r\n\r\n//==============================================================================\r\n// GLOBALS\r\n//==============================================================================\r\n\r\n// List of subscriptions, organized by event name and then subscriber name\r\nconst subscriptions: { [eventName: string]: EventSubscribers } = {};\r\n\r\n//==============================================================================\r\n// FUNCTIONS\r\n//==============================================================================\r\n\r\n//==========================================================\r\n// Called by event emitters when an event occurs\r\n//\r\n// NOTE: This should only be called on the client! Events on\r\n// the server will be lost. They should instead be queued\r\n// via a data action cache.\r\n//==========================================================\r\nexport function publish(eventName: string, eventData: unknown): void {\r\n\r\n // Get the list of subscribers for this event\r\n const subscribers = Object.keys(subscriptions[eventName] || {});\r\n\r\n // Notify each subscriber\r\n subscribers.forEach(subscriber => subscriptions[eventName][subscriber](eventData));\r\n}\r\n\r\n//==========================================================\r\n// Called by event handlers when they self-register for events\r\n//==========================================================\r\nexport function subscribe(subscriber: string, eventName: string, handler: EventHandler): void {\r\n\r\n // If it's a new event, create an entry\r\n subscriptions[eventName] = subscriptions[eventName] || {};\r\n\r\n // Ensure this subscriber isn't already subscribed to this event\r\n if (subscriptions[eventName][subscriber]) {\r\n throw new Error(`Duplicate subscription request for ${subscriber}: ${eventName}`);\r\n }\r\n\r\n // Add the subscription\r\n subscriptions[eventName][subscriber] = handler;\r\n}\r\n\r\n//==========================================================\r\n// Unsubscribe from a single event\r\n//==========================================================\r\nexport function unsubscribe(subscriber: string, eventName: string): void {\r\n if (subscriptions[eventName] && subscriptions[eventName][subscriber]) {\r\n delete subscriptions[eventName][subscriber];\r\n }\r\n}\r\n","//==============================================================================\r\n// Tools to help read, write, and process cart header and line attributes\r\n//\r\n// There is currently no OOTB way to add attributes to cart lines when adding\r\n// products to the cart. We would have to add to the cart, then modify the\r\n// newly created line, using two separate retail server calls. Alternately,\r\n// low-level retail server calls could be used, followed by a cart refresh.\r\n// This optimizes the process by allowing a single call, even though the method\r\n// is not ideal.\r\n//==============================================================================\r\n\r\nimport { getCatalogId } from '@msdyn365-commerce/core';\r\nimport { CartLine, OrgUnitLocation, ReleasedProductType, SimpleProduct } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { ICartActionResult, ICartState, BaseCartState, addProductToCartInternal, addProductsToCartInternal } from '@msdyn365-commerce/global-state';\r\n\r\n//==============================================================================\r\n// INTERFACES\r\n//==============================================================================\r\n\r\nexport interface AddProductsToCartWithAttribs {\r\n product: SimpleProduct;\r\n count?: number;\r\n location?: OrgUnitLocation;\r\n additionalProperties?: object;\r\n availableQuantity?: number;\r\n enableStockCheck?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPrice?: number;\r\n shouldSkipSiteSettings?: boolean;\r\n catalogId?: number;\r\n deliveryMode?: string;\r\n retailMultiplePickupModeEnabled?: boolean;\r\n customAttributes?: {};\r\n}\r\n\r\nexport interface SalesOrderAttribute {\r\n '@odata.type': \"#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue\",\r\n Name: string,\r\n TextValue: string,\r\n TextValueTranslations: [],\r\n ExtensionProperties: []\r\n}\r\n\r\n// Custon Extension: Product extension property id for milling service\r\nconst millingServiceId = \"MILLSERVICE\";\r\n\r\n//==============================================================================\r\n// Public Functions\r\n//==============================================================================\r\n\r\n//==========================================================\r\n// This replaces base functionality with our extended version\r\n//\r\n// Old school extensions like this are rightly frowned upon.\r\n// Any other method would be preferred, but there doesn't\r\n// appear to be a reasonable option at this time.\r\n//==========================================================\r\nexport function addOverridesToCartState(cartState: ICartState) {\r\n const extendedState = cartState as CustomBaseCartState;\r\n if (!extendedState.wasInjected) {\r\n extendedState.wasInjected = true;\r\n\r\n extendedState.addProductsToCart = CustomBaseCartState.prototype.addProductsToCartWithAttribs;\r\n extendedState.addProductToCart = CustomBaseCartState.prototype.addProductToCartWithAttribs;\r\n extendedState.baseRemoveCartLines = extendedState.removeCartLines;\r\n extendedState.removeCartLines = CustomBaseCartState.prototype.removeCartLinesOverride;\r\n\r\n }\r\n}\r\n\r\n//==========================================================\r\n// format custom attributes into attribute value structure\r\n//==========================================================\r\nfunction formatCustomAttributes(attributes: {}): SalesOrderAttribute[] {\r\n const formattedAttribs: SalesOrderAttribute[] = [];\r\n\r\n for (var key in attributes) {\r\n if (attributes[key]) {\r\n formattedAttribs.push({\r\n \"@odata.type\": \"#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue\",\r\n \"Name\": key,\r\n \"TextValue\": attributes[key],\r\n \"TextValueTranslations\": [],\r\n \"ExtensionProperties\": []\r\n });\r\n }\r\n }\r\n\r\n return formattedAttribs;\r\n}\r\n\r\n//==============================================================================\r\n// BaseCartState Overrides\r\n//==============================================================================\r\n\r\n//==========================================================\r\n// This is a direct replacement for CartState.addProduct(s)ToCart\r\n// that accepts line-level attributes\r\n//\r\n// TODO: When upgrading to newer versions of the SSK, be sure\r\n// to update this function!\r\n//==========================================================\r\nclass CustomBaseCartState extends BaseCartState {\r\n public wasInjected = false;\r\n\r\n public baseRemoveCartLines = this.removeCartLines;\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public async addProductsToCartWithAttribs(input: {\r\n product: SimpleProduct;\r\n count?: number;\r\n location?: OrgUnitLocation;\r\n additionalProperties?: object;\r\n availableQuantity?: number;\r\n enableStockCheck?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPrice?: number;\r\n deliveryMode?: string;\r\n catalogId?: number;\r\n retailMultiplePickupModeEnabled?: boolean;\r\n customAttributes?: {}; // @CUSTOM line\r\n }[]): Promise {\r\n\r\n return this._doAsyncAction(async () => {\r\n const internalInput: {\r\n cartLineToAdd: CartLine;\r\n availableQuantity?: number;\r\n isStockCheckEnabled?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n }[] = [];\r\n\r\n for (const inputItem of input) {\r\n const attributeValues = inputItem.customAttributes && formatCustomAttributes(inputItem.customAttributes); // @CUSTOM line\r\n const cartLine: CartLine = {\r\n CatalogId: inputItem.catalogId ?? getCatalogId(this.actionContext.requestContext),\r\n Description: inputItem.product.Description,\r\n\r\n // TODO: Investigate this value and what it represents\r\n EntryMethodTypeValue: 3,\r\n ItemId: inputItem.product.ItemId,\r\n ProductId: inputItem.product.RecordId,\r\n Quantity: inputItem.count || 1,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: inputItem.product.DefaultUnitOfMeasure,\r\n IsPriceKeyedIn: inputItem.isPriceKeyedIn,\r\n IsGiftCardLine: inputItem.product.IsGiftCard,\r\n Price: inputItem.customPrice ? inputItem.customPrice : inputItem.product.Price,\r\n AttributeValues: attributeValues // @CUSTOM line\r\n };\r\n\r\n if (inputItem.location) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n // If curbside pick is not available use the default one\r\n if (inputItem.deliveryMode !== undefined) {\r\n cartLine.DeliveryMode = inputItem.deliveryMode;\r\n } else {\r\n cartLine.DeliveryMode = inputItem.retailMultiplePickupModeEnabled\r\n ? undefined\r\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode;\r\n }\r\n\r\n cartLine.FulfillmentStoreId = inputItem.location.OrgUnitNumber;\r\n cartLine.WarehouseId = inputItem.location.InventoryLocationId;\r\n // @ts-expect-error\r\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(inputItem.location);\r\n }\r\n\r\n if (inputItem.isAddEmailDeliveryItemToCart) {\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n }\r\n\r\n // Check if the product is service or not by product type\r\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\r\n const isAddServiceItemToCart = inputItem.product.ItemTypeValue === PRODUCTASSERVICE;\r\n\r\n internalInput.push({\r\n cartLineToAdd: cartLine,\r\n availableQuantity: inputItem.availableQuantity,\r\n isStockCheckEnabled: inputItem.enableStockCheck,\r\n isAddServiceItemToCart\r\n });\r\n }\r\n // @ts-expect-error\r\n return this._doCartOperationWithRetry(() => addProductsToCartInternal(this.cart, this.actionContext, internalInput));\r\n });\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public async addProductToCartWithAttribs(input: {\r\n product: SimpleProduct;\r\n count?: number;\r\n location?: OrgUnitLocation;\r\n additionalProperties?: object;\r\n availableQuantity?: number;\r\n enableStockCheck?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPrice?: number;\r\n deliveryMode?: string;\r\n shouldSkipSiteSettings?: boolean;\r\n catalogId?: number;\r\n retailMultiplePickupModeEnabled?: boolean;\r\n customAttributes?: {}; // @CUSTOM line\r\n }): Promise {\r\n\r\n return this._doAsyncAction(async () => {\r\n const attributeValues = input.customAttributes && formatCustomAttributes(input.customAttributes); // @CUSTOM line\r\n const cartLine: CartLine = {\r\n CatalogId: input.catalogId ?? getCatalogId(this.actionContext.requestContext),\r\n Description: input.product.Description,\r\n\r\n // TODO: Investigate this value and what it represents\r\n EntryMethodTypeValue: 3,\r\n ItemId: input.product.ItemId,\r\n ProductId: input.product.RecordId,\r\n Quantity: input.count || 1,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: input.product.DefaultUnitOfMeasure,\r\n IsPriceKeyedIn: input.isPriceKeyedIn,\r\n IsGiftCardLine: input.product.IsGiftCard,\r\n Price: input.customPrice ? input.customPrice : input.product.Price,\r\n AttributeValues: attributeValues // @CUSTOM line\r\n };\r\n\r\n if (input.location) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n // If curbside pick is not available use the default one\r\n if (input.deliveryMode !== undefined) {\r\n cartLine.DeliveryMode = input.deliveryMode;\r\n } else {\r\n cartLine.DeliveryMode = input.retailMultiplePickupModeEnabled\r\n ? undefined\r\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode;\r\n }\r\n\r\n cartLine.FulfillmentStoreId = input.location.OrgUnitNumber;\r\n cartLine.WarehouseId = input.location.InventoryLocationId;\r\n // @ts-expect-error\r\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(input.location);\r\n }\r\n\r\n if (input.isAddEmailDeliveryItemToCart) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.EmailDeliveryModeCode;\r\n }\r\n\r\n // Check if the product is service or not by product type\r\n const isAddServiceItemToCart = input.product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n // @ts-expect-error\r\n const orderQuantityLimitsFeatureIsEnabled: boolean = !!input.additionalProperties?.orderQuantityLimitsFeatureIsEnabled;\r\n const isMaxByQuantityValidationFeatureDefined: boolean = !!input.product.Behavior?.MaximumQuantity;\r\n\r\n // @ts-expect-error\r\n return this._doCartOperationWithRetry(() => addProductToCartInternal(\r\n this.cart,\r\n cartLine,\r\n this.actionContext,\r\n orderQuantityLimitsFeatureIsEnabled,\r\n input.availableQuantity,\r\n input.enableStockCheck,\r\n isAddServiceItemToCart,\r\n isMaxByQuantityValidationFeatureDefined,\r\n input.shouldSkipSiteSettings\r\n ));\r\n });\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public async removeCartLinesOverride(input: { cartLineIds: string[]}): Promise {\r\n\r\n // filter out milling service cart line as only allowed to be removed by CSU\r\n input.cartLineIds = input.cartLineIds.filter(id => {\r\n\r\n const itemToRemove = this.cart.CartLines?.find((line: CartLine) => {\r\n return line.LineId === id;\r\n });\r\n\r\n const isMillingGrade = itemToRemove?.ItemId === millingServiceId;\r\n\r\n return !isMillingGrade;\r\n\r\n });\r\n\r\n return this.baseRemoveCartLines(\r\n input\r\n );\r\n }\r\n}\r\n","//==============================================================================\r\n// D365 OData Attribute Parser\r\n//\r\n// In creating this, it became clear that \"attributes\" is a general term.\r\n//\r\n// Product attributes are a first-class entity. They have their own dedicated\r\n// fields and schema.\r\n//\r\n// The more generic term \"attributes\" is used as a generic extension system.\r\n// Almost every entity (including Product Attributes) has an ExtensionProperties\r\n// field for jamming extra information into. In some cases, D365 handles these\r\n// natively, such as sales order line and header attributes, or customer\r\n// attributes. Attributes using ExtensionProperties use the\r\n// CommerceProperty and CommercePropertyValue types.\r\n//\r\n// A major note about ExtensionProperty-based attributes: they have fields\r\n// for many different data types, but there's no indicator as to which\r\n// of the fields is actually used. The consumer of the data is expected to\r\n// know the data type ahead of time. In the case of D365-native attribute users\r\n// such as customers and sales orders, only the string type appears to work.\r\n//\r\n// This module includes parsers for generic ExtensionProperties-based attributes\r\n// and Product Attributes. Though different Product Attribute retail server\r\n// calls use the same AttributeValue entity to transmit the data, they appear\r\n// to return different fields from that entity. Because of this, two different\r\n// parser calls are included here. They currently share the same implementation,\r\n// but by including different call signatures we have the ability to diverge\r\n// the implementations if the need arises.\r\n//\r\n// A note about Product Attributes: These contain both a friendly name,\r\n// displayed to users in back office, and an internal name. The internal name\r\n// can be the same as the friendly name, but by convention we've been pushing\r\n// for a PascalCase scheme. At present, the searchByCriteria call returns only\r\n// the unfriendly name, and the GetAttributeValues call returns only the\r\n// friendly name. We don't have a known method of correlating the two. That may\r\n// be an argument for keeping the friendly and unfriendly names identical.\r\n//==============================================================================\r\nimport {\r\n CommerceProperty, // Generic attributes stored in ExtensionProperties\r\n CommercePropertyValue, // Generic attributes stored in AttributeValue\r\n AttributeValue, AttributeDataType, // Product attributes or Product Search Result attributes\r\n CustomerAttribute, // Customer attributes\r\n IDictionary,\r\n} from '@msdyn365-commerce/retail-proxy';\r\n\r\n//==============================================================================\r\n// INTERFACES AND CONSTANTS\r\n//==============================================================================\r\nexport type CommerceValueTypes = string | number | boolean | Date;\r\n\r\n// This is me giving up on proper typing. If doing this in TypeScript is possible, I don't know how.\r\n// For the key \"meta\", the type should be a hash of strings.\r\n// For all other keys, the type is a CommerceValueType.\r\nexport type AttributesWithMetadata = {\r\n [key: string]: CommerceValueTypes | IDictionary\r\n};\r\n\r\n// Type to support both internal and friendly name for attributes\r\nexport type AttributesLocalized = {\r\n [key: string]: {\r\n friendlyName?: string,\r\n value?: CommerceValueTypes | IDictionary\r\n }\r\n};\r\n\r\n// Return type for getTypeInfo()\r\ntype TypeData = {\r\n source: keyof AttributeValue,\r\n type: string,\r\n\r\n customerSource?: keyof CommercePropertyValue,\r\n};\r\n\r\n//==============================================================================\r\n// FUNCTIONS\r\n//==============================================================================\r\n\r\n//----------------------------------------------------------\r\n// This version handles ExtensionProperties conversion.\r\n//\r\n// While these have a bunch of potential fields, the value\r\n// is always stored within StringValue.\r\n// There isn't a data type field, so if the content wasn't\r\n// in StringValue we wouldn't know where to find it.\r\n//----------------------------------------------------------\r\nexport function convertExtensionProperties(attributeList: CommerceProperty[]): IDictionary {\r\n const output = {};\r\n\r\n attributeList.forEach(entry => {\r\n if (entry.Key) {\r\n output[entry.Key] = entry.Value?.StringValue; // Ecommerce seems to always use strings.\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// For these attributes, the Name is always the friendly\r\n// name.\r\n// KeyName and ExtensionProperties aren't defined.\r\n//\r\n// These results seem to be missing CurrencyValue,\r\n// FloatValue, DateTimeOffsetValue\r\n// I don't know if those data types aren't allowed here.\r\n//\r\n// Return value: Hash of key: property values with variable\r\n// types. There is also a \"meta\" key containing a hash of\r\n// all the attribute keys and their corresponding types.\r\n//\r\n// Example:\r\n// {\r\n// flavor: 'bland',\r\n// calories: 5300,\r\n// meta: {\r\n// flavor: 'string',\r\n// calories: 'number'\r\n// }\r\n// }\r\n//----------------------------------------------------------\r\nexport function convertProductAttributes(attributeList: AttributeValue[]): AttributesWithMetadata {\r\n const output = {\r\n meta: {}\r\n };\r\n\r\n attributeList.forEach(attribute => {\r\n // These should always be present, but TypeScript insists they can be undefined.\r\n if (attribute.Name && attribute.DataTypeValue) {\r\n const typeData = getTypeInfo(attribute.DataTypeValue);\r\n output[attribute.Name] = attribute[typeData.source]; // Ecommerce seems to require strings\r\n output.meta[attribute.Name] = typeData.type;\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// For these attributes, the\r\n// Name/KeyName/ExtensionProperties is always the unfriendly\r\n// name.\r\n//\r\n// These results are only missing the Swatches field.\r\n//\r\n// Though the returned value is a bit different, at present\r\n// the implementation for convertProductAttributes works for\r\n// search results.\r\n// If they diverge in the future, extend this function.\r\n//----------------------------------------------------------\r\nexport function convertSearchAttributes(attributeList: AttributeValue[]): AttributesWithMetadata {\r\n return convertProductAttributes(attributeList);\r\n}\r\n\r\n//----------------------------------------------------------\r\n// For these attributes, the Name is the friendly\r\n// name while KeyName is the internal name.\r\n//\r\n// This makes use of combined attributes containing both\r\n// internal and friendly name to support localization.\r\n//\r\n// Return value: Hash of internal name keys containing an object with both the\r\n// friendly name and attribute value There is also a \"meta\" key containing a\r\n// hash of all the attribute keys and their corresponding types.\r\n//\r\n// Example:\r\n// {\r\n// flavor: {\r\n// friendlyName: Flavor,\r\n// value: 'bland'\r\n// },\r\n// calories: {\r\n// friendlyName: Calories,\r\n// value: 5300\r\n// },\r\n// meta: {\r\n// flavor: 'string',\r\n// calories: 'number'\r\n// }\r\n// }\r\n//----------------------------------------------------------\r\nexport function convertProductAttributesLocalized(attributeList: AttributeValue[]): AttributesLocalized {\r\n const output = {\r\n meta: {}\r\n };\r\n\r\n attributeList.forEach(attribute => {\r\n if (attribute.KeyName && attribute.DataTypeValue) {\r\n const typeData = getTypeInfo(attribute.DataTypeValue);\r\n output[attribute.KeyName] = {\r\n friendlyName: attribute.Name,\r\n value: attribute[typeData.source]\r\n };\r\n output.meta[attribute.KeyName] = typeData.type;\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n//----------------------------------------------------------\r\nexport function convertCustomerAttributes(attributeList: CustomerAttribute[] | undefined): AttributesWithMetadata {\r\n const output = {\r\n meta: {}\r\n };\r\n\r\n attributeList?.forEach(attribute => {\r\n // These should always be present, but TypeScript insists they can be undefined.\r\n if (attribute.Name && attribute.DataTypeValue) {\r\n const typeData = getTypeInfo(attribute.DataTypeValue);\r\n output[attribute.Name] = attribute.AttributeValue && typeData.customerSource && attribute.AttributeValue[typeData.customerSource];\r\n output.meta[attribute.Name] = typeData.type;\r\n }\r\n });\r\n\r\n return output;\r\n}\r\n\r\n//----------------------------------------------------------\r\n// Finds the source field and type for an attribute\r\n//\r\n// This should probably be extended to better support\r\n// currency, which seems to be two fields glued together.\r\n//----------------------------------------------------------\r\nfunction getTypeInfo(type: AttributeDataType): TypeData {\r\n\r\n // Awkward, but this helps TypeScript enforce strict type checking\r\n type TypeMapType = {\r\n [key in AttributeDataType]: TypeData\r\n };\r\n\r\n const typeMap: TypeMapType = {\r\n [AttributeDataType.None]: {source: 'TextValue', type: 'string'}, // We need to choose something\r\n [AttributeDataType.Currency]: {source: 'CurrencyValue', type: 'number'}, // Should also include CurrencyCode, which is a string?\r\n [AttributeDataType.DateTime]: {source: 'DateTimeOffsetValue', type: 'Date'},\r\n [AttributeDataType.Decimal]: {source: 'FloatValue', type: 'number'},\r\n [AttributeDataType.Integer]: {source: 'IntegerValue', type: 'number', customerSource: 'IntegerValue'},\r\n [AttributeDataType.Text]: {source: 'TextValue', type: 'string', customerSource: 'StringValue'},\r\n [AttributeDataType.TrueFalse]: {source: 'BooleanValue', type: 'boolean', customerSource: 'BooleanValue'},\r\n [AttributeDataType.Video]: {source: 'TextValue', type: 'string'},\r\n [AttributeDataType.Image]: {source: 'TextValue', type: 'string'}\r\n };\r\n\r\n return typeMap[type];\r\n}\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['cart-icon'] = {\n c: () => require('@msdyn365-commerce-modules/cart/dist/lib/modules/cart-icon/cart-icon'),\n $type: 'containerModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action', runOn: 1},{name:'catalogs', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-catalogs', runOn: 0},{name:'channelDeliveryOptionConfig', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration', runOn: 0},{name:'customerBalances', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer-balance', runOn: 0},{name:'customerInformation', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'orgUnitLocations', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'cart-icon',\n p: 'cart',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/cart/dist/lib/modules/cart-icon'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-catalogs';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-catalogs');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-channel-delivery-option-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer-balance';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-customer-balance');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/search-org-unit-locations');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/get-cart-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|country-malt-group|views|cart-icon'] = {\n c: () => require('partner/themes/country-malt-group/views/cart-icon.view.tsx'),\n cn: '__local__-__local__-cart-icon'\n };\nviewDictionary['__local__|__local__|themes|cryer-malt|views|cart-icon'] = {\n c: () => require('partner/themes/cryer-malt/views/cart-icon.view.tsx'),\n cn: '__local__-__local__-cart-icon'\n };\nviewDictionary['@msdyn365-commerce-modules|cart|modules|cart-icon|cart-icon'] = {\n c: () => require('@msdyn365-commerce-modules/cart/dist/lib/modules/cart-icon/cart-icon.view.js'),\n cn: '@msdyn365-commerce-modules-cart-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 { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise {\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n ProductAvailableQuantity,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n\n /**\n * GridSettings for the product image in cartline\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartline\n */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isQuantityLimitsFeatureEnabled: boolean;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n outOfStockThreshold: number,\n productAvailability?: ProductAvailableQuantity\n): number => {\n if (isStockCheckEnabled) {\n if (\n !productAvailability ||\n !productAvailability.AvailableQuantity ||\n productAvailability.AvailableQuantity <= 0 ||\n productAvailability.AvailableQuantity <= outOfStockThreshold\n ) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return 0;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props: IFlyoutCartLineItemsProps,\n index: number,\n foundProductAvailability?: ProductAvailableQuantity,\n foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\n\n const availableQuantityInStock = _getCartItemAvailableQuantity(\n props.isStockCheckEnabled,\n props.outOfStockThreshold,\n foundProductAvailability\n );\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Check if the product is service or not by product type\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return {\n data: {\n product,\n cartline\n },\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n \n ),\n remove: (\n \n {removeButtonText}\n \n ),\n storeLocation: _renderStoreLocation(cartline, props)\n };\n};\n\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\n let deliverylocation;\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\n });\n }\n const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\n const location = delivery?.Description;\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n if (location) {\n deliverylocation = `${location}, ${orgUnitName}`;\n } else {\n deliverylocation = `${orgUnitName}`;\n }\n } else {\n deliverylocation = props.resources.shippingText;\n }\n return deliverylocation;\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if (orgUnitName) {\n return (\n
\n {orgUnitName}\n
\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n};\n\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps\n): IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\n\n if (!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if (product) {\n reactNodes.push(\n _assembleNode(\n cartline,\n product,\n props,\n index,\n foundProductAvailability?.ProductAvailableQuantity,\n foundProductDeliveryOption\n )\n );\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return _assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ActiveCartProductsInput,\n getActiveCartProductsAction,\n getAvailabilitiesForCartLineItems,\n getDeliveryOptionsForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n ProductDeliveryOptionsForCartLineItems\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CartLineValidationResultsByLineId,\n OrgUnitLocation\n} from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n UncontrolledTooltip,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n isQuantityLimitsFeatureEnabled: boolean;\n isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps {\n className: string;\n cartIcon: React.ReactNode;\n FlyoutContainer?: INodeProps;\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n isCartLoading: boolean;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass CartIcon extends React.Component, IMiniCartState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly checkoutBySignInAttributes: IDictionary | undefined;\n\n private readonly checkoutByGuestAttributes: IDictionary | undefined;\n\n private readonly viewShoppingBagAttributes: IDictionary | undefined;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private lastValidatedCartVersion: number | undefined;\n\n constructor(props: ICartIconProps) {\n super(props);\n this.state = {\n miniCartData: {},\n isCartValid: true,\n isQuantityLimitsFeatureEnabled: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n await this._setQuantityLimitsFeatureFlag();\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations?.result\n });\n\n this._validateCart();\n }\n\n public componentDidUpdate(prevProps: ICartIconProps): void {\n this._validateCart();\n }\n\n public shouldComponentUpdate(nextProps: ICartIconProps, nextState: IMiniCartState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: { enableHoverCart, isAnonymousCheckout },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n const hasInvoiceLine = cart?.hasInvoiceLine;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const cartLines = this._getCartLines();\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.state.miniCartData.productAvailabilites ?? [],\n this.props.context.actionContext,\n this.state.miniCartData.products ?? [],\n emailDeliveryModeCode\n );\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n const flyoutTitle = resources.flyoutTitle;\n const flyoutTooltip = {\n tag: UncontrolledTooltip,\n shouldShowMiniCart,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover',\n displayMode: 'FLYOUT',\n target: id,\n shouldShowCloseButton: true,\n cartPageUrl: cartUrl,\n hideAriaHidden: true\n };\n\n // If there are invoice lines, don't update mini cart price\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\n const priceString = price\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\n : '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n cartIcon: (\n \n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n\n // If there are invoice lines, don't update mini cart checkout button\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n checkoutAsSignInUserButton:\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n goToCartButton: (\n \n {goToCartButtonText}\n \n ),\n checkoutBlockedDueToUnavailableFunds: null,\n flyoutTitle: {flyoutTitle},\n totalPrice:
{priceString}
\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _validateCart(): void {\n const {\n data: { cart }\n } = this.props;\n const cartVersion = cart.result?.cart?.Version ?? undefined;\n if (this.lastValidatedCartVersion === cartVersion) {\n return;\n }\n\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n\n if (this.state.isQuantityLimitsFeatureEnabled) {\n validateCartAsync(cart, this.props.telemetry, this.props.context)\n .then((result: CartLineValidationResultsByLineId | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\n } else {\n this.setState({ isCartValid: true });\n }\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Sort cartline items.\n * @param cartlines - Cartlines to be sorted.\n * @param sortOrder - Ascending or descending.\n * @returns - Sorted cartlines.\n */\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n const lines: CartLine[] = [...cartlines];\n const zero: number = 0;\n\n if (sortOrder === cartLinesSortOrder.descending) {\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n }\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n };\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n // Cart-icon could be placed in each page\n // so we check cart content to reduce number of RS calls\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\n ? FlyoutCartLineItems({\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n quantityDisplayString: resources.quantityDisplayText,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n inputQuantityAriaLabel: '', // Not used\n discountStringText: '', // Not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: '',\n shippingText: resources.shippingText\n },\n telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // Not used\n outOfRangeOneText: '', // Not used\n outOfRangeFormatText: '', // Not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\n catalogs: this.props.data.catalogs?.result\n })\n : null;\n }\n\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input).catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n private async _setQuantityLimitsFeatureFlag(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n return;\n }\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result =\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n }\n}\n\nexport default CartIcon;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n \n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n \n );\n });\n};\n\nconst CartIconView: React.FC = (props: ICartIconViewProps) => (\n \n {props.cartIcon}\n {props.FlyoutContainer ? (\n \n {props.flyoutTitle}\n {props.checkoutBlockedDueToUnavailableFunds}\n {_renderCartlines(props.cartlines, props)}\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.goToCartButton}\n \n ) : (\n false\n )}\n \n);\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IAny,\n IActionContext,\n IActionInput,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\nimport { searchOrgUnitLocationsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/OrgUnitsDataActions.g';\n\n/**\n * Input for search-org-unit-locations data action.\n */\nexport class SearchOrgUnitLocationsInput implements IActionInput {\n public getCacheKey = () => 'SearchOrgUnitLocations';\n\n public getCacheObjectType = () => 'SearchOrgUnitLocations';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * Creates the input required to make the retail api call.\n * @param inputData -- Input data.\n * @returns -- IActionInput.\n */\nexport const createSearchOrgUnitLocationsInputFunc = (inputData: ICreateActionContext>): IActionInput => {\n return new SearchOrgUnitLocationsInput();\n};\n\n/**\n * Calls the Retail API and returns all the orgUnitLocations as array.\n * @param input - Input.\n * @param ctx - Context.\n * @returns - orgUnitLocations.\n */\nexport async function getSearchOrgUnitLocationsAction(\n input: SearchOrgUnitLocationsInput,\n context: IActionContext\n): Promise {\n const OrgUnitLocations = await searchOrgUnitLocationsAsync(\n {\n callerContext: context\n },\n {}\n );\n\n return OrgUnitLocations;\n}\n\nexport const retailActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/search-org-unit-locations',\n action: >getSearchOrgUnitLocationsAction,\n input: createSearchOrgUnitLocationsInputFunc\n});\n\nexport default retailActionDataAction;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["_modifyRemoveButton","button","cartLine","props","window","originalHandler","onClick","_props$context$reques","formattedAttribs","productAttributes","convertProductAttributes","AttributeValues","key","gaData","itemID","ItemId","recordID","ProductId","variant","name","quantity","Quantity","price","Price","discount","DiscountAmount","currency","context","request","channel","Currency","unitOfMeasure","UnitOfMeasureSymbol","attributes","publish","_props$data$cart$resu","customerData","data","customerInformation","result","onBoardingStatus","convertCustomerAttributes","Attributes","CusOnboardStatus","cartTotal","cart","TotalAmount","creditLimit","app","config","firstTimeLimit","customerStatusIds","customerStatus","addOverridesToCartState","isBlocked","Blocked","isOnHold","isNewCust","customerOnHoldId","customerFirstTimeBuyerId","React","Node","Object","assign","miniCartWrapper","renderModuleAttributes","cartIcon","FlyoutContainer","flyoutTitle","CartlinesWrapper","_renderCartlines","cartLines","map","index","miniCartItemWrapper","cartline","storeLocation","remove","telemetry","error","cartlines","totalPrice","checkoutAsSignInUserButton","goToCartButton","subscriptions","eventName","eventData","keys","forEach","subscriber","subscribe","handler","Error","cartState","extendedState","wasInjected","addProductsToCart","CustomBaseCartState","prototype","addProductsToCartWithAttribs","addProductToCart","addProductToCartWithAttribs","baseRemoveCartLines","removeCartLines","removeCartLinesOverride","formatCustomAttributes","push","BaseCartState","constructor","this","input","_doAsyncAction","async","internalInput","inputItem","_inputItem$catalogId","attributeValues","customAttributes","CatalogId","catalogId","getCatalogId","actionContext","requestContext","Description","product","EntryMethodTypeValue","RecordId","count","TrackingId","DefaultUnitOfMeasure","IsPriceKeyedIn","isPriceKeyedIn","IsGiftCardLine","IsGiftCard","customPrice","location","status","undefined","deliveryMode","DeliveryMode","retailMultiplePickupModeEnabled","PickupDeliveryModeCode","FulfillmentStoreId","OrgUnitNumber","WarehouseId","InventoryLocationId","ShippingAddress","_buildAddressFromOrgUnitLocation","_this$actionContext$r","isAddEmailDeliveryItemToCart","EmailDeliveryModeCode","PRODUCTASSERVICE","isAddServiceItemToCart","ItemTypeValue","cartLineToAdd","availableQuantity","isStockCheckEnabled","enableStockCheck","_doCartOperationWithRetry","addProductsToCartInternal","_input$catalogId","_input$additionalProp","_input$product$Behavi","ReleasedProductType","Service","orderQuantityLimitsFeatureIsEnabled","additionalProperties","isMaxByQuantityValidationFeatureDefined","Behavior","MaximumQuantity","addProductToCartInternal","shouldSkipSiteSettings","cartLineIds","filter","id","_this$cart$CartLines","itemToRemove","CartLines","find","line","LineId","attributeList","output","meta","attribute","Name","DataTypeValue","typeData","getTypeInfo","source","type","convertProductAttributesLocalized","KeyName","friendlyName","value","AttributeValue","customerSource","AttributeDataType","None","DateTime","Decimal","Integer","Text","TrueFalse","Video","Image","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","RegistrationId","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","md","__bindings__","_objectSpread","viewDictionary","cn","validateCartAsync","propsContext","cartResult","cartVersion","shouldRetry","arguments","length","Version","warning","debug","AsyncResult","resolve","_validationResult$Val","validationResult","CartsDataActions","callerContext","bypassCache","Id","ValidationResultsByLineId","refreshCart","refreshError","validateError","cartLineQuantityUpdatedAsync","isQuantityLimitsFeatureEnabled","products","cartLineToUpdate","isUsingDefaultOrderSettingsMax","ArrayExtensions","hasElements","_modifiedProduct$Beha2","modifiedProduct","cartLineId","toString","newQuantity","updateLineResult","updateCartLineQuantity","message","getProductByProductId","productId","getProductByProductIdAndWarehouse","warehouseId","targetWarehouseValue","_product$Behavior","_renderDeliveryLocation","deliverylocation","_foundProductDelivery","orgUnitName","_getOrgUnitName","orgUnitLocations","foundProductDeliveryOption","productDeliveryOptions","deliveryOption","delivery","DeliveryOptions","option","Code","resources","shippingText","_renderStoreLocation","className","fulfillmentStoreId","foundLocation","orgUnitLocation","OrgUnitName","_assembleCartlines","reactNodes","foundProductAvailability","_foundProductAvailabi","productAvailabilites","productAvailability","_productAvailability$","ProductAvailableQuantity","_assembleNode","foundProductDeliveryOptions","imageSettings","gridSettings","typeName","removeButtonText","removeItemClickHandler","availableQuantityInStock","outOfStockThreshold","AvailableQuantity","_getCartItemAvailableQuantity","maxQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","isServiceItem","onRemoveClickHandler","onRemoveClickFunction","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","RemoveCartItem","removeCartItemAttribute","getTelemetryAttributes","productUrl","getProductUrlSync","MsDyn365","isBrowser","isChannelTypeB2B","_cartline$CatalogId","fullUrl","URL","href","searchParams","set","hasError","CartLineItemComponent","catalogs","currentQuantity","isOutOfStock","isQuantityEditable","primaryImageUrl","PrimaryImageUrl","displayMode","channelDeliveryOptionConfig","deliveryLocation","Button","title","getMiniCartData","ctx","miniCartData","hasInvoiceLine","getActiveCartProductsAction","ActiveCartProductsInput","then","catch","exception","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","apiSettings","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","deliveryOptions","CartIcon","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","state","isCartValid","getTelemetryObject","telemetryPageName","payload","TelemetryEvent","CheckOut","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","user","isAuthenticated","signInUrl","guestCheckoutUrl","getUrlSync","cartUrl","checkoutURL","_getCheckoutURL","isCartEmpty","shouldShowMiniCart","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","emailDeliveryModeCode","_getCartLines","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","some","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","replace","flyoutTooltip","tag","UncontrolledTooltip","placement","hideArrow","trigger","target","shouldShowCloseButton","cartPageUrl","hideAriaHidden","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","featureState","feature","IsEnabled","viewProps","CartIconComponent","cartLabel","cartQtyLabel","classnames","disabled","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","checkoutBlockedDueToUnavailableFunds","renderView","_cart$result$cart$Ver","_cart$result","lastValidatedCartVersion","ValidationResultsPairs","isAbsoluteUrl","urlCheck","returnURL","msdyn365Commerce","origin","includes","_this$props$data$cata","FlyoutCartLineItems","cartLinesSortOrder","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","quantityDisplayString","quantityDisplayText","salesAgreementPricePrompt","inputQuantityAriaLabel","discountStringText","originalPriceText","currentPriceText","shippingChargesText","removeCartButtonText","outOfStockText","outOfRangeOneText","outOfRangeFormatText","pickupDeliveryModeCode","_featureStatuses$find","_this$props$context","featureStatuses","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","_featureStatuses$find2","customerInfo","IsB2b","__decorate","observer","SearchOrgUnitLocationsInput","getCacheKey","getCacheObjectType","dataCacheType","createSearchOrgUnitLocationsInputFunc","inputData","getSearchOrgUnitLocationsAction","searchOrgUnitLocationsAsync","retailActionDataAction","createObservableDataAction","action","module","exports","ReactDOM"],"sourceRoot":""}