{"version":3,"file":"static/js/12.7914d23926cc33502529.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/components/alert.tsx?4a3b","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/components/get-invoice-payment-summary.tsx?fb8f","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/components/get-line-items.tsx?10b8","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/components/get-order-summary.tsx?0240","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/components/guided-card.tsx?fd42","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/components/guided-form.tsx?1a6e","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/components/place-order-button.tsx?28b7","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/methods/dyn-checkout-punchout.ts?98bb","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/methods/empty-active-cart.ts?2e26","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/methods/dyn-place-order.ts?c978","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/dyn-checkout-punchout.tsx?18c3","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout-punchout/dyn-checkout-punchout.view.tsx?7232","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/components/alert.tsx?67f7","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/components/get-invoice-payment-summary.tsx?32e7","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/components/get-line-items.tsx?e730","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/components/get-order-summary.tsx?9ca5","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/components/guided-card.tsx?d775","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/components/guided-form.tsx?f831","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/components/place-order-button.tsx?ac25","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/methods/dyn-checkout.ts?d2d7","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/methods/empty-active-cart.ts?bbfc","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/dyn-checkout.tsx?01e4","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/methods/place-order.ts?368d","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-checkout/dyn-checkout.view.tsx?c8d1","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-product-collection/dyn-product-collection.props.autogenerated.ts?0fed","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-product-collection/dyn-product-collection.tsx?0c96","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-product-collection/dyn-product-collection.view.tsx?2e04","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/choice-summary.tsx?9f2c","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/error-message.tsx?54ee","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/feature-search-result-item.tsx?f682","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/link.tsx?6d2f","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/modal.tsx?4323","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/product-search-result-items.tsx?e74d","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/separator.tsx?9de4","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/title.tsx?74cb","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/price.component.tsx?0b0c","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/product.component.tsx?9251","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/range-refine-item.tsx?8177","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/refine-item.tsx?d763","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/refine-submenu.tsx?ed1f","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/components/utilities.ts?cac3","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/dyn-search-result-container.props.autogenerated.ts?f855","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/dyn-search-result-container.tsx?4f67","webpack://Msdyn365.Commerce.Online/./src/modules/dyn-search-result-container/dyn-search-result-container.view.tsx?16d8","webpack://Msdyn365.Commerce.Online/./src/themes/dyn-tebutheme/views/components/product.component.tsx?781a","webpack://Msdyn365.Commerce.Online/./src/themes/dyn-tebutheme/views/components/promocode.component.tsx?67a6","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/cart-icon.view.tsx?f9dd","webpack://Msdyn365.Commerce.Online/../../src/checkout-state-data-action.ts?8344","webpack://Msdyn365.Commerce.Online/../../src/checkout-state.ts?acd8","webpack://Msdyn365.Commerce.Online/../../src/checkout-utilities.data.ts?b2cc","webpack://Msdyn365.Commerce.Online/../../../src/module-state-manager/module-state.ts?7579","webpack://Msdyn365.Commerce.Online/../../../src/module-state-manager/with-module-state.tsx?61ca","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/cartlineitem.component.tsx?eb8c","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/links.tsx?2587","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/text.tsx?782b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.view.tsx?7f77"],"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\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface IAlertProps {\r\n message: string;\r\n}\r\n\r\nconst CheckoutAlert: React.FC = ({ message }) => (\r\n

\r\n {message}\r\n

\r\n);\r\n\r\nexport default CheckoutAlert;\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 { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\n\r\nimport { IDynCheckoutPunchoutData } from '../dyn-checkout-punchout.data';\r\nimport { IDynCheckoutPunchoutProps } from '../dyn-checkout-punchout.props.autogenerated';\r\n\r\nexport interface IInvoicePaymentSummary {\r\n heading?: React.ReactNode;\r\n lines?: IInvoiceSummaryLines;\r\n}\r\nexport const getInvoicePaymentSummary = (input: IDynCheckoutPunchoutProps): IInvoicePaymentSummary => {\r\n const {\r\n data: { checkout },\r\n resources: { totalAmountLabel, invoiceLabel, invoiceSummaryTitle },\r\n context,\r\n typeName,\r\n id,\r\n telemetry\r\n } = input;\r\n\r\n const checkoutCart = get(checkout, 'result.checkoutCart');\r\n const cart = get(checkout, 'result.checkoutCart.cart');\r\n\r\n return {\r\n heading:

{invoiceSummaryTitle}

,\r\n lines: checkoutCart?.hasInvoiceLine\r\n ? InvoiceSummary({\r\n orderTotalLabel: totalAmountLabel,\r\n invoiceLabel,\r\n cart,\r\n context,\r\n typeName,\r\n telemetry,\r\n id,\r\n checkoutState: checkout.result\r\n })\r\n : undefined\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\n//import { CartLineItemComponent } from '@msdyn365-commerce/components';\r\nimport { TebuCartLineItemComponent } from '../../../themes/dyn-tebutheme/views/components/cartlineitem.component';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { AttributeValue, CartLine, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductUrlSync, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport groupBy from 'lodash/groupBy';\r\nimport * as React from 'react';\r\n\r\nimport { IDynCheckoutPunchoutData } from '../dyn-checkout-punchout.data';\r\nimport { IDynCheckoutPunchoutProps } from '../dyn-checkout-punchout.props.autogenerated';\r\nimport { ProductWithAttributes } from '../dyn-checkout-punchout';\r\n\r\ntype deliveryType = 'pickup' | 'ship' | 'email';\r\n\r\nexport interface IPickUpAtStore {\r\n PickUpAtStore: INodeProps;\r\n label: React.ReactNode;\r\n location: React.ReactNode;\r\n}\r\n\r\nexport interface IEmailDelivery {\r\n EmailDelivery: INodeProps;\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface ILineItem {\r\n LineId: string;\r\n LineItem: INodeProps;\r\n item?: React.ReactNode;\r\n pickUpAtStore?: IPickUpAtStore;\r\n emailDelivery?: IEmailDelivery;\r\n}\r\n\r\nexport interface ILineItemDeliveryGroup {\r\n LineItemDeliveryGroup: INodeProps;\r\n LineItemList: INodeProps;\r\n heading: React.ReactNode;\r\n lineItemWraper?: React.ReactNode;\r\n lineItemWraperIcon?: React.ReactNode;\r\n lineItems: ILineItem[];\r\n}\r\n\r\nexport interface ILineItems {\r\n LineItems: INodeProps;\r\n Header: INodeProps;\r\n heading: React.ReactNode;\r\n editLink: React.ReactNode;\r\n itemsForPickup?: ILineItemDeliveryGroup;\r\n itemsForShip?: ILineItemDeliveryGroup;\r\n itemsForEmail?: ILineItemDeliveryGroup;\r\n itemsGroupWithMulitplePickupMode?: ILineItemDeliveryGroup[];\r\n}\r\n\r\nexport const getLineItems = (\r\n input: IDynCheckoutPunchoutProps,\r\n productsWithAttributes: ProductWithAttributes[],\r\n telemetryContent?: ITelemetryContent\r\n): ILineItems | undefined => {\r\n const pickupDeliveryModeCode = get(input, 'context.request.channel.PickupDeliveryModeCode');\r\n const emailDeliveryModeCode = get(input, 'context.request.channel.EmailDeliveryModeCode');\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const { channelDeliveryOptionConfig, featureState } = input.data;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n\r\n const _getDeliveryLocation = (cartLine: CartLine): string => {\r\n const orgUnitLocations = get(input, 'data.orgUnitLocations.result');\r\n if (!cartLine.FulfillmentStoreId || !orgUnitLocations) {\r\n return '';\r\n }\r\n\r\n const locationMatch = (orgUnitLocations || []).find((location: OrgUnitLocation): boolean => {\r\n return location.OrgUnitNumber === cartLine.FulfillmentStoreId;\r\n });\r\n\r\n return locationMatch && locationMatch.OrgUnitName;\r\n };\r\n\r\n const _getProduct = (productId: number): SimpleProduct | undefined => {\r\n const products = get(input, 'data.products.result') || [];\r\n return products.find((_product: SimpleProduct) => {\r\n return productId === _product.RecordId;\r\n });\r\n };\r\n\r\n const _getProductWithAttributes = (productId: number): AttributeValue[] | undefined => {\r\n const productWithAttributes = productsWithAttributes.find((_product: ProductWithAttributes) => {\r\n return productId === _product.productDetails?.RecordId;\r\n });\r\n return productWithAttributes?.productSpecificationData || undefined;\r\n };\r\n\r\n const _getLineItemComponent = (cartLine: CartLine): JSX.Element | undefined => {\r\n const product = cartLine.ProductId && _getProduct(cartLine.ProductId);\r\n const productAttributes = cartLine.ProductId && _getProductWithAttributes(cartLine.ProductId);\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n config: { imageSettings, showShippingChargesForLineItems },\r\n resources: {\r\n quantityDisplayString,\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n productDimensionTypeAmount,\r\n configString,\r\n inputQuantityAriaLabel,\r\n discountStringText,\r\n shippingCharges\r\n },\r\n context: {\r\n request: { gridSettings }\r\n }\r\n } = input;\r\n\r\n if (!product) {\r\n return;\r\n }\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n const _getPickUpAtStoreComponents = (pickupDeliveryLocation: string): IPickUpAtStore => {\r\n const {\r\n resources: { pickUpAtStoreWithLocationText }\r\n } = input;\r\n\r\n return {\r\n PickUpAtStore: { className: 'ms-checkout__pick-up-at-store' },\r\n label: {pickUpAtStoreWithLocationText},\r\n location:
{pickupDeliveryLocation}
\r\n };\r\n };\r\n\r\n const _getEmailDeliveryComponents = (): IEmailDelivery => {\r\n const {\r\n resources: { emailDeliveryText }\r\n } = input;\r\n\r\n return {\r\n EmailDelivery: { className: 'ms-checkout__email-delivery' },\r\n label: {emailDeliveryText}\r\n };\r\n };\r\n\r\n const _getLineItemsComponents = (items: CartLine[]): ILineItem[] => {\r\n return items.map(cartLine => {\r\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\r\n const isPickUp = _getCartPickDeliveryMode(cartLine);\r\n const isEmailDelivery =\r\n cartLine.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\r\n return {\r\n LineId: cartLine.LineId || '',\r\n LineItem: { className: 'ms-checkout__line-item' },\r\n item: _getLineItemComponent(cartLine),\r\n pickUpAtStore: isPickUp ? _getPickUpAtStoreComponents(pickupDeliveryLocation) : undefined,\r\n emailDelivery: isEmailDelivery ? _getEmailDeliveryComponents() : undefined\r\n };\r\n });\r\n };\r\n\r\n const _getCartPickDeliveryMode = (cartLineItem: CartLine): boolean => {\r\n return !StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)\r\n ? retailMultiplePickUpOptionEnabled\r\n ? cartLineItem.DeliveryMode ===\r\n channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(\r\n deliveryMode => deliveryMode === cartLineItem.DeliveryMode\r\n )\r\n : cartLineItem.DeliveryMode === pickupDeliveryModeCode\r\n : false;\r\n };\r\n\r\n const _getCartShipDeliveryMode = (cartLineItem: CartLine): boolean => {\r\n return !StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)\r\n ? retailMultiplePickUpOptionEnabled\r\n ? cartLineItem.DeliveryMode !==\r\n channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(\r\n deliveryMode => deliveryMode === cartLineItem.DeliveryMode\r\n )\r\n : cartLineItem.DeliveryMode !== pickupDeliveryModeCode\r\n : false;\r\n };\r\n\r\n const _getGroupTitleComponent = (count: number, type: deliveryType): string => {\r\n const {\r\n resources: { itemLabel, itemsLabel, inStorePickUpLabel, shippingCountCheckoutLineItem }\r\n } = input;\r\n\r\n let emailDeliveryModeDesc: string = '';\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n emailDeliveryModeDesc = emailDeliveryModeDesc\r\n ? emailDeliveryModeDesc\r\n : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)\r\n ?.Description!;\r\n });\r\n\r\n const suffix = count > 1 ? itemsLabel : itemLabel;\r\n const title =\r\n type === 'ship'\r\n ? shippingCountCheckoutLineItem\r\n : type === 'pickup'\r\n ? inStorePickUpLabel\r\n : `${emailDeliveryModeDesc} (${count} ${suffix})`;\r\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\r\n };\r\n\r\n const _countItems = (items: CartLine[]): number => {\r\n return items.reduce((count, item) => {\r\n return count + (item.Quantity || 0);\r\n }, 0);\r\n };\r\n\r\n const _filterItemsByDiliveryType = (type: deliveryType): CartLine[] => {\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n if (type === 'ship') {\r\n return cart.CartLines.filter((cartLine: CartLine) =>\r\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\r\n ? _getCartShipDeliveryMode(cartLine) && cartLine.DeliveryMode !== emailDeliveryModeCode\r\n : cartLine\r\n );\r\n } else if (type === 'pickup') {\r\n return cart.CartLines.filter((cartLine: CartLine) =>\r\n cartLine.DeliveryMode && cartLine.DeliveryMode !== '' ? _getCartPickDeliveryMode(cartLine) : null\r\n );\r\n }\r\n return cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode === emailDeliveryModeCode);\r\n };\r\n\r\n const _getLineItemsByDeliveryType = (type: deliveryType): ILineItemDeliveryGroup | undefined => {\r\n if ((pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) && (type === 'pickup' || type === 'email')) {\r\n return;\r\n }\r\n\r\n const items = _filterItemsByDiliveryType(type);\r\n\r\n if (items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const count = _countItems(items);\r\n const title = _getGroupTitleComponent(count, type);\r\n\r\n return {\r\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group', type) },\r\n LineItemList: { className: 'ms-checkout__line-items-list' },\r\n heading:
{title}
,\r\n lineItems: _getLineItemsComponents(items)\r\n };\r\n };\r\n\r\n const _getLineItems = (): ILineItems | undefined => {\r\n const {\r\n context,\r\n config: { lineItemsHeading },\r\n data: { products },\r\n resources: { editCartText }\r\n } = input;\r\n\r\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.EditCart);\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n const groupClass = retailMultiplePickUpOptionEnabled ? ' multiple-pickup-enabled' : '';\r\n if (!cart || !cart.CartLines || cart.CartLines.length === 0 || !products) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n LineItems: { className: `ms-checkout__line-items${groupClass}` },\r\n Header: { className: 'ms-checkout__line-items-header' },\r\n heading: lineItemsHeading && lineItemsHeading.text && (\r\n \r\n ),\r\n editLink: (\r\n \r\n {editCartText}\r\n \r\n ),\r\n itemsForPickup: _getLineItemsByDeliveryType('pickup'),\r\n itemsForShip: _getLineItemsByDeliveryType('ship'),\r\n itemsForEmail: _getLineItemsByDeliveryType('email'),\r\n itemsGroupWithMulitplePickupMode: retailMultiplePickUpOptionEnabled\r\n ? _getLineItemsByDeliveryTypeWithMulitplePickupMode()\r\n : undefined\r\n };\r\n };\r\n\r\n const handleLineItemHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\r\n const {\r\n config: { lineItemsHeading }\r\n } = input;\r\n lineItemsHeading!.text = event.target.value;\r\n };\r\n\r\n const _getGroupTitleComponentWithMultiplePickUp = (\r\n count: number,\r\n type: deliveryType,\r\n deliveryMode?: string,\r\n fulFillmentStoreId?: string\r\n ): string => {\r\n const {\r\n resources: { itemLabel, itemsLabel }\r\n } = input;\r\n\r\n let emailDeliveryModeDesc: string = '';\r\n let pickupDeliveryModeDesc: string = '';\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n emailDeliveryModeDesc = emailDeliveryModeDesc\r\n ? emailDeliveryModeDesc\r\n : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)\r\n ?.Description!;\r\n });\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n pickupDeliveryModeDesc = pickupDeliveryModeDesc\r\n ? pickupDeliveryModeDesc\r\n : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === deliveryMode)?.Description!;\r\n });\r\n\r\n const pickupTitle: string = `${pickupDeliveryModeDesc}, ${fulFillmentStoreId}`;\r\n const suffix = count > 1 ? itemsLabel : itemLabel;\r\n const title =\r\n type === 'ship'\r\n ? `(${count} ${suffix})`\r\n : type === 'pickup'\r\n ? `${pickupTitle} (${count} ${suffix})`\r\n : `${emailDeliveryModeDesc} (${count} ${suffix})`;\r\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\r\n };\r\n\r\n const _filterItemsByMultiplePickupMode = (): CartLine[][] => {\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\r\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\r\n const groupDelivery = getGroupByDelivery(cart.CartLines);\r\n const cartLinesGroup: CartLine[] = [];\r\n const cartLinesGrp: CartLine[][] = [];\r\n\r\n // 1) Group by store and pick up mode\r\n Object.entries(groupDelivery).forEach(([deliveryMode, groupByDeliveryType]) => {\r\n // @ts-expect-error\r\n groupDelivery[deliveryMode] = getGroupByStorePickup(groupByDeliveryType);\r\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n });\r\n\r\n Object.keys(cartLinesGroup).forEach(key => {\r\n const cartLines = cartLinesGroup[key];\r\n Object.keys(cartLines).forEach(index => {\r\n const cartLine = cartLines[index];\r\n cartLinesGrp.push(cartLine);\r\n });\r\n });\r\n\r\n return cartLinesGrp;\r\n };\r\n\r\n const _getLineItemsByDeliveryTypeWithMulitplePickupMode = (): ILineItemDeliveryGroup[] | undefined => {\r\n if (pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) {\r\n return;\r\n }\r\n\r\n const {\r\n resources: { multiplePickUpLabel, shippingLable }\r\n } = input;\r\n\r\n const items = _filterItemsByMultiplePickupMode();\r\n\r\n if (items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const lineItemDeliveryGroup: ILineItemDeliveryGroup[] = [];\r\n items.map(item => {\r\n const count = _countItems(item);\r\n const cartLine = item[0];\r\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\r\n const type: deliveryType =\r\n cartLine.FulfillmentStoreId && cartLine.DeliveryMode\r\n ? 'pickup'\r\n : cartLine.FulfillmentStoreId === '' && cartLine.DeliveryMode === emailDeliveryModeCode\r\n ? 'email'\r\n : 'ship';\r\n const title = _getGroupTitleComponentWithMultiplePickUp(count, type, cartLine.DeliveryMode, pickupDeliveryLocation);\r\n const groupTitle = type === 'pickup' ? multiplePickUpLabel : type === 'ship' ? shippingLable : 'email';\r\n const iconClass = `ms-checkout__line-items-group-title-multiple-pickup-${type}icon`;\r\n lineItemDeliveryGroup.push({\r\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group multiple-pickup', type) },\r\n LineItemList: { className: 'ms-checkout__line-items-list' },\r\n lineItemWraperIcon:
,\r\n lineItemWraper:
{groupTitle}
,\r\n heading:
{title}
,\r\n lineItems: _getLineItemsComponents(item)\r\n });\r\n });\r\n\r\n return lineItemDeliveryGroup;\r\n };\r\n\r\n return _getLineItems();\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\n\r\nimport { IDynCheckoutPunchoutData } from '../dyn-checkout-punchout.data';\r\nimport { IDynCheckoutPunchoutProps } from '../dyn-checkout-punchout.props.autogenerated';\r\n\r\nexport interface IOrderSummary {\r\n orderSummaryProps: INodeProps;\r\n heading?: React.ReactNode;\r\n lines?: IOrderSummaryLines;\r\n}\r\nexport const getOrderSummary = (input: IDynCheckoutPunchoutProps): IOrderSummary => {\r\n const {\r\n config: { orderSummaryHeading },\r\n data: { checkout },\r\n resources: {\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText,\r\n otherCharges\r\n },\r\n context,\r\n typeName,\r\n id,\r\n telemetry\r\n } = input;\r\n\r\n const checkoutState = get(checkout, 'result');\r\n const cart = get(checkout, 'result.checkoutCart.cart');\r\n const showLineItems = cart.CartLines && cart.CartLines.length > 0;\r\n const channelConfiguration = context.request.channel!;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const { channelDeliveryOptionConfig, featureState } = input.data;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n\r\n const handleOrderSummaryHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\r\n const {\r\n config: { orderSummaryHeading }\r\n } = input;\r\n orderSummaryHeading!.text = event.target.value;\r\n };\r\n\r\n return {\r\n orderSummaryProps: { className: 'ms-checkout-guest-profile__selected-item' },\r\n heading: orderSummaryHeading && orderSummaryHeading.text && (\r\n \r\n ),\r\n lines: showLineItems\r\n ? OrderSummary({\r\n checkoutState,\r\n cart,\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText,\r\n context,\r\n typeName,\r\n id,\r\n channelConfiguration,\r\n telemetry,\r\n otherChargeLabel: otherCharges,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result\r\n })\r\n : undefined\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 { Heading as HeadingType } from '@msdyn365-commerce-modules/data-types';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n IPayLoad,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classname from 'classnames';\r\nimport * as React from 'react';\r\n//import ReactDOM from 'react-dom';\r\n\r\nexport interface ICheckoutGuidedCardProps {\r\n step: number;\r\n title?: HeadingType;\r\n disabled?: boolean; // Module is not available\r\n isActive?: boolean; // Step === currentStep\r\n isVisted?: boolean; // Step < currentStep\r\n isExpanded?: boolean;\r\n isReady?: boolean;\r\n isPending?: boolean;\r\n isUpdating?: boolean;\r\n isSubmitting?: boolean;\r\n isCancelAllowed?: boolean;\r\n isMobile?: boolean;\r\n hasInitialized?: boolean;\r\n hasControlGroup?: boolean;\r\n children: React.ReactNode;\r\n resource: {\r\n checkoutStepTitleFormat: string;\r\n saveBtnLabel: string;\r\n changeBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n telemetryContent?: ITelemetryContent;\r\n onEdit?(): void;\r\n onCancel?(): void;\r\n onSubmit?(): void;\r\n onNext(): void;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutGuidedCard component.\r\n * @extends {React.Component}\r\n */\r\nclass CheckoutGuidedCard extends React.PureComponent {\r\n private readonly editButtonRef: React.RefObject = React.createRef();\r\n\r\n private readonly formCardRef: React.RefObject = React.createRef();\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n constructor(props: ICheckoutGuidedCardProps) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n }\r\n\r\n public componentDidUpdate(prevProps: ICheckoutGuidedCardProps): void {\r\n /**\r\n * Move to next step when current step is ready.\r\n */\r\n const { isActive, isReady, onNext, isVisted, onEdit } = this.props;\r\n\r\n // Move to next step after completing the current step\r\n if (isActive && isReady) {\r\n onNext();\r\n }\r\n\r\n // Set the focus to Edit button once edit button appear\r\n // (It happens when current step switch to isReady status)\r\n const prevCanEdit = prevProps.isReady && prevProps.isVisted && !!prevProps.onEdit;\r\n const canEdit = isReady && isVisted && !!onEdit;\r\n if (!prevCanEdit && canEdit) {\r\n this.focusOnEditButton();\r\n this.scrollToTitle();\r\n }\r\n\r\n // Set the focus to the first focusable element\r\n // (It happens when current step switch to isUpdating status)\r\n if (prevProps.isReady && !isReady) {\r\n this.focusOnFirstFocusableElement();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n title,\r\n disabled,\r\n isExpanded,\r\n isActive,\r\n isVisted,\r\n children,\r\n isReady,\r\n isPending,\r\n isUpdating,\r\n hasInitialized,\r\n hasControlGroup,\r\n onEdit,\r\n resource\r\n } = this.props;\r\n const { changeBtnLabel } = resource;\r\n\r\n this.payLoad.contentAction.etext = TelemetryConstant.CheckoutChange;\r\n const changeBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n const canEdit = hasControlGroup && isReady && isVisted && onEdit;\r\n\r\n return (\r\n \r\n
\r\n {this.getTitle()}\r\n\r\n {canEdit && (\r\n \r\n {changeBtnLabel}\r\n \r\n )}\r\n
\r\n\r\n \r\n
{children}
\r\n\r\n {this.renderFooder()}\r\n
\r\n \r\n );\r\n }\r\n\r\n private readonly renderFooder = (): JSX.Element | null => {\r\n const { isVisted, isReady, isSubmitting, isCancelAllowed, hasControlGroup, onCancel, onSubmit, resource } = this.props;\r\n const { saveBtnLabel, cancelBtnLabel, saveAndContinueBtnLabel } = resource;\r\n\r\n const canSubmit = !isReady && onSubmit;\r\n const canCancel = !isReady && isVisted && isCancelAllowed && onCancel;\r\n\r\n if (!hasControlGroup || (!canSubmit && !canCancel)) {\r\n return null;\r\n }\r\n\r\n this.payLoad.contentAction.etext = isVisted ? TelemetryConstant.Save : TelemetryConstant.SaveContinue;\r\n const saveBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.Cancel;\r\n const cancelBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
\r\n {canSubmit && (\r\n \r\n {isVisted && isCancelAllowed ? saveBtnLabel : saveAndContinueBtnLabel}\r\n \r\n )}\r\n {canCancel && (\r\n \r\n {cancelBtnLabel}\r\n \r\n )}\r\n
\r\n );\r\n };\r\n\r\n private readonly focusOnFirstFocusableElement = (): void => {\r\n // const node = ReactDOM.findDOMNode(this) as HTMLElement;\r\n const focussableElements = `\r\n a:not([disabled]),\r\n button:not([disabled]),\r\n input[type=submit]:not([disabled]),\r\n input[type=checkbox]:not([disabled]),\r\n input[type=text]:not([disabled]),\r\n input[type=radio]:not([disabled]),\r\n input[type=password]:not([disabled]),\r\n select:not([disabled]),\r\n textarea:not([disabled]),\r\n [tabindex]:not([disabled]):not([tabindex=\"-1\"])\r\n `;\r\n console.log(focussableElements);\r\n // const child = node && node.querySelector && (node.querySelector(focussableElements) as HTMLElement);\r\n // child && child.focus && child.focus();\r\n };\r\n\r\n private readonly focusOnEditButton = (): void => {\r\n // Focus on edit button\r\n const editButton =\r\n this.editButtonRef &&\r\n this.editButtonRef.current &&\r\n this.editButtonRef.current.focus &&\r\n (this.editButtonRef.current as HTMLElement);\r\n editButton && editButton.focus();\r\n };\r\n\r\n private readonly scrollToTitle = (): void => {\r\n // Scroll window to the title of the step that was just completed only in mobile viewport\r\n const formCard = this.props.isMobile && this.formCardRef && this.formCardRef.current && (this.formCardRef.current as HTMLElement);\r\n formCard && formCard.scrollIntoView();\r\n };\r\n\r\n private readonly getTitle = (): JSX.Element => {\r\n const { step, title } = this.props;\r\n const { headingTag: Tag = 'h2', text = '' } = title || {};\r\n return (\r\n \r\n {step + 1}. \r\n {text && {text}}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default CheckoutGuidedCard;\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 { IModuleStateManager } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport get from 'lodash/get';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport GuidedCard from './guided-card';\r\n\r\nexport interface ICheckoutGuidedFormProps {\r\n items: React.ReactNode[];\r\n moduleState: IModuleStateManager;\r\n disableGuidedCheckoutFlow?: boolean;\r\n isMobile?: boolean;\r\n isEditor?: boolean;\r\n resource: {\r\n checkoutStepTitleFormat: string;\r\n saveBtnLabel: string;\r\n changeBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\ninterface ICheckoutGuidedFormState {\r\n currentStep: number;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutGuidedForm component.\r\n * @extends {React.Component}\r\n */\r\n@observer\r\nclass CheckoutGuidedForm extends React.PureComponent {\r\n public state: ICheckoutGuidedFormState = {\r\n currentStep: 0\r\n };\r\n\r\n public componentDidMount(): void {\r\n /**\r\n * Append child modules.\r\n */\r\n const childIds = this.props.items.map((item: React.ReactNode) => get(item, 'props.id'));\r\n this.props.moduleState.init({ childIds });\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { moduleState, items, resource } = this.props;\r\n if (!items || !moduleState) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {items.map((item: React.ReactNode) => {\r\n const childId = this.getId(item);\r\n const step = this.getStep(childId);\r\n const title = this.getHeading(item);\r\n const state = this.props.moduleState.getModule(childId);\r\n const {\r\n isReady,\r\n isPending,\r\n isUpdating,\r\n isDisabled,\r\n isCancelAllowed,\r\n onEdit,\r\n onCancel,\r\n onSubmit,\r\n hasModuleState,\r\n hasInitialized\r\n } = state || ({} as IModuleStateManager);\r\n return (\r\n \r\n {React.cloneElement(item as React.ReactElement, { enableControl: true })}\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n private readonly getEnabledModules = (): string[] => {\r\n const {\r\n moduleState: { childIds, getModule }\r\n } = this.props;\r\n return childIds.filter((childId: string) => {\r\n const state = getModule(childId);\r\n return !!state && !state.isDisabled;\r\n });\r\n };\r\n\r\n private readonly getStep = (id: string): number => {\r\n return this.getEnabledModules().indexOf(id);\r\n };\r\n\r\n private readonly getId = (item: React.ReactNode): string => {\r\n return get(item, 'props.id') || '';\r\n };\r\n\r\n private readonly getHeading = (item: React.ReactNode): Heading => {\r\n return get(item, 'props.config.heading') || '';\r\n };\r\n\r\n private readonly isExpanded = (step: number): boolean => {\r\n if (this.props.isEditor) {\r\n // Editorial mode: Expand all the drawers\r\n return true;\r\n }\r\n return step > -1 && step <= this.state.currentStep;\r\n };\r\n\r\n private readonly isActive = (step: number): boolean => {\r\n return step === this.state.currentStep;\r\n };\r\n\r\n private readonly isVisted = (step: number): boolean => {\r\n return step > -1 && step < this.state.currentStep;\r\n };\r\n\r\n private readonly onNext = (): void => {\r\n this.setState({\r\n currentStep: this.state.currentStep + 1\r\n });\r\n };\r\n}\r\n\r\nexport default CheckoutGuidedForm;\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 { TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\ninterface ICheckoutPlaceOrderButtonProps {\r\n canPlaceOrder: boolean;\r\n checkoutBtnText: string;\r\n telemetryContent?: ITelemetryContent;\r\n //shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\r\n isPlaceOrderLoading?: boolean;\r\n placeOrder(): Promise;\r\n}\r\n\r\nconst buttonsStates: React.Dispatch>[] = [];\r\n\r\n/**\r\n * On place order function.\r\n * @param isBusy -Check is busy.\r\n * @param canPlaceOrder -Check can place order.\r\n * @param placeOrder -Place order function.\r\n * @returns Set state of button.\r\n */\r\nconst onPlaceOrderHandler = (isBusy: boolean, canPlaceOrder: boolean, placeOrder: () => Promise) => async () => {\r\n if (isBusy || !canPlaceOrder) {\r\n return;\r\n }\r\n buttonsStates.map(buttonSetState => {\r\n buttonSetState(true);\r\n return true;\r\n });\r\n await placeOrder();\r\n buttonsStates.map(buttonSetState => {\r\n buttonSetState(false);\r\n return true;\r\n });\r\n};\r\n\r\nconst CheckoutPlaceOrderButton: React.FC = ({\r\n checkoutBtnText,\r\n canPlaceOrder,\r\n placeOrder,\r\n telemetryContent,\r\n //shouldEnableSinglePaymentAuthorizationCheckout,\r\n isPlaceOrderLoading\r\n}) => {\r\n const [isBusy, setIsBusy] = useState(false);\r\n buttonsStates.push(setIsBusy);\r\n const payload = getPayloadObject(TelemetryEvent.Purchase, telemetryContent!, checkoutBtnText, '');\r\n const attributes = getTelemetryAttributes(telemetryContent!, payload);\r\n\r\n // if (shouldEnableSinglePaymentAuthorizationCheckout) {\r\n // return (\r\n // \r\n // {checkoutBtnText}\r\n // \r\n // );\r\n // }\r\n\r\n return (\r\n \r\n {checkoutBtnText}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutPlaceOrderButton;\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 { getCheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { TSuccessNumber } from '@msdyn365-commerce/telemetry-internal';\r\n\r\nconst roundNumber = (value: number) => Number(value.toFixed(2));\r\n\r\nexport default async (ctx: IActionContext, updatedCartVersion?: TSuccessNumber): Promise => {\r\n const checkoutState = await getCheckoutState(ctx).catch(error => {\r\n throw error;\r\n });\r\n\r\n const cartState = checkoutState.checkoutCart;\r\n\r\n const channelConfiguration = ctx.requestContext.channel;\r\n\r\n if (!cartState || Object.keys(cartState).length === 0 || !channelConfiguration) {\r\n throw new Error('Fail to placeOrder');\r\n }\r\n\r\n let amountDue = cartState.cart.AmountDue || 0;\r\n\r\n // Then by customer account\r\n if (checkoutState.customerAccountAmount > 0) {\r\n const chargedAmount = roundNumber(Math.min(checkoutState.customerAccountAmount, amountDue));\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n\r\n return cartState.cart;\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 { getCartState, getCheckoutState } from '@msdyn365-commerce/global-state';\r\n\r\nasync function emptyActiveCart(ctx: IActionContext): Promise {\r\n let cartState;\r\n let checkoutState;\r\n const lineItemIdsToRemove = [];\r\n\r\n try {\r\n cartState = await getCartState(ctx);\r\n checkoutState = await getCheckoutState(ctx);\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n if (!cartState || !cartState.cart) {\r\n throw new Error('Fail to fetch active cart');\r\n }\r\n\r\n if (!checkoutState || !checkoutState.checkoutCart) {\r\n throw new Error('Fail to fetch checkoutCart cart');\r\n }\r\n\r\n const activeCart = cartState.cart;\r\n const checkoutCart = checkoutState.checkoutCart.cart;\r\n\r\n for (const activeCartLine of activeCart.CartLines || []) {\r\n for (const checkoutCartLine of checkoutCart.CartLines || []) {\r\n if (activeCartLine.LineId && activeCartLine.LineId === checkoutCartLine.LineId) {\r\n lineItemIdsToRemove.push(activeCartLine.LineId);\r\n }\r\n }\r\n }\r\n\r\n try {\r\n await cartState.removeCartLines({ cartLineIds: lineItemIdsToRemove });\r\n await cartState.removeAllPromoCodes({});\r\n await checkoutState.removeCheckoutCartId({});\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\nexport default emptyActiveCart;\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 { IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { Cart, SimpleProduct, CartLine, ProductDimension, ProductDimensionValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { IDynCheckoutPunchoutConfig } from '../dyn-checkout-punchout.props.autogenerated';\r\n\r\nimport checkout from './dyn-checkout-punchout';\r\nimport emptyActiveCart from './empty-active-cart';\r\nimport { ProductWithAttributes } from '../dyn-checkout-punchout';\r\n\r\n// NB: DynFirstTebuDimension is not a standard punchout field but a TebuSpecific field returning the first dimension, which is the ProductSize in FinOps\r\ninterface CartLineWithAttributes extends CartLine {\r\n DynName: string;\r\n DynDescription: string;\r\n DynCurrency: string;\r\n DynExternalID: string;\r\n DynTebuErpSizes: string;\r\n DynSupplierName: string;\r\n DynCustomField1: string;\r\n DynCustomField2: string;\r\n DynCustomField3: string;\r\n DynCustomField4: string;\r\n DynCustomField5: string;\r\n DynFirstTebuDimension: {\r\n DynDimensionTypeValue: number | undefined;\r\n DynDimensionId: string;\r\n DynDimensionValue: string;\r\n };\r\n}\r\n\r\ninterface cartWithAttributes extends Cart {\r\n cartlinesWithAttributes: CartLineWithAttributes[] | undefined;\r\n}\r\n\r\n/**\r\n *\r\n * Base64 encode / decode\r\n * http://www.webtoolkit.info/\r\n *\r\n **/\r\nvar Base64 = {\r\n // private property\r\n _keyStr: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\r\n\r\n // public method for encoding\r\n encode: function(input: any) {\r\n var output = '';\r\n var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\r\n var i = 0;\r\n\r\n input = Base64._utf8_encode(input);\r\n\r\n while (i < input.length) {\r\n chr1 = input.charCodeAt(i++);\r\n chr2 = input.charCodeAt(i++);\r\n chr3 = input.charCodeAt(i++);\r\n\r\n enc1 = chr1 >> 2; //eslint-disable-line no-bitwise\r\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); //eslint-disable-line no-bitwise\r\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); //eslint-disable-line no-bitwise\r\n enc4 = chr3 & 63; //eslint-disable-line no-bitwise\r\n\r\n if (isNaN(chr2)) {\r\n enc3 = enc4 = 64;\r\n } else if (isNaN(chr3)) {\r\n enc4 = 64;\r\n }\r\n\r\n output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);\r\n }\r\n return output;\r\n },\r\n\r\n // public method for decoding\r\n decode: function(input: any) {\r\n var output = '';\r\n var chr1, chr2, chr3;\r\n var enc1, enc2, enc3, enc4;\r\n var i = 0;\r\n\r\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\r\n\r\n while (i < input.length) {\r\n enc1 = this._keyStr.indexOf(input.charAt(i++));\r\n enc2 = this._keyStr.indexOf(input.charAt(i++));\r\n enc3 = this._keyStr.indexOf(input.charAt(i++));\r\n enc4 = this._keyStr.indexOf(input.charAt(i++));\r\n\r\n chr1 = (enc1 << 2) | (enc2 >> 4); //eslint-disable-line no-bitwise\r\n chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); //eslint-disable-line no-bitwise\r\n chr3 = ((enc3 & 3) << 6) | enc4; //eslint-disable-line no-bitwise\r\n\r\n output = output + String.fromCharCode(chr1);\r\n /*eslint-disable eqeqeq*/\r\n if (enc3 != 64) {\r\n output = output + String.fromCharCode(chr2);\r\n }\r\n /*eslint-disable eqeqeq*/\r\n if (enc4 != 64) {\r\n output = output + String.fromCharCode(chr3);\r\n }\r\n }\r\n\r\n output = Base64._utf8_decode(output);\r\n\r\n return output;\r\n },\r\n\r\n // private method for UTF-8 encoding\r\n _utf8_encode: function(string: any) {\r\n string = string.replace(/\\r\\n/g, '\\n');\r\n var utftext = '';\r\n\r\n for (var n = 0; n < string.length; n++) {\r\n var c = string.charCodeAt(n);\r\n\r\n if (c < 128) {\r\n utftext += String.fromCharCode(c);\r\n } else if (c > 127 && c < 2048) {\r\n utftext += String.fromCharCode((c >> 6) | 192); //eslint-disable-line no-bitwise\r\n utftext += String.fromCharCode((c & 63) | 128); //eslint-disable-line no-bitwise\r\n } else {\r\n utftext += String.fromCharCode((c >> 12) | 224); //eslint-disable-line no-bitwise\r\n utftext += String.fromCharCode(((c >> 6) & 63) | 128); //eslint-disable-line no-bitwise\r\n utftext += String.fromCharCode((c & 63) | 128); //eslint-disable-line no-bitwise\r\n }\r\n }\r\n return utftext;\r\n },\r\n\r\n // private method for UTF-8 decoding\r\n _utf8_decode: function(utftext: any) {\r\n var string = '';\r\n var i = 0;\r\n var c2, c3;\r\n var c = (c2 = 0);\r\n\r\n while (i < utftext.length) {\r\n c = utftext.charCodeAt(i);\r\n\r\n if (c < 128) {\r\n string += String.fromCharCode(c);\r\n i++;\r\n } else if (c > 191 && c < 224) {\r\n c2 = utftext.charCodeAt(i + 1);\r\n string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); //eslint-disable-line no-bitwise\r\n i += 2;\r\n } else {\r\n c2 = utftext.charCodeAt(i + 1);\r\n c3 = utftext.charCodeAt(i + 2);\r\n string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); //eslint-disable-line no-bitwise\r\n i += 3;\r\n }\r\n }\r\n return string;\r\n }\r\n};\r\n\r\nconst constructCheckoutBody = (\r\n ctx: IActionContext,\r\n protocol: any,\r\n cartData: Cart,\r\n hookUrl: any,\r\n buyerCookie: any,\r\n accountNum: any,\r\n productsWithAttributes: ProductWithAttributes[] | undefined\r\n) => {\r\n const cartLinesWithAttributes = cartData.CartLines?.map(item => {\r\n const itemWithAttributes: CartLineWithAttributes = {\r\n ...item,\r\n DynName: '',\r\n DynDescription: '',\r\n DynCurrency: '',\r\n DynExternalID: '',\r\n DynTebuErpSizes: '',\r\n DynSupplierName: '',\r\n DynCustomField1: '',\r\n DynCustomField2: '',\r\n DynCustomField3: '',\r\n DynCustomField4: '',\r\n DynCustomField5: '',\r\n DynFirstTebuDimension: {\r\n DynDimensionTypeValue: undefined,\r\n DynDimensionId: '',\r\n DynDimensionValue: ''\r\n }\r\n };\r\n\r\n const currentProduct = productsWithAttributes?.find(product => product.productDetails?.RecordId === item.ProductId);\r\n\r\n const externalItemId = currentProduct?.productSpecificationData?.find(\r\n attribute =>\r\n attribute.Name === 'External Item Id' ||\r\n attribute.Name === 'ERP_ExternalItemID' ||\r\n attribute.KeyName === 'ERPExternalItemID'\r\n )?.TextValue;\r\n\r\n const erpSize = currentProduct?.productSpecificationData?.find(\r\n attribute => attribute.Name === 'ERP_Sizes' || attribute.KeyName === 'ERPSizes'\r\n )?.TextValue;\r\n\r\n const supplierName = currentProduct?.productSpecificationData?.find(attribute => attribute.Name === 'Supplier Name')?.TextValue;\r\n\r\n const casNumber = currentProduct?.productSpecificationData?.find(attribute => attribute.Name === 'Cas number')?.TextValue;\r\n\r\n itemWithAttributes.DynName = currentProduct?.productDetails?.Name ?? '';\r\n\r\n itemWithAttributes.DynDescription = currentProduct?.productDetails?.Description ?? '';\r\n\r\n itemWithAttributes.DynCurrency = ctx.requestContext.channel?.Currency ?? '';\r\n\r\n if (externalItemId) {\r\n itemWithAttributes.DynExternalID = externalItemId;\r\n }\r\n if (erpSize) {\r\n itemWithAttributes.DynTebuErpSizes = erpSize;\r\n }\r\n if (supplierName) {\r\n itemWithAttributes.DynSupplierName = supplierName;\r\n }\r\n\r\n if (accountNum === 'NLCU-000011') {\r\n // Université Leiden\r\n itemWithAttributes.DynCustomField1 = '21';\r\n itemWithAttributes.DynCustomField2 = casNumber || '';\r\n }\r\n if (accountNum === 'DECU-000038') {\r\n // Eppendorf\r\n itemWithAttributes.DynCustomField1 = '19';\r\n }\r\n if (accountNum === 'NLCU-000001') {\r\n // UMC Utrecht\r\n itemWithAttributes.DynCustomField1 = '21';\r\n }\r\n\r\n const dimensions = (currentProduct?.productDetails?.Dimensions as ProductDimension[]) ?? [];\r\n const dimensionValue = dimensions[0]?.DimensionValue as ProductDimensionValue;\r\n\r\n itemWithAttributes.DynFirstTebuDimension.DynDimensionTypeValue = dimensions[0]?.DimensionTypeValue;\r\n itemWithAttributes.DynFirstTebuDimension.DynDimensionId = dimensionValue.DimensionId ?? '';\r\n itemWithAttributes.DynFirstTebuDimension.DynDimensionValue = dimensionValue.Value ?? '';\r\n\r\n return itemWithAttributes;\r\n });\r\n\r\n let cartWithAttributes: cartWithAttributes = { ...cartData, cartlinesWithAttributes: cartLinesWithAttributes };\r\n\r\n // Inversion dans Order du From et du To\r\n const fromCredentialDomain = window.sessionStorage.getItem('toCredentialDomain');\r\n const fromCredentialIdentity = window.sessionStorage.getItem('toCredentialIdentity');\r\n const toCredentialDomain = window.sessionStorage.getItem('fromCredentialDomain');\r\n const toCredentialIdentity = window.sessionStorage.getItem('fromCredentialDomain');\r\n const punchoutCurrency = window.sessionStorage.getItem('punchoutCurrency');\r\n\r\n const cartStringData = JSON.stringify(cartWithAttributes);\r\n // Construct POST request body\r\n return `{\"hookUrl\": \"${hookUrl}\",\"buyerCookie\": \"${buyerCookie}\",\"format\": \"${protocol}\",\"cart\": ${cartStringData}, \"fromCredentialDomain\": \"${fromCredentialDomain}\", \"fromCredentialIdentity\": \"${fromCredentialIdentity}\", \"toCredentialDomain\": \"${toCredentialDomain}\", \"toCredentialIdentity\": \"${toCredentialIdentity}\", \"currency\": \"${punchoutCurrency}\"}`;\r\n};\r\n\r\nexport const getCheckout = async (\r\n ctx: IActionContext,\r\n cart: Cart,\r\n hookUrl: any,\r\n config: IDynCheckoutPunchoutConfig,\r\n productsWithAttributes: ProductWithAttributes[] | undefined\r\n) => {\r\n return new Promise(async (resolve: (value?: any) => void, reject: (reason?: Error) => void) => {\r\n // Construct the URL and request body\r\n //let ropcCheckoutUrl: string;\r\n\r\n const protocol = window.sessionStorage.getItem('protocol');\r\n const token = window.sessionStorage.getItem('token') as string;\r\n const buyerCookie = window.sessionStorage.getItem('buyerCookie');\r\n const ropcCheckoutUrl = config?.azureFunctionUrl || '';\r\n const accountNum = window.sessionStorage.getItem('accountNum') || '';\r\n\r\n if (ropcCheckoutUrl === '') {\r\n throw new Error('No url for the AzureFunction defined');\r\n } else {\r\n console.log(ropcCheckoutUrl);\r\n }\r\n\r\n const ropcCheckoutRequestBody = constructCheckoutBody(\r\n ctx,\r\n protocol,\r\n cart,\r\n hookUrl,\r\n buyerCookie,\r\n accountNum,\r\n productsWithAttributes\r\n );\r\n\r\n try {\r\n const ropcCheckoutRequest = await fetch(ropcCheckoutUrl, {\r\n method: 'POST',\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-Type': 'application/json',\r\n accept: '*/*'\r\n },\r\n body: ropcCheckoutRequestBody\r\n });\r\n\r\n resolve(ropcCheckoutRequest);\r\n // console.log(ropcCheckoutRequest);\r\n if (ropcCheckoutRequest.status === 200) {\r\n // Modal OK => redirect to page request/ canal/po-confirmation\r\n console.log('Order OK');\r\n\r\n // Read the ReadableStream response body\r\n const reader = ropcCheckoutRequest.body?.getReader();\r\n const decoder = new TextDecoder();\r\n let responseEncodedBody = '';\r\n let done = false;\r\n if (reader != null) {\r\n while (!done) {\r\n const { value, done: chunkDone } = await reader.read();\r\n done = chunkDone;\r\n\r\n if (!done) {\r\n responseEncodedBody += decoder.decode(value);\r\n }\r\n }\r\n }\r\n // const responseBody = atob(responseEncodedBody);\r\n // console.log(responseBody);\r\n const urlEncodedResponseEncodedBody = encodeURIComponent(responseEncodedBody);\r\n window.location.assign(`${ctx.requestContext.sitePath}/po-confirmation/?form=${urlEncodedResponseEncodedBody}`);\r\n } else {\r\n // Modal NOK => redirect to page canal/po-ko\r\n console.log('Order NOK');\r\n window.location.assign(`${ctx.requestContext.sitePath}/po-failed`);\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n if (error instanceof Error) {\r\n reject(error);\r\n } else {\r\n throw new Error('Proceed punchout failed');\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport default async (\r\n ctx: IActionContext,\r\n config: IDynCheckoutPunchoutConfig,\r\n checkoutState: ICheckoutState | undefined,\r\n orderedProducts: SimpleProduct[] | undefined,\r\n productsWithAttributes: ProductWithAttributes[] | undefined\r\n) => {\r\n return new Promise(async (resolve: (value?: any) => void, reject: (reason?: Error) => void) => {\r\n let cart: Cart;\r\n\r\n // Proceed checkout\r\n try {\r\n cart = await checkout(ctx);\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n reject(error);\r\n } else {\r\n throw new Error('Proceed punchout failed');\r\n }\r\n return;\r\n }\r\n //send cart-JSON to caller\r\n // const retValue = Base64.encode(JSON.stringify(cart));\r\n // console.log(retValue);\r\n\r\n let requestResponse;\r\n const hookUrl = window.sessionStorage.getItem('hookUrl');\r\n\r\n try {\r\n requestResponse = await getCheckout(ctx, cart, hookUrl, config, productsWithAttributes);\r\n console.log(requestResponse);\r\n } catch (error) {\r\n console.log(error);\r\n if (error instanceof Error) {\r\n reject(error);\r\n } else {\r\n throw new Error('Calling AzureFunction for punchOut');\r\n }\r\n return;\r\n }\r\n\r\n // Remove purchased items from the active cart\r\n try {\r\n await emptyActiveCart(ctx);\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n reject(error);\r\n } else {\r\n throw new Error('Remove purchased items from the active cart failed');\r\n }\r\n return;\r\n }\r\n resolve(requestResponse);\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { Cart, CartLineValidationResults, AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { ReleasedProductType, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IModuleStateManager, IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport {\r\n ArrayExtensions,\r\n getAvailabilitiesForCartLineItems,\r\n ProductAvailabilitiesForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n Waiting\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport { computed, reaction, when } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\n\r\nimport { IDynCheckoutPunchoutData } from './dyn-checkout-punchout.data';\r\nimport { ICheckoutHeadingData, IDynCheckoutPunchoutProps } from './dyn-checkout-punchout.props.autogenerated';\r\nimport AlertComponent from './components/alert';\r\nimport { getInvoicePaymentSummary, IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\r\nimport { getLineItems, ILineItems } from './components/get-line-items';\r\nimport { getOrderSummary, IOrderSummary } from './components/get-order-summary';\r\nimport GuidedFormComponent from './components/guided-form';\r\nimport PlaceOrderButtonComponent from './components/place-order-button';\r\n//import * as dynPOTools from './tools/punchout-tools';\r\n//import * as auth from '@msdyn365-commerce/runtime-internal/dist/types/utils/ropc-auth-utils';\r\nimport placeOrder from './methods/dyn-place-order';\r\n//import jwtDecode from 'jwt-decode';\r\n//import { getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\n//import { EmailRegex } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nexport * from './components/get-line-items';\r\nexport * from './components/get-order-summary';\r\n\r\nimport { AttributesForSelectedVariantInput, getAttributesForSelectedVariant } from '@msdyn365-commerce-modules/product-specification';\r\n\r\n//import { getUserInformationROPC, getAuthenticationWebApi } from './tools/ropc-auth-utils';\r\n\r\n//import emptyActiveCart from './methods/empty-active-cart';\r\n\r\n// const credentials = {\r\n// loginDomain: 'tebubiob2b.b2clogin.com',\r\n// b2cTenant: 'tebubiob2b',\r\n// nativeApplicationId: 'ab2ae97f-5cff-40db-bbda-d6e71ad7ed66',\r\n// ropcUserFlowName: 'B2C_1_ROPC_Auth',\r\n// userImpersonationScopeURL: 'https://tebubiob2b.onmicrosoft.com/ab2ae97f-5cff-40db-bbda-d6e71ad7ed66/user_impersonation',\r\n// username: '',\r\n// password: ''\r\n// };\r\n\r\ntype DeviceType = 'Mobile';\r\n\r\ninterface ICheckoutState {\r\n errorMessage: string;\r\n isValidationPassed: boolean;\r\n isPlaceOrderLoading?: boolean;\r\n}\r\n\r\nexport interface ICheckoutViewProps extends IDynCheckoutPunchoutProps {\r\n className: string;\r\n canShow?: boolean;\r\n isEmptyCart?: boolean;\r\n isConsentGiven?: boolean;\r\n hasError?: boolean;\r\n cartStatus?: string;\r\n isMobile?: boolean;\r\n isEditorialMode?: boolean;\r\n backToShoppingUrl?: string;\r\n editCartLink?: string;\r\n hasSalesOrder: boolean;\r\n hasInvoiceLine?: boolean;\r\n\r\n checkoutProps: IModuleProps;\r\n headerProps: INodeProps;\r\n bodyProps: INodeProps;\r\n mainProps: INodeProps;\r\n mainControlProps: INodeProps;\r\n sideProps: INodeProps;\r\n sideControlFirstProps: INodeProps;\r\n sideControlSecondProps: INodeProps;\r\n termsAndConditionsProps: INodeProps;\r\n\r\n guidedForm?: React.ReactNode;\r\n title?: React.ReactNode;\r\n loading?: React.ReactNode;\r\n alert?: React.ReactNode;\r\n orderSummary?: IOrderSummary;\r\n invoicePaymentSummary?: IInvoicePaymentSummary;\r\n lineItems?: ILineItems;\r\n placeOrderButton?: React.ReactNode;\r\n termsAndConditions?: React.ReactNode;\r\n keepShoppingButton?: React.ReactNode;\r\n orderConfirmation?: React.ReactNode;\r\n}\r\n\r\nexport interface ICheckoutModuleProps extends IDynCheckoutPunchoutProps, IModuleStateProps {}\r\n\r\nexport interface ProductWithAttributes {\r\n productDetails: SimpleProduct | undefined;\r\n productSpecificationData: AttributeValue[] | null;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutContainer component.\r\n * @extends {React.Component}\r\n */\r\n// @ts-expect-error\r\n@withModuleState\r\n@observer\r\nclass Checkout extends React.PureComponent {\r\n @computed get cartStatus(): Msdyn365.AsyncResultStatus {\r\n return this.props.data.checkout?.status;\r\n }\r\n\r\n @computed get isEmptyCart(): boolean {\r\n if (this.isEditorialMode) {\r\n // Editorial mode: Ignore empty cart\r\n return false;\r\n }\r\n const cart = this.props.data.checkout?.result?.checkoutCart?.cart;\r\n return this.cartStatus === 'SUCCESS' && !!cart && !isEmpty(cart) && (!cart.CartLines || cart.CartLines.length === 0);\r\n }\r\n\r\n @computed get hasError(): boolean {\r\n const cart = this.props.data.checkout?.result?.checkoutCart?.cart;\r\n return this.cartStatus === 'FAILED' || (this.cartStatus === 'SUCCESS' && (!cart || isEmpty(cart)));\r\n }\r\n\r\n @computed get isEditorialMode(): boolean {\r\n return this.props.context.request.params.isEditor;\r\n }\r\n\r\n @computed get canPlaceOrder(): boolean {\r\n const isTermsAndConditionAccepted = this.props.data.checkout.result && this.props.data.checkout.result?.isTermsAndConditionAccepted;\r\n\r\n // If isTermsAndConditionAccepted is undefined means TermsAndCondition module is not added to page and we should able to place order.\r\n return (\r\n this.props.moduleState.isReady &&\r\n (isTermsAndConditionAccepted === undefined || isTermsAndConditionAccepted) &&\r\n this.state.errorMessage === ''\r\n );\r\n }\r\n\r\n @computed get isCartReady(): boolean {\r\n return (\r\n !!this.props.data.checkout.result?.checkoutCart?.cart &&\r\n this.props.data.customerInformation.status !== 'LOADING' &&\r\n this.props.data.featureState.status !== 'LOADING'\r\n );\r\n }\r\n\r\n public state: ICheckoutState = {\r\n errorMessage: '',\r\n isValidationPassed: false,\r\n isPlaceOrderLoading: false\r\n };\r\n\r\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n\r\n private _getProductAttribute = async (product: SimpleProduct, actionContext: any) => {\r\n const actionInput = new AttributesForSelectedVariantInput(\r\n product.RecordId,\r\n +actionContext.requestContext.apiSettings.channelId,\r\n product\r\n );\r\n\r\n return getAttributesForSelectedVariant(actionInput, this.props.context.actionContext).catch((error: Error) => {\r\n console.log(error);\r\n });\r\n };\r\n\r\n public ProductsWithAttributes: ProductWithAttributes[] = [];\r\n\r\n public async componentDidMount(): Promise {\r\n const {\r\n resources: { genericErrorMessage }\r\n } = this.props;\r\n\r\n //const mappedDimensions: ProductDimensionFull[] = [];\r\n const products = await this.props.data.products;\r\n for (let i = 0; i < products.length; i++) {\r\n if (products[i]) {\r\n // Récupération des attributs\r\n let attributes = await this._getProductAttribute(products[i], this.props.context.actionContext);\r\n this.ProductsWithAttributes.push({\r\n productDetails: products[i],\r\n productSpecificationData: attributes ?? attributes !== undefined ? attributes : null\r\n });\r\n }\r\n }\r\n\r\n when(\r\n () => this.hasError,\r\n () => {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.context.telemetry.error('Failed to get cart');\r\n }\r\n );\r\n //if the cart is empty, it does not make any sense to continue, but to redirect the request to the home-page\r\n // and to check if additional arguments are available that might been set by the login-request from the AzureFunctions*\r\n // => replaced by OCI and CXML access modules\r\n // when(\r\n // () => {\r\n // return this.isEmptyCart;\r\n // },\r\n // () => {\r\n // void this.loginAndRedirectHome('Welcome to PuchOut');\r\n // }\r\n // );\r\n\r\n when(\r\n () => this.isCartReady,\r\n () => {\r\n this.validateForCheckout();\r\n }\r\n );\r\n\r\n reaction(\r\n () => this.props.moduleState.isReady,\r\n () => {\r\n this.onContainerReady();\r\n }\r\n );\r\n\r\n // Reaction to call place order when isPaymentSectionContainerReady is true for new checkout flow.\r\n reaction(\r\n () => this.props.data.checkout.result?.isPaymentSectionContainerReady,\r\n async isReady => {\r\n if (this.props.data.checkout.result && isReady && !this.props.data.checkout.result.redirectAdditionalContext) {\r\n if (!this.state.isPlaceOrderLoading) {\r\n this.setState({ isPlaceOrderLoading: true });\r\n }\r\n\r\n await this.onPlaceOrder();\r\n this.setState({ isPlaceOrderLoading: false });\r\n }\r\n }\r\n );\r\n\r\n // Reaction to enable place order button when isPaymentSectionContainerHasError is true for new checkout flow.\r\n reaction(\r\n () => this.props.data.checkout.result?.isTermsAndConditionAccepted,\r\n hasError => {\r\n if (this.props.data.checkout.result && hasError) {\r\n this.setState({ isPlaceOrderLoading: false });\r\n }\r\n }\r\n );\r\n\r\n // Reaction to enable place order button when redirection is true for new checkout flow.\r\n reaction(\r\n () => this.canPlaceOrder,\r\n async () => {\r\n if (this.props.data.checkout.result && this.canPlaceOrder) {\r\n const { requestFormData, query } = this.props.context.request;\r\n const isRedirection = !!(requestFormData && query && query.pv === '1');\r\n if (isRedirection) {\r\n await this.props.data.checkout.result.updateIsPlaceOrderEnabledInRedirection({\r\n newIsPlaceOrderEnabledInRedirection: true\r\n });\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line complexity -- ignore the complexity.\r\n public render(): JSX.Element {\r\n const {\r\n moduleState,\r\n config: { className, checkoutHeading, disableGuidedCheckoutFlow },\r\n resources\r\n } = this.props;\r\n const { errorMessage } = this.state;\r\n const { backToShopping, placeOrderText, confirmPaymentText, cookieConsentRequiredMessage, genericErrorMessage } = resources;\r\n const checkoutClass = classnames('ms-checkout', className);\r\n const checkoutInformation = this.getSlotItems('checkoutInformation');\r\n\r\n const isConsentGiven =\r\n this.props.context.request &&\r\n this.props.context.request.cookies &&\r\n this.props.context.request.cookies.isConsentGiven &&\r\n this.props.context.request.cookies.isConsentGiven();\r\n\r\n const isMobile =\r\n this.props.context.request &&\r\n this.props.context.request.device &&\r\n (this.props.context.request.device.Type as DeviceType) === 'Mobile';\r\n\r\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\r\n const editCartLink = Msdyn365.getUrlSync('cart', this.props.context.actionContext) || '';\r\n\r\n const termsAndConditions =\r\n this.props.slots.termsAndConditions && this.props.slots.termsAndConditions.length > 0 && this.props.slots.termsAndConditions[0];\r\n\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\r\n const backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n\r\n const hasInvoiceLine = this.props.data.checkout && this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\r\n const checkoutBtnText = hasInvoiceLine ? confirmPaymentText : placeOrderText;\r\n\r\n let viewProps: ICheckoutViewProps = {\r\n ...this.props,\r\n className: checkoutClass,\r\n isEmptyCart: this.isEmptyCart,\r\n isConsentGiven,\r\n hasError: this.hasError,\r\n hasSalesOrder:\r\n this.props.data.checkout &&\r\n this.props.data.checkout.result !== undefined &&\r\n this.props.data.checkout.result.salesOrder !== undefined,\r\n hasInvoiceLine,\r\n cartStatus: this.cartStatus,\r\n isMobile,\r\n backToShoppingUrl,\r\n editCartLink,\r\n isEditorialMode: this.isEditorialMode,\r\n orderConfirmation:\r\n this.props.slots.orderConfirmation && this.props.slots.orderConfirmation.length > 0\r\n ? this.props.slots.orderConfirmation[0]\r\n : undefined,\r\n checkoutProps: { moduleProps: this.props, className: checkoutClass },\r\n headerProps: { className: 'ms-checkout__head' },\r\n bodyProps: { className: 'ms-checkout__body' },\r\n mainProps: { className: 'ms-checkout__main' },\r\n mainControlProps: { className: 'ms-checkout__main-control' },\r\n sideProps: { className: 'ms-checkout__side' },\r\n sideControlFirstProps: { className: 'ms-checkout__side-control-first' },\r\n sideControlSecondProps: { className: 'ms-checkout__side-control-second' },\r\n termsAndConditionsProps: { className: 'ms-checkout__terms-and-conditions' },\r\n title: checkoutHeading && this.renderMsdyn365Text(checkoutHeading)\r\n };\r\n\r\n if (!isConsentGiven) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: \r\n };\r\n } else if (this.isLoading()) {\r\n viewProps = {\r\n ...viewProps,\r\n loading: \r\n };\r\n } else if (this.hasError) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: \r\n };\r\n } else {\r\n // const shouldEnableSinglePaymentAuthorizationCheckout: boolean =\r\n // this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\r\n\r\n viewProps = {\r\n ...viewProps,\r\n alert: errorMessage && ,\r\n canShow: true,\r\n guidedForm: checkoutInformation ? (\r\n \r\n ) : (\r\n undefined\r\n ),\r\n orderSummary: getOrderSummary(this.props),\r\n invoicePaymentSummary: getInvoicePaymentSummary(this.props),\r\n lineItems: hasInvoiceLine ? undefined : getLineItems(this.props, this.ProductsWithAttributes, this.telemetryContent),\r\n placeOrderButton: (\r\n \r\n ),\r\n termsAndConditions,\r\n keepShoppingButton: backToShoppingUrl && (\r\n \r\n {backToShopping}\r\n \r\n )\r\n };\r\n }\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n public renderMsdyn365Text(checkoutHeading: ICheckoutHeadingData): React.ReactNode {\r\n return (\r\n \r\n );\r\n }\r\n\r\n public handleCheckoutHeadingChange = (event: Msdyn365.ContentEditableEvent) =>\r\n (this.props.config.checkoutHeading!.text = event.target.value);\r\n\r\n private readonly isLoading = (): boolean => {\r\n return !this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart || !this.state.isValidationPassed;\r\n };\r\n\r\n private readonly getSlotItems = (key: string): React.ReactNode[] | undefined => {\r\n const { slots } = this.props;\r\n return slots && slots[key] && slots[key].length > 0 ? slots[key] : undefined;\r\n };\r\n\r\n private readonly onPlaceOrder = async (): Promise => {\r\n const {\r\n resources: { checkoutOutOfStockErrorMessage, genericErrorMessage, invalidCartVersionErrorMessage },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { enableStockCheck = false }\r\n }\r\n },\r\n data: { checkout, products }\r\n } = this.props;\r\n\r\n // If hasInvoiceLine is true, no inventory check\r\n if (\r\n !this.props.data.checkout.result?.checkoutCart.hasInvoiceLine &&\r\n enableStockCheck &&\r\n (await this.isOverMaxQuantity((await checkout).checkoutCart.cart, await products))\r\n ) {\r\n this.setState({\r\n errorMessage: checkoutOutOfStockErrorMessage\r\n });\r\n this.props.context.telemetry.error(checkoutOutOfStockErrorMessage);\r\n } else {\r\n await placeOrder(\r\n actionContext,\r\n this.props.config,\r\n this.props.data.checkout.result,\r\n this.props.data.products.result,\r\n this.ProductsWithAttributes\r\n )\r\n .then(ropcCheckoutRequest => {\r\n console.log(ropcCheckoutRequest);\r\n })\r\n .catch(error => {\r\n let errorMessage = genericErrorMessage;\r\n\r\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n errorMessage = invalidCartVersionErrorMessage;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown error type.\r\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && error.data?.AdditionalContext) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n errorMessage\r\n });\r\n this.props.telemetry.exception(error);\r\n console.log(error);\r\n console.log(errorMessage);\r\n });\r\n }\r\n\r\n console.log(actionContext);\r\n };\r\n\r\n /**\r\n * Return true if any product in the cart is over its max quantity.\r\n * @param cart -- The checkout cart.\r\n * @param products -- The checkout products.\r\n * @returns -- Is any product in the cart is over max quantity.\r\n */\r\n private readonly isOverMaxQuantity = async (cart: Cart, products: SimpleProduct[]): Promise => {\r\n let isOverMaxQuantity = false;\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n await getAvailabilitiesForCartLineItems(\r\n new ProductAvailabilitiesForCartLineItems(this.props.context.actionContext.requestContext.apiSettings),\r\n this.props.context.actionContext\r\n )\r\n .then(productInventoryInformation => {\r\n cart.CartLines?.map(cartline => {\r\n const cartlineProduct = products.find(product => product.RecordId === cartline.ProductId);\r\n const isServiceItem = cartlineProduct?.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n // If product is service item or cartline is electronic delivery, then no inventory check\r\n if (\r\n !isServiceItem &&\r\n cartline.DeliveryMode !== emailDeliveryModeCode &&\r\n ArrayExtensions.hasElements(productInventoryInformation)\r\n ) {\r\n const foundProductAvailability = productInventoryInformation.find(productInventory => {\r\n return productInventory.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n\r\n if (\r\n !(\r\n foundProductAvailability?.IsProductAvailable &&\r\n foundProductAvailability.ProductAvailableQuantity.AvailableQuantity !== undefined &&\r\n cartline.Quantity &&\r\n cartline.Quantity <= foundProductAvailability.ProductAvailableQuantity.AvailableQuantity\r\n )\r\n ) {\r\n isOverMaxQuantity = true;\r\n }\r\n }\r\n });\r\n })\r\n .catch(error => {\r\n this.props.context.actionContext.telemetry.exception(error);\r\n throw new Error('[getAvailabilitiesForCartLineItems] Unable to get availabilities for products in checkout cart');\r\n });\r\n\r\n return isOverMaxQuantity;\r\n };\r\n\r\n private readonly getActiveChildModuleStates = (): IModuleStateManager[] => {\r\n const { childIds, getModule } = this.props.moduleState;\r\n return childIds\r\n .map(getModule)\r\n .filter((state): state is IModuleStateManager => !!state && !state.isDisabled && state.hasModuleState);\r\n };\r\n\r\n private readonly onContainerReady = (): void => {\r\n this.getActiveChildModuleStates().forEach(state => {\r\n state.isReady && state.onContainerReady && state.onContainerReady();\r\n });\r\n };\r\n\r\n // private readonly isEmailValid = (email: string): boolean => {\r\n // return EmailRegex.defaultRegex.test(email);\r\n // };\r\n\r\n //reads username and password from credentials. Username must have an email-format\r\n // private readonly readUserCredentials = (): string[] => {\r\n // const requestContext = this.props.context.request;\r\n\r\n // const query = requestContext.query;\r\n // var username: string = query?.username || '';\r\n // var password: string = query?.password || '';\r\n\r\n // return [username, password];\r\n // };\r\n\r\n private readonly redirectToCartPage = (notFoundEditCartLinkMessage: string): void => {\r\n const editCartLink = Msdyn365.getUrlSync('cart', this.props.context.actionContext) || '';\r\n if (window && editCartLink) {\r\n window.location.assign(editCartLink);\r\n } else {\r\n this.setState({\r\n errorMessage: this.props.resources.genericErrorMessage\r\n });\r\n this.props.context.telemetry.error(notFoundEditCartLinkMessage);\r\n }\r\n };\r\n\r\n // decodes JWT access-token and updates state with token-infos\r\n // private injectUserToken = async (userCreds: any) => {\r\n // var userInfo = this.props.context.actionContext.requestContext.user;\r\n // const decodedToken: any = await jwtDecode(userCreds.token);\r\n // userInfo = {\r\n // ...userInfo,\r\n // ...{\r\n // token: userCreds.token,\r\n // isAuthenticated: true,\r\n // emailAddress: decodedToken.emails[0] || '',\r\n // firstName: decodedToken.given_name || '',\r\n // lastName: decodedToken.family_name || '',\r\n // name: `${decodedToken.given_name} ${decodedToken.family_name}`,\r\n // signinName: `${decodedToken.given_name} ${decodedToken.family_name}`,\r\n // customerAccountNumber: '',\r\n // tenantId: decodedToken.aud\r\n // }\r\n // };\r\n\r\n // //var context = this.props.context;\r\n // //The customerInformation must be initialized here. Later vavailable with:\r\n // //this.props.data.customerInformation.result\r\n // //customerInfo is containing the customerAccount, catalogId, settings like b2c/b2b, etc\r\n // //var customerInput = new GetCustomerInput(context.actionContext.requestContext.apiSettings);\r\n // //const customer = await getCustomer(customerInput, context.actionContext);\r\n\r\n // //TODO the server-side session must be set here (currently not working).\r\n // window.sessionStorage.setItem('token', userCreds.token); //if the authentication/login is done, the token needs to be added\r\n // //it is used to identify the current session as punchout-login.\r\n\r\n // this.setState(userInfo);\r\n // //TODO: not sure if this is needed.\r\n // this.props.context.request.user = userInfo;\r\n // this.props.context.actionContext.requestContext.user = userInfo;\r\n // //updating the cart with the customerInfo !\r\n // //const cart = this.props.data.checkout.result!.checkoutCart.cart;\r\n // };\r\n\r\n //ROPC authentication\r\n // private getUserToken = async (credentials: any, isSignOut: boolean) => {\r\n // const userCreds = await getUserInformationROPC(credentials);\r\n // window.sessionStorage.setItem('token', userCreds?.token ?? ''); //used for replying to AzureFunction\r\n // return userCreds;\r\n // };\r\n\r\n private isPunchOutParameters(): boolean {\r\n var retValue: boolean = false;\r\n\r\n // const requestContext = this.props.context.request;\r\n // const query = requestContext.query;\r\n\r\n // const replyUrl: string = query?.hookUrl || '';\r\n // const protocol: string = query?.protocol || '';\r\n // const buyerCookie: string = query?.buyerCookie || '';\r\n // const username: string = query?.username || '';\r\n // const password: string = query?.password || '';\r\n\r\n const isPunchout: string = window.sessionStorage.getItem('isPunchout') as string;\r\n\r\n if (isPunchout && isPunchout === '1') {\r\n retValue = true;\r\n }\r\n\r\n return retValue;\r\n }\r\n\r\n // private setPunchOutParameters() {\r\n // const [username, password] = this.readUserCredentials();\r\n // //updates the global credentials with username and password\r\n // credentials.username = username;\r\n // credentials.password = password;\r\n\r\n // if (!this.isEmailValid(username)) {\r\n // throw new Error(this.props.resources.usernameEmailFormatError);\r\n // }\r\n\r\n // const requestContext = this.props.context.request;\r\n // const query = requestContext.query;\r\n\r\n // const replyUrl: string = query?.hookUrl || '';\r\n // const protocol: string = query?.protocol || '';\r\n // const buyerCookie: string = query?.buyerCookie || '';\r\n\r\n // if (replyUrl && protocol && buyerCookie) {\r\n // //protocol and hookUrl to sessionStorage, as they are used later when validating the purchase (place-orders)\r\n // window.sessionStorage.setItem('hookUrl', replyUrl);\r\n // window.sessionStorage.setItem('protocol', protocol);\r\n // window.sessionStorage.setItem('buyerCookie', buyerCookie);\r\n // }\r\n // }\r\n\r\n //gets the information from the logon request (replyUrl, protocol and buyerCookie)\r\n //if logon-request, redirect to homepage, otherwise checkout\r\n // private readonly loginAndRedirectHome = async (notFoundEditCartLinkMessage: string) => {\r\n // const editHomeLink = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\r\n // if (window && editHomeLink) {\r\n // //all 4 args (username, password, hookUrl and protocol) must be declared to proceed the login request\r\n // if (this.isPunchOutParameters()) {\r\n // if (!this.isEmptyCart) {\r\n // window.location.assign(editHomeLink); //no login with existing cart as the cart will be recreated\r\n // }\r\n\r\n // this.setPunchOutParameters();\r\n // //AAD B2C authentication\r\n // //Reset of the session-cart independently of the user-cart not possible (session sync with user)\r\n\r\n // // this.props.context.request.cookies.setCartCookie(newCart, this.props.context.request.user.isAuthenticated);\r\n\r\n // //TODO: bypass authentication because off isssues with localhost (certificate)\r\n // //Needs to be removed after MS implementation of the ROPC authentication\r\n // //if (!this.props.context.request.user.isAuthenticated) {\r\n // try {\r\n // //TODO: doesn't work :-()\r\n // //TODO: requires new implementation of the new MS authentication in injectUserToken\r\n // //TODO: After what I understood of the MS impl., it requires to communicate the token\r\n // const userCreds = await this.getUserToken(credentials, false); //access-token, id_token, code\r\n // if (userCreds?.token) {\r\n // const protocol: string = window.sessionStorage.getItem('protocol') as string;\r\n // const replyUrl = window.sessionStorage.getItem('replyUrl') as string;\r\n // await getAuthenticationWebApi(userCreds.token, protocol, credentials.username, credentials.password, replyUrl);\r\n // //await this.injectUserToken(userCreds); //TODO: here to implement\r\n // window.location.assign(editHomeLink);\r\n // }\r\n // } catch {\r\n // this.props.context.telemetry.error('Authentication failed');\r\n // window.location.assign(editHomeLink);\r\n // }\r\n // // } else {\r\n // // this.props.context.telemetry.error(notFoundEditCartLinkMessage);\r\n // // window.location.assign(editHomeLink);\r\n // // }\r\n // } else {\r\n // this.props.context.telemetry.error(notFoundEditCartLinkMessage);\r\n // window.location.assign(editHomeLink);\r\n // }\r\n // }\r\n // };\r\n\r\n private readonly validateForCheckout = async (retry: boolean = true) => {\r\n //in this case, the cart might not be empty, but the login-modus (with parameters) has been called.\r\n //THat might be, that the current user is different from the PunchOut-user (re sign-in), or that the\r\n //current user has some obsolete istems in the cart and wishes to login again for the punchout.\r\n //First verfify the punchout-login by checking the token:\r\n const token = window.sessionStorage.getItem('token') as string;\r\n //sends the user to the error page, as he's not done the login with punchout\r\n if (token === '') {\r\n const editCartLink = Msdyn365.getUrlSync('PunchOutOccupiedError', this.props.context.actionContext) || '';\r\n window.location.assign(editCartLink);\r\n }\r\n\r\n if (this.isPunchOutParameters()) {\r\n //gets the information from the logon request (replyUrl, protocol and buyerCookie)\r\n //if logon-request, redirect to homepage, otherwise checkout\r\n // We empty the cart each time this page is accessed fro a new punchout session\r\n //await emptyActiveCart(this.props.context.actionContext);\r\n //this.setPunchOutParameters();\r\n //all 4 args (username, password, hookUrl and protocol) must be declared to proceed the login request\r\n // this.props.context.request.user;\r\n // try {\r\n // const userCreds = await this.getUserToken(credentials, false); //access-token, id_token, code\r\n // if (userCreds?.token) {\r\n // const protocol: string = window.sessionStorage.getItem('protocol') as string;\r\n // const replyUrl = window.sessionStorage.getItem('replyUrl') as string;\r\n // await getAuthenticationWebApi(userCreds.token, protocol, credentials.username, credentials.password, replyUrl);\r\n // //await this.injectUserToken(userCreds); //TODO: here to implement\r\n // }\r\n // } catch {\r\n // this.props.context.telemetry.error('Authentication failed');\r\n // }\r\n }\r\n const notFoundEditCartLinkMessage = \"Cart doesn't pass validation, but no editCartLink found\";\r\n const cart = this.props.data.checkout.result!.checkoutCart.cart;\r\n const { Id, Version } = cart;\r\n const isOrderQuantityLimitsFeatureEnabledInHq =\r\n this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n const customerInfo = this.props.data.customerInformation.result;\r\n\r\n //both configuration (b2c and b2b) are supported. B2C on Demo and B2B on PreProd\r\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\r\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\r\n (customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\r\n if (isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings) {\r\n if (Version && Id) {\r\n validateForCheckoutAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n bypassCache: 'none'\r\n },\r\n Id,\r\n Version\r\n )\r\n .then((result: CartLineValidationResults) => {\r\n if (result.ValidationFailuresByCartLines?.length !== 0) {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n } else {\r\n this.setState({\r\n isValidationPassed: true\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n const cartState = this.props.data.checkout.result?.checkoutCart;\r\n cartState\r\n ?.refreshCart({})\r\n .then(() => {\r\n this.validateForCheckout(false);\r\n })\r\n .catch((refreshError: Error) => {\r\n this.props.telemetry.warning(refreshError.message);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n });\r\n } else {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n }\r\n });\r\n } else {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n }\r\n } else {\r\n this.setState({ isValidationPassed: true });\r\n }\r\n };\r\n}\r\n\r\nexport default Checkout;\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from './dyn-checkout-punchout';\r\nimport { IEmailDelivery } from './components';\r\nimport { IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\r\n\r\nexport const PickUpAtStoreComponent: React.FC = ({ PickUpAtStore, label, location }) => (\r\n \r\n {label}\r\n {location}\r\n \r\n);\r\n\r\nexport const EmailDeliveryComponent: React.FC = ({ EmailDelivery, label }) => {label};\r\n\r\nexport const LineItemComponent: React.FC = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\r\n \r\n {item}\r\n {pickUpAtStore && }\r\n {emailDelivery && }\r\n \r\n);\r\n\r\nexport const LineItemGroupComponent: React.FC = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\r\n \r\n {heading}\r\n \r\n {lineItems.map(lineItem => (\r\n \r\n ))}\r\n \r\n \r\n);\r\n\r\nexport const LineItemGroupComponentWithMultiplePickUp: React.FC = ({\r\n LineItemDeliveryGroup,\r\n LineItemList,\r\n heading,\r\n lineItems,\r\n lineItemWraper,\r\n lineItemWraperIcon\r\n}) => (\r\n \r\n {lineItemWraperIcon}\r\n {lineItemWraper}\r\n {heading}\r\n \r\n {lineItems.map(lineItem => (\r\n \r\n ))}\r\n \r\n \r\n);\r\n\r\nexport const LineItemComponentWithMultiplePickUp: React.FC = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\r\n \r\n {item}\r\n {emailDelivery && }\r\n \r\n);\r\n\r\nexport const PickUpAtStoreComponentWithMultiplePickUp: React.FC = ({ PickUpAtStore, label, location }) => (\r\n \r\n {label}\r\n {location}\r\n \r\n);\r\n\r\nexport const LineItemsComponent: React.FC = ({\r\n LineItems,\r\n Header,\r\n heading,\r\n editLink,\r\n itemsForPickup,\r\n itemsForShip,\r\n itemsForEmail,\r\n itemsGroupWithMulitplePickupMode\r\n}) => (\r\n \r\n \r\n {heading}\r\n {editLink}\r\n \r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForPickup && }\r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForEmail && }\r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForShip && }\r\n {itemsGroupWithMulitplePickupMode !== undefined\r\n ? itemsGroupWithMulitplePickupMode.map((item, index) => {\r\n return ;\r\n })\r\n : null}\r\n \r\n);\r\n\r\nconst OrderSummaryComponent: React.FC = ({ heading, lines }) => (\r\n
\r\n {heading}\r\n
\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.otherCharge}\r\n {lines.tax}\r\n {lines.totalDiscounts}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n \r\n )}\r\n
\r\n
\r\n);\r\n\r\nconst PaymentSummaryComponent: React.FC = ({ heading, lines }) => (\r\n
\r\n {heading}\r\n
\r\n {lines && (\r\n <>\r\n {lines.invoices}\r\n {lines.giftCard}\r\n {lines.loyalty}\r\n {lines.orderTotal}\r\n \r\n )}\r\n
\r\n
\r\n);\r\n\r\nconst CheckoutView: React.FC = props => {\r\n const {\r\n canShow,\r\n checkoutProps,\r\n headerProps,\r\n hasSalesOrder,\r\n hasInvoiceLine,\r\n bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n sideControlFirstProps,\r\n sideControlSecondProps,\r\n termsAndConditionsProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n orderSummary,\r\n invoicePaymentSummary,\r\n lineItems,\r\n placeOrderButton,\r\n termsAndConditions,\r\n keepShoppingButton\r\n } = props;\r\n\r\n return (\r\n \r\n {!hasSalesOrder && {title}}\r\n {!hasSalesOrder && (\r\n \r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n \r\n {guidedForm}\r\n {termsAndConditions}\r\n \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n \r\n \r\n {!hasInvoiceLine\r\n ? orderSummary && \r\n : invoicePaymentSummary && }\r\n \r\n {termsAndConditions}\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n {lineItems && }\r\n \r\n {termsAndConditions}\r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n {hasSalesOrder && orderConfirmation}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutView;\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 * as React from 'react';\r\n\r\ninterface IAlertProps {\r\n message: string;\r\n}\r\n\r\nconst CheckoutAlert: React.FC = ({ message }) => (\r\n

\r\n {message}\r\n

\r\n);\r\n\r\nexport default CheckoutAlert;\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 { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\n\r\nimport { IDynCheckoutData } from '../dyn-checkout.data';\r\nimport { IDynCheckoutProps } from '../dyn-checkout.props.autogenerated';\r\n\r\nexport interface IInvoicePaymentSummary {\r\n heading?: React.ReactNode;\r\n lines?: IInvoiceSummaryLines;\r\n}\r\nexport const getInvoicePaymentSummary = (input: IDynCheckoutProps): IInvoicePaymentSummary => {\r\n const {\r\n data: { checkout },\r\n resources: { totalAmountLabel, invoiceLabel, invoiceSummaryTitle },\r\n context,\r\n typeName,\r\n id,\r\n telemetry\r\n } = input;\r\n\r\n const checkoutCart = get(checkout, 'result.checkoutCart');\r\n const cart = get(checkout, 'result.checkoutCart.cart');\r\n\r\n return {\r\n heading:

{invoiceSummaryTitle}

,\r\n lines: checkoutCart?.hasInvoiceLine\r\n ? InvoiceSummary({\r\n orderTotalLabel: totalAmountLabel,\r\n invoiceLabel,\r\n cart,\r\n context,\r\n typeName,\r\n telemetry,\r\n id,\r\n checkoutState: checkout.result\r\n })\r\n : undefined\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\n//import { CartLineItemComponent } from '@msdyn365-commerce/components';\r\nimport { TebuCartLineItemComponent } from '../../../themes/dyn-tebutheme/views/components/cartlineitem.component';\r\nimport MsDyn365, * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { AttributeValue, CartLine, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { getProductUrlSync, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\r\nimport groupBy from 'lodash/groupBy';\r\nimport * as React from 'react';\r\n\r\nimport { IDynCheckoutData } from '../dyn-checkout.data';\r\nimport { IDynCheckoutProps } from '../dyn-checkout.props.autogenerated';\r\nimport { ProductWithAttributes } from '../dyn-checkout';\r\n\r\ntype deliveryType = 'pickup' | 'ship' | 'email';\r\n\r\nexport interface IPickUpAtStore {\r\n PickUpAtStore: INodeProps;\r\n label: React.ReactNode;\r\n location: React.ReactNode;\r\n}\r\n\r\nexport interface IEmailDelivery {\r\n EmailDelivery: INodeProps;\r\n label: React.ReactNode;\r\n}\r\n\r\nexport interface ILineItem {\r\n LineId: string;\r\n LineItem: INodeProps;\r\n item?: React.ReactNode;\r\n pickUpAtStore?: IPickUpAtStore;\r\n emailDelivery?: IEmailDelivery;\r\n}\r\n\r\nexport interface ILineItemDeliveryGroup {\r\n LineItemDeliveryGroup: INodeProps;\r\n LineItemList: INodeProps;\r\n heading: React.ReactNode;\r\n lineItemWraper?: React.ReactNode;\r\n lineItemWraperIcon?: React.ReactNode;\r\n lineItems: ILineItem[];\r\n}\r\n\r\nexport interface ILineItems {\r\n LineItems: INodeProps;\r\n Header: INodeProps;\r\n heading: React.ReactNode;\r\n editLink: React.ReactNode;\r\n itemsForPickup?: ILineItemDeliveryGroup;\r\n itemsForShip?: ILineItemDeliveryGroup;\r\n itemsForEmail?: ILineItemDeliveryGroup;\r\n itemsGroupWithMulitplePickupMode?: ILineItemDeliveryGroup[];\r\n}\r\n\r\nexport const getLineItems = (\r\n input: IDynCheckoutProps,\r\n productsWithAttributes: ProductWithAttributes[],\r\n telemetryContent?: ITelemetryContent\r\n): ILineItems | undefined => {\r\n const pickupDeliveryModeCode = get(input, 'context.request.channel.PickupDeliveryModeCode');\r\n const emailDeliveryModeCode = get(input, 'context.request.channel.EmailDeliveryModeCode');\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const { channelDeliveryOptionConfig, featureState } = input.data;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n\r\n const _getDeliveryLocation = (cartLine: CartLine): string => {\r\n const orgUnitLocations = get(input, 'data.orgUnitLocations.result');\r\n if (!cartLine.FulfillmentStoreId || !orgUnitLocations) {\r\n return '';\r\n }\r\n\r\n const locationMatch = (orgUnitLocations || []).find((location: OrgUnitLocation): boolean => {\r\n return location.OrgUnitNumber === cartLine.FulfillmentStoreId;\r\n });\r\n\r\n return locationMatch && locationMatch.OrgUnitName;\r\n };\r\n\r\n const _getProduct = (productId: number): SimpleProduct | undefined => {\r\n const products = get(input, 'data.products.result') || [];\r\n return products.find((_product: SimpleProduct) => {\r\n return productId === _product.RecordId;\r\n });\r\n };\r\n\r\n const _getProductWithAttributes = (productId: number): AttributeValue[] | undefined => {\r\n const productWithAttributes = productsWithAttributes.find((_product: ProductWithAttributes) => {\r\n return productId === _product.productDetails?.RecordId;\r\n });\r\n return productWithAttributes?.productSpecificationData || undefined;\r\n };\r\n\r\n const _getLineItemComponent = (cartLine: CartLine): JSX.Element | undefined => {\r\n //debugger;\r\n const product = cartLine.ProductId && _getProduct(cartLine.ProductId);\r\n const productAttributes = cartLine.ProductId && _getProductWithAttributes(cartLine.ProductId);\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n config: { imageSettings, showShippingChargesForLineItems },\r\n resources: {\r\n quantityDisplayString,\r\n productDimensionTypeColor,\r\n productDimensionTypeSize,\r\n productDimensionTypeStyle,\r\n productDimensionTypeAmount,\r\n configString,\r\n inputQuantityAriaLabel,\r\n discountStringText,\r\n shippingCharges\r\n },\r\n context: {\r\n request: { gridSettings }\r\n }\r\n } = input;\r\n\r\n if (!product) {\r\n return;\r\n }\r\n\r\n let productUrl = getProductUrlSync(product, context.actionContext, undefined);\r\n if (MsDyn365.isBrowser) {\r\n const fullUrl = new URL(productUrl, window.location.href);\r\n fullUrl.searchParams.set('catalogid', `${cartLine.CatalogId ?? 0}`);\r\n productUrl = fullUrl.href;\r\n }\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n const _getPickUpAtStoreComponents = (pickupDeliveryLocation: string): IPickUpAtStore => {\r\n const {\r\n resources: { pickUpAtStoreWithLocationText }\r\n } = input;\r\n\r\n return {\r\n PickUpAtStore: { className: 'ms-checkout__pick-up-at-store' },\r\n label: {pickUpAtStoreWithLocationText},\r\n location:
{pickupDeliveryLocation}
\r\n };\r\n };\r\n\r\n const _getEmailDeliveryComponents = (): IEmailDelivery => {\r\n const {\r\n resources: { emailDeliveryText }\r\n } = input;\r\n\r\n return {\r\n EmailDelivery: { className: 'ms-checkout__email-delivery' },\r\n label: {emailDeliveryText}\r\n };\r\n };\r\n\r\n const _getLineItemsComponents = (items: CartLine[]): ILineItem[] => {\r\n return items.map(cartLine => {\r\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\r\n const isPickUp = _getCartPickDeliveryMode(cartLine);\r\n const isEmailDelivery =\r\n cartLine.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\r\n return {\r\n LineId: cartLine.LineId || '',\r\n LineItem: { className: 'ms-checkout__line-item' },\r\n item: _getLineItemComponent(cartLine),\r\n pickUpAtStore: isPickUp ? _getPickUpAtStoreComponents(pickupDeliveryLocation) : undefined,\r\n emailDelivery: isEmailDelivery ? _getEmailDeliveryComponents() : undefined\r\n };\r\n });\r\n };\r\n\r\n const _getCartPickDeliveryMode = (cartLineItem: CartLine): boolean => {\r\n return !StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)\r\n ? retailMultiplePickUpOptionEnabled\r\n ? cartLineItem.DeliveryMode ===\r\n channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(\r\n deliveryMode => deliveryMode === cartLineItem.DeliveryMode\r\n )\r\n : cartLineItem.DeliveryMode === pickupDeliveryModeCode\r\n : false;\r\n };\r\n\r\n const _getCartShipDeliveryMode = (cartLineItem: CartLine): boolean => {\r\n return !StringExtensions.isNullOrWhitespace(cartLineItem.DeliveryMode)\r\n ? retailMultiplePickUpOptionEnabled\r\n ? cartLineItem.DeliveryMode !==\r\n channelDeliveryOptionConfig?.result?.PickupDeliveryModeCodes?.find(\r\n deliveryMode => deliveryMode === cartLineItem.DeliveryMode\r\n )\r\n : cartLineItem.DeliveryMode !== pickupDeliveryModeCode\r\n : false;\r\n };\r\n\r\n const _getGroupTitleComponent = (count: number, type: deliveryType): string => {\r\n const {\r\n resources: { itemLabel, itemsLabel, inStorePickUpLabel, shippingCountCheckoutLineItem }\r\n } = input;\r\n\r\n let emailDeliveryModeDesc: string = '';\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n emailDeliveryModeDesc = emailDeliveryModeDesc\r\n ? emailDeliveryModeDesc\r\n : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)\r\n ?.Description!;\r\n });\r\n\r\n const suffix = count > 1 ? itemsLabel : itemLabel;\r\n const title =\r\n type === 'ship'\r\n ? shippingCountCheckoutLineItem\r\n : type === 'pickup'\r\n ? inStorePickUpLabel\r\n : `${emailDeliveryModeDesc} (${count} ${suffix})`;\r\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\r\n };\r\n\r\n const _countItems = (items: CartLine[]): number => {\r\n return items.reduce((count, item) => {\r\n return count + (item.Quantity || 0);\r\n }, 0);\r\n };\r\n\r\n const _filterItemsByDiliveryType = (type: deliveryType): CartLine[] => {\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n if (type === 'ship') {\r\n return cart.CartLines.filter((cartLine: CartLine) =>\r\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\r\n ? _getCartShipDeliveryMode(cartLine) && cartLine.DeliveryMode !== emailDeliveryModeCode\r\n : cartLine\r\n );\r\n } else if (type === 'pickup') {\r\n return cart.CartLines.filter((cartLine: CartLine) =>\r\n cartLine.DeliveryMode && cartLine.DeliveryMode !== '' ? _getCartPickDeliveryMode(cartLine) : null\r\n );\r\n }\r\n return cart.CartLines.filter((cartLine: CartLine) => cartLine.DeliveryMode === emailDeliveryModeCode);\r\n };\r\n\r\n const _getLineItemsByDeliveryType = (type: deliveryType): ILineItemDeliveryGroup | undefined => {\r\n if ((pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) && (type === 'pickup' || type === 'email')) {\r\n return;\r\n }\r\n\r\n const items = _filterItemsByDiliveryType(type);\r\n\r\n if (items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const count = _countItems(items);\r\n const title = _getGroupTitleComponent(count, type);\r\n\r\n return {\r\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group', type) },\r\n LineItemList: { className: 'ms-checkout__line-items-list' },\r\n heading:
{title}
,\r\n lineItems: _getLineItemsComponents(items)\r\n };\r\n };\r\n\r\n const _getLineItems = (): ILineItems | undefined => {\r\n const {\r\n context,\r\n config: { lineItemsHeading },\r\n data: { products },\r\n resources: { editCartText }\r\n } = input;\r\n\r\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.EditCart);\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n const groupClass = retailMultiplePickUpOptionEnabled ? ' multiple-pickup-enabled' : '';\r\n if (!cart || !cart.CartLines || cart.CartLines.length === 0 || !products) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n LineItems: { className: `ms-checkout__line-items${groupClass}` },\r\n Header: { className: 'ms-checkout__line-items-header' },\r\n heading: lineItemsHeading && lineItemsHeading.text && (\r\n \r\n ),\r\n editLink: (\r\n \r\n {editCartText}\r\n \r\n ),\r\n itemsForPickup: _getLineItemsByDeliveryType('pickup'),\r\n itemsForShip: _getLineItemsByDeliveryType('ship'),\r\n itemsForEmail: _getLineItemsByDeliveryType('email'),\r\n itemsGroupWithMulitplePickupMode: retailMultiplePickUpOptionEnabled\r\n ? _getLineItemsByDeliveryTypeWithMulitplePickupMode()\r\n : undefined\r\n };\r\n };\r\n\r\n const handleLineItemHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\r\n const {\r\n config: { lineItemsHeading }\r\n } = input;\r\n lineItemsHeading!.text = event.target.value;\r\n };\r\n\r\n const _getGroupTitleComponentWithMultiplePickUp = (\r\n count: number,\r\n type: deliveryType,\r\n deliveryMode?: string,\r\n fulFillmentStoreId?: string\r\n ): string => {\r\n const {\r\n resources: { itemLabel, itemsLabel }\r\n } = input;\r\n\r\n let emailDeliveryModeDesc: string = '';\r\n let pickupDeliveryModeDesc: string = '';\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n emailDeliveryModeDesc = emailDeliveryModeDesc\r\n ? emailDeliveryModeDesc\r\n : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === emailDeliveryModeCode)\r\n ?.Description!;\r\n });\r\n\r\n input.data.deliveryOptions.result?.find(productDeliveryOptions => {\r\n pickupDeliveryModeDesc = pickupDeliveryModeDesc\r\n ? pickupDeliveryModeDesc\r\n : productDeliveryOptions.DeliveryOptions?.find(deliveryOption => deliveryOption.Code === deliveryMode)?.Description!;\r\n });\r\n\r\n const pickupTitle: string = `${pickupDeliveryModeDesc}, ${fulFillmentStoreId}`;\r\n const suffix = count > 1 ? itemsLabel : itemLabel;\r\n const title =\r\n type === 'ship'\r\n ? `(${count} ${suffix})`\r\n : type === 'pickup'\r\n ? `${pickupTitle} (${count} ${suffix})`\r\n : `${emailDeliveryModeDesc} (${count} ${suffix})`;\r\n return title.replace('{count}', count.toString()).replace('{suffix}', suffix);\r\n };\r\n\r\n const _filterItemsByMultiplePickupMode = (): CartLine[][] => {\r\n const cart = get(input, 'data.checkout.result.checkoutCart.cart');\r\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\r\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\r\n const groupDelivery = getGroupByDelivery(cart.CartLines);\r\n const cartLinesGroup: CartLine[] = [];\r\n const cartLinesGrp: CartLine[][] = [];\r\n\r\n // 1) Group by store and pick up mode\r\n Object.entries(groupDelivery).forEach(([deliveryMode, groupByDeliveryType]) => {\r\n // @ts-expect-error\r\n groupDelivery[deliveryMode] = getGroupByStorePickup(groupByDeliveryType);\r\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n });\r\n\r\n Object.keys(cartLinesGroup).forEach(key => {\r\n const cartLines = cartLinesGroup[key];\r\n Object.keys(cartLines).forEach(index => {\r\n const cartLine = cartLines[index];\r\n cartLinesGrp.push(cartLine);\r\n });\r\n });\r\n\r\n return cartLinesGrp;\r\n };\r\n\r\n const _getLineItemsByDeliveryTypeWithMulitplePickupMode = (): ILineItemDeliveryGroup[] | undefined => {\r\n if (pickupDeliveryModeCode === '' || pickupDeliveryModeCode === undefined) {\r\n return;\r\n }\r\n\r\n const {\r\n resources: { multiplePickUpLabel, shippingLable }\r\n } = input;\r\n\r\n const items = _filterItemsByMultiplePickupMode();\r\n\r\n if (items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const lineItemDeliveryGroup: ILineItemDeliveryGroup[] = [];\r\n items.map(item => {\r\n const count = _countItems(item);\r\n const cartLine = item[0];\r\n const pickupDeliveryLocation = _getDeliveryLocation(cartLine);\r\n const type: deliveryType =\r\n cartLine.FulfillmentStoreId && cartLine.DeliveryMode\r\n ? 'pickup'\r\n : cartLine.FulfillmentStoreId === '' && cartLine.DeliveryMode === emailDeliveryModeCode\r\n ? 'email'\r\n : 'ship';\r\n const title = _getGroupTitleComponentWithMultiplePickUp(count, type, cartLine.DeliveryMode, pickupDeliveryLocation);\r\n const groupTitle = type === 'pickup' ? multiplePickUpLabel : type === 'ship' ? shippingLable : 'email';\r\n const iconClass = `ms-checkout__line-items-group-title-multiple-pickup-${type}icon`;\r\n lineItemDeliveryGroup.push({\r\n LineItemDeliveryGroup: { className: classnames('ms-checkout__line-items-delivery-group multiple-pickup', type) },\r\n LineItemList: { className: 'ms-checkout__line-items-list' },\r\n lineItemWraperIcon:
,\r\n lineItemWraper:
{groupTitle}
,\r\n heading:
{title}
,\r\n lineItems: _getLineItemsComponents(item)\r\n });\r\n });\r\n\r\n return lineItemDeliveryGroup;\r\n };\r\n\r\n return _getLineItems();\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\n//import { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { IDynOrderSummaryLines, DynOrderSummary } from '../../dyn-cart/utilities/dyn-order-summary-lineitem';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport get from 'lodash/get';\r\nimport * as React from 'react';\r\n\r\nimport { IDynCheckoutData } from '../dyn-checkout.data';\r\nimport { IDynCheckoutProps } from '../dyn-checkout.props.autogenerated';\r\n\r\nexport interface IOrderSummary {\r\n orderSummaryProps: INodeProps;\r\n heading?: React.ReactNode;\r\n lines?: IDynOrderSummaryLines;\r\n}\r\nexport const getOrderSummary = (input: IDynCheckoutProps): IOrderSummary => {\r\n const {\r\n config: { orderSummaryHeading },\r\n data: { checkout },\r\n resources: {\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText,\r\n otherCharges\r\n },\r\n context,\r\n typeName,\r\n id,\r\n telemetry\r\n } = input;\r\n\r\n const checkoutState = get(checkout, 'result');\r\n const cart = get(checkout, 'result.checkoutCart.cart');\r\n const showLineItems = cart.CartLines && cart.CartLines.length > 0;\r\n const channelConfiguration = context.request.channel!;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const { channelDeliveryOptionConfig, featureState } = input.data;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(feature => feature.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n const isShowOrHideTaxEnabled = context.request.app.config.isEnableShowOrHideSalesTaxECommerceEnabled === true;\r\n\r\n const handleOrderSummaryHeadingChange = (event: Msdyn365.ContentEditableEvent) => {\r\n const {\r\n config: { orderSummaryHeading }\r\n } = input;\r\n orderSummaryHeading!.text = event.target.value;\r\n };\r\n\r\n return {\r\n orderSummaryProps: { className: 'ms-checkout-guest-profile__selected-item' },\r\n heading: orderSummaryHeading && orderSummaryHeading.text && (\r\n \r\n ),\r\n lines: showLineItems\r\n ? DynOrderSummary({\r\n checkoutState,\r\n cart,\r\n subTotalLabel,\r\n shippingLabel,\r\n taxLabel,\r\n orderTotalLabel,\r\n loyaltyLabel,\r\n giftcardLabel,\r\n totalDiscountsLabel,\r\n freeText,\r\n toBeCalculatedText,\r\n context,\r\n typeName,\r\n id,\r\n channelConfiguration,\r\n telemetry,\r\n otherChargeLabel: otherCharges,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- existing property.\r\n isTaxIncludedInPrice: cart.IsTaxIncludedInPrice,\r\n isShowTaxBreakup: isShowOrHideTaxEnabled\r\n })\r\n : undefined\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 { Heading as HeadingType } from '@msdyn365-commerce-modules/data-types';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n IPayLoad,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classname from 'classnames';\r\nimport * as React from 'react';\r\n\r\nexport interface ICheckoutGuidedCardProps {\r\n step: number;\r\n title?: HeadingType;\r\n disabled?: boolean; // Module is not available\r\n isActive?: boolean; // Step === currentStep\r\n isVisted?: boolean; // Step < currentStep\r\n isExpanded?: boolean;\r\n isReady?: boolean;\r\n isPending?: boolean;\r\n isUpdating?: boolean;\r\n isSubmitting?: boolean;\r\n isCancelAllowed?: boolean;\r\n isMobile?: boolean;\r\n hasInitialized?: boolean;\r\n hasControlGroup?: boolean;\r\n children: React.ReactNode;\r\n resource: {\r\n checkoutStepTitleFormat: string;\r\n saveBtnLabel: string;\r\n changeBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n telemetryContent?: ITelemetryContent;\r\n onEdit?(): void;\r\n onCancel?(): void;\r\n onSubmit?(): void;\r\n onNext(): void;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutGuidedCard component.\r\n * @extends {React.Component}\r\n */\r\nclass CheckoutGuidedCard extends React.PureComponent {\r\n private readonly editButtonRef: React.RefObject = React.createRef();\r\n\r\n private readonly formCardRef: React.RefObject = React.createRef();\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n constructor(props: ICheckoutGuidedCardProps) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n }\r\n\r\n public componentDidUpdate(prevProps: ICheckoutGuidedCardProps): void {\r\n /**\r\n * Move to next step when current step is ready.\r\n */\r\n const { isActive, isReady, onNext, isVisted, onEdit } = this.props;\r\n\r\n // Move to next step after completing the current step\r\n if (isActive && isReady) {\r\n onNext();\r\n }\r\n\r\n // Set the focus to Edit button once edit button appear\r\n // (It happens when current step switch to isReady status)\r\n const prevCanEdit = prevProps.isReady && prevProps.isVisted && !!prevProps.onEdit;\r\n const canEdit = isReady && isVisted && !!onEdit;\r\n if (!prevCanEdit && canEdit) {\r\n this.focusOnEditButton();\r\n this.scrollToTitle();\r\n }\r\n\r\n // Set the focus to the first focusable element\r\n // (It happens when current step switch to isUpdating status)\r\n if (prevProps.isReady && !isReady) {\r\n this.focusOnFirstFocusableElement();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n title,\r\n disabled,\r\n isExpanded,\r\n isActive,\r\n isVisted,\r\n children,\r\n isReady,\r\n isPending,\r\n isUpdating,\r\n hasInitialized,\r\n hasControlGroup,\r\n onEdit,\r\n resource\r\n } = this.props;\r\n const { changeBtnLabel } = resource;\r\n\r\n this.payLoad.contentAction.etext = TelemetryConstant.CheckoutChange;\r\n const changeBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n const canEdit = hasControlGroup && isReady && isVisted && onEdit;\r\n\r\n return (\r\n \r\n
\r\n {this.getTitle()}\r\n\r\n {canEdit && (\r\n \r\n {changeBtnLabel}\r\n \r\n )}\r\n
\r\n\r\n \r\n
{children}
\r\n\r\n {this.renderFooder()}\r\n
\r\n \r\n );\r\n }\r\n\r\n private readonly renderFooder = (): JSX.Element | null => {\r\n const { isVisted, isReady, isSubmitting, isCancelAllowed, hasControlGroup, onCancel, onSubmit, resource } = this.props;\r\n const { saveBtnLabel, cancelBtnLabel, saveAndContinueBtnLabel } = resource;\r\n\r\n const canSubmit = !isReady && onSubmit;\r\n const canCancel = !isReady && isVisted && isCancelAllowed && onCancel;\r\n\r\n if (!hasControlGroup || (!canSubmit && !canCancel)) {\r\n return null;\r\n }\r\n\r\n this.payLoad.contentAction.etext = isVisted ? TelemetryConstant.Save : TelemetryConstant.SaveContinue;\r\n const saveBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.Cancel;\r\n const cancelBtnAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
\r\n {canSubmit && (\r\n \r\n {isVisted && isCancelAllowed ? saveBtnLabel : saveAndContinueBtnLabel}\r\n \r\n )}\r\n {canCancel && (\r\n \r\n {cancelBtnLabel}\r\n \r\n )}\r\n
\r\n );\r\n };\r\n\r\n private readonly focusOnFirstFocusableElement = (): void => {\r\n const node = this.formCardRef.current as HTMLElement;\r\n const focussableElements = `\r\n a:not([disabled]),\r\n button:not([disabled]),\r\n input[type=submit]:not([disabled]),\r\n input[type=checkbox]:not([disabled]),\r\n input[type=text]:not([disabled]),\r\n input[type=radio]:not([disabled]),\r\n input[type=password]:not([disabled]),\r\n select:not([disabled]),\r\n textarea:not([disabled]),\r\n [tabindex]:not([disabled]):not([tabindex=\"-1\"])\r\n `;\r\n\r\n const child = node && node.querySelector && (node.querySelector(focussableElements) as HTMLElement);\r\n child && child.focus && child.focus();\r\n };\r\n\r\n private readonly focusOnEditButton = (): void => {\r\n // Focus on edit button\r\n const editButton =\r\n this.editButtonRef &&\r\n this.editButtonRef.current &&\r\n this.editButtonRef.current.focus &&\r\n (this.editButtonRef.current as HTMLElement);\r\n editButton && editButton.focus();\r\n };\r\n\r\n private readonly scrollToTitle = (): void => {\r\n // Scroll window to the title of the step that was just completed only in mobile viewport\r\n const formCard = this.props.isMobile && this.formCardRef && this.formCardRef.current && (this.formCardRef.current as HTMLElement);\r\n formCard && formCard.scrollIntoView();\r\n };\r\n\r\n private readonly getTitle = (): JSX.Element => {\r\n const { step, title } = this.props;\r\n const { headingTag: Tag = 'h2', text = '' } = title || {};\r\n return (\r\n \r\n {step + 1}. \r\n {text && {text}}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default CheckoutGuidedCard;\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 { IModuleStateManager } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport get from 'lodash/get';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport GuidedCard from './guided-card';\r\n\r\nexport interface ICheckoutGuidedFormProps {\r\n items: React.ReactNode[];\r\n moduleState: IModuleStateManager;\r\n disableGuidedCheckoutFlow?: boolean;\r\n isMobile?: boolean;\r\n isEditor?: boolean;\r\n resource: {\r\n checkoutStepTitleFormat: string;\r\n saveBtnLabel: string;\r\n changeBtnLabel: string;\r\n cancelBtnLabel: string;\r\n saveAndContinueBtnLabel: string;\r\n };\r\n telemetryContent?: ITelemetryContent;\r\n isPaymentVerificationRedirection?: boolean;\r\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\r\n hasError?: boolean;\r\n hasShippingAddress?: boolean | undefined;\r\n hasCartDeliveryMode?: boolean | undefined;\r\n hasGuestCheckoutEmail?: boolean | undefined;\r\n isTermsAndConditionAccepted?: boolean | undefined;\r\n}\r\n\r\ninterface ICheckoutGuidedFormState {\r\n currentStep: number;\r\n}\r\n\r\nconst paymentInstrumentModuleId = 'payment-instrument';\r\n\r\n/**\r\n *\r\n * CheckoutGuidedForm component.\r\n * @extends {React.Component}\r\n */\r\n@observer\r\nclass CheckoutGuidedForm extends React.PureComponent {\r\n @computed public get hasMissingInfo(): boolean {\r\n if (\r\n this.props.hasShippingAddress === false ||\r\n this.props.hasCartDeliveryMode === false ||\r\n this.props.hasGuestCheckoutEmail === false ||\r\n this.props.isTermsAndConditionAccepted === false\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n @computed public get hasOrderError(): boolean {\r\n for (const item of this.props.items) {\r\n const childId = this.getId(item);\r\n const state = this.props.moduleState.getModule(childId);\r\n\r\n const isPaymentSectionContainer = ArrayExtensions.hasElements(\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n state.childIds?.filter(currentId => currentId?.includes(paymentInstrumentModuleId))\r\n );\r\n\r\n if (!isPaymentSectionContainer && !state.isDisabled && state.hasError) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public state: ICheckoutGuidedFormState = {\r\n currentStep: 0\r\n };\r\n\r\n public componentDidMount(): void {\r\n /**\r\n * Append child modules.\r\n */\r\n const childIds = this.props.items.map((item: React.ReactNode) => get(item, 'props.id'));\r\n this.props.moduleState.init({ childIds });\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { moduleState, items, resource } = this.props;\r\n if (!items || !moduleState) {\r\n return null;\r\n }\r\n\r\n const shouldCollapseAfterRedirect =\r\n this.props.isPaymentVerificationRedirection &&\r\n this.props.shouldEnableSinglePaymentAuthorizationCheckout &&\r\n !this.props.hasError &&\r\n !this.hasMissingInfo &&\r\n !this.hasOrderError;\r\n\r\n return (\r\n
\r\n {items.map((item: React.ReactNode) => {\r\n const childId = this.getId(item);\r\n const step = this.getStep(childId);\r\n const title = this.getHeading(item);\r\n const state = this.props.moduleState.getModule(childId);\r\n const {\r\n isReady,\r\n isPending,\r\n isUpdating,\r\n isDisabled,\r\n isCancelAllowed,\r\n onEdit,\r\n onCancel,\r\n onSubmit,\r\n hasModuleState,\r\n hasInitialized\r\n } = state || ({} as IModuleStateManager);\r\n return (\r\n \r\n {React.cloneElement(item as React.ReactElement, { enableControl: true })}\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n private readonly getEnabledModules = (): string[] => {\r\n const {\r\n moduleState: { childIds, getModule }\r\n } = this.props;\r\n return childIds.filter((childId: string) => {\r\n const state = getModule(childId);\r\n return !!state && !state.isDisabled;\r\n });\r\n };\r\n\r\n private readonly getStep = (id: string): number => {\r\n return this.getEnabledModules().indexOf(id);\r\n };\r\n\r\n private readonly getId = (item: React.ReactNode): string => {\r\n return get(item, 'props.id') || '';\r\n };\r\n\r\n private readonly getHeading = (item: React.ReactNode): Heading => {\r\n return get(item, 'props.config.heading') || '';\r\n };\r\n\r\n private readonly isExpanded = (step: number): boolean => {\r\n if (this.props.isEditor) {\r\n // Editorial mode: Expand all the drawers\r\n return true;\r\n }\r\n return step > -1 && step <= this.state.currentStep;\r\n };\r\n\r\n private readonly isActive = (step: number): boolean => {\r\n return step === this.state.currentStep;\r\n };\r\n\r\n private readonly isVisted = (step: number): boolean => {\r\n return step > -1 && step < this.state.currentStep;\r\n };\r\n\r\n private readonly onNext = (): void => {\r\n this.setState({\r\n currentStep: this.state.currentStep + 1\r\n });\r\n };\r\n}\r\n\r\nexport default CheckoutGuidedForm;\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 { TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\ninterface ICheckoutPlaceOrderButtonProps {\r\n canPlaceOrder: boolean;\r\n checkoutBtnText: string;\r\n telemetryContent?: ITelemetryContent;\r\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\r\n isPlaceOrderLoading?: boolean;\r\n isExpressCheckoutApplied?: boolean;\r\n isPaymentVerificationRedirection?: boolean;\r\n placeOrder(): Promise;\r\n}\r\n\r\nconst buttonsStates: React.Dispatch>[] = [];\r\n\r\n/**\r\n * On place order function.\r\n * @param isBusy -Check is busy.\r\n * @param canPlaceOrder -Check can place order.\r\n * @param placeOrder -Place order function.\r\n * @returns Set state of button.\r\n */\r\nconst onPlaceOrderHandler = (isBusy: boolean, canPlaceOrder: boolean, placeOrder: () => Promise) => async () => {\r\n if (isBusy || !canPlaceOrder) {\r\n return;\r\n }\r\n buttonsStates.map(buttonSetState => {\r\n buttonSetState(true);\r\n return true;\r\n });\r\n await placeOrder();\r\n};\r\n\r\nconst CheckoutPlaceOrderButton: React.FC = ({\r\n checkoutBtnText,\r\n canPlaceOrder,\r\n placeOrder,\r\n telemetryContent,\r\n shouldEnableSinglePaymentAuthorizationCheckout,\r\n isPlaceOrderLoading,\r\n isExpressCheckoutApplied,\r\n isPaymentVerificationRedirection\r\n}) => {\r\n const [isBusy, setIsBusy] = useState(false);\r\n buttonsStates.push(setIsBusy);\r\n const payload = getPayloadObject(TelemetryEvent.Purchase, telemetryContent!, checkoutBtnText, '');\r\n const attributes = getTelemetryAttributes(telemetryContent!, payload);\r\n\r\n if (shouldEnableSinglePaymentAuthorizationCheckout && (!isExpressCheckoutApplied || isPaymentVerificationRedirection)) {\r\n return (\r\n \r\n {checkoutBtnText}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {checkoutBtnText}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutPlaceOrderButton;\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 { getCheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { checkoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { getTenderTypesAsync, resolveCardTypesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport {\r\n Address,\r\n CardPaymentAcceptResult,\r\n CardType,\r\n CartTenderLine,\r\n RetailOperation,\r\n SalesOrder,\r\n TenderType,\r\n TokenizedPaymentCard\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nexport const OPERATIONS = {\r\n PayCard: 201,\r\n PayGiftCertificate: 214,\r\n PayLoyalty: 207,\r\n PayCustomerAccount: 202\r\n};\r\n\r\nconst getCardTypeId = async (ctx: IActionContext, cardPrefix: string = ''): Promise => {\r\n try {\r\n const response = await resolveCardTypesAsync({ callerContext: ctx }, cardPrefix, CardType.Unknown);\r\n if (response && response.length > 0) {\r\n return response[0].TypeId;\r\n }\r\n } catch (error) {\r\n ctx.telemetry.error('Call to resolveCardTypesAsync failed.', error);\r\n }\r\n return undefined;\r\n};\r\n\r\nconst findTenderIdTypeByOperationId = (tenderTypes: TenderType[], operationId: RetailOperation): string | undefined => {\r\n const matchedTenderType = tenderTypes.find(tenderType => tenderType.OperationId === operationId);\r\n if (matchedTenderType) {\r\n return matchedTenderType.TenderTypeId;\r\n }\r\n return;\r\n};\r\n\r\nconst roundNumber = (value: number) => Number(value.toFixed(2));\r\n\r\nasync function getLoyaltyTenderLine(\r\n ctx: IActionContext,\r\n LoyaltyCardId: string,\r\n Amount: number = 0,\r\n Currency: string = 'USD'\r\n): Promise {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get gift card tender line');\r\n }\r\n\r\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayLoyalty);\r\n return {\r\n // @ts-expect-error\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n TenderTypeId,\r\n Amount,\r\n LoyaltyCardId\r\n };\r\n}\r\n\r\nasync function getGiftCardTenderLine(\r\n ctx: IActionContext,\r\n GiftCardId: string = '',\r\n Amount: number = 0,\r\n Currency: string = 'USD',\r\n tenderTypeId?: string,\r\n giftCardPin?: string,\r\n giftCardExpirationYear?: number,\r\n giftCardExpirationMonth?: number\r\n): Promise {\r\n let TenderTypeId = tenderTypeId;\r\n\r\n if (!TenderTypeId) {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get gift card tender line');\r\n }\r\n TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayGiftCertificate);\r\n }\r\n\r\n const GiftCardPin = giftCardPin;\r\n const GiftCardExpirationYear = giftCardExpirationYear;\r\n const GiftCardExpirationMonth = giftCardExpirationMonth;\r\n return {\r\n // @ts-expect-error\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n TenderTypeId,\r\n Amount,\r\n GiftCardId,\r\n GiftCardPin,\r\n GiftCardExpirationYear,\r\n GiftCardExpirationMonth\r\n };\r\n}\r\n\r\nasync function getCreditCardTenderLine(\r\n ctx: IActionContext,\r\n tokenizedPaymentCard: TokenizedPaymentCard,\r\n cardPrefix: string = '',\r\n Amount: number = 0,\r\n Currency: string = 'USD',\r\n billingAddress?: Address\r\n): Promise {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n let cartTypeId = tokenizedPaymentCard.CardTypeId;\r\n\r\n if (!cartTypeId) {\r\n cartTypeId = await getCardTypeId(ctx, cardPrefix);\r\n }\r\n\r\n if (!tenderTypes) {\r\n throw new Error('Fail to get card tender type');\r\n }\r\n\r\n if (!cartTypeId) {\r\n throw new Error('Fail to get card type id');\r\n }\r\n\r\n const TenderTypeId = tokenizedPaymentCard.TenderType ?? findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\r\n const cardTenderLine: CartTenderLine = {\r\n // @ts-expect-error\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n Amount,\r\n TenderTypeId,\r\n CardTypeId: cartTypeId\r\n };\r\n cardTenderLine.TokenizedPaymentCard = {\r\n ...tokenizedPaymentCard,\r\n CardTypeId: cartTypeId,\r\n\r\n // @ts-expect-error\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.TokenizedPaymentCard',\r\n House: tokenizedPaymentCard.House || 'N/A',\r\n ...(tokenizedPaymentCard.CardTokenInfo && {\r\n CardTokenInfo: {\r\n ...tokenizedPaymentCard.CardTokenInfo,\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CardTokenInfo'\r\n }\r\n }),\r\n ...(billingAddress && {\r\n Phone: billingAddress.Phone,\r\n Country: billingAddress.ThreeLetterISORegionName,\r\n Address1: billingAddress.Street,\r\n City: billingAddress.City,\r\n State: billingAddress.State,\r\n Zip: billingAddress.ZipCode\r\n })\r\n };\r\n\r\n return cardTenderLine;\r\n}\r\n\r\n/**\r\n * Get credit card tender line.\r\n * @param context - Action context.\r\n * @param amount - Due amount for credit card.\r\n * @param currency - Currency.\r\n * @param cardPaymentAcceptResult - CardPaymentAcceptResult.\r\n * @returns - The credit card tender line.\r\n */\r\nasync function getCreditCardTenderLineForSinglePaymentAuth(\r\n context: IActionContext,\r\n amount: number = 0,\r\n currency: string = 'USD',\r\n cardPaymentAcceptResult?: CardPaymentAcceptResult\r\n): Promise {\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: context, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n const tenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\r\n\r\n const cardTenderLine: CartTenderLine = {\r\n // @ts-expect-error -- existing data.\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n 'Amount@odata.type': '#Decimal',\r\n Currency: currency,\r\n Amount: amount,\r\n TenderTypeId: tenderTypeId,\r\n CardPaymentAcceptResult: cardPaymentAcceptResult\r\n };\r\n\r\n return cardTenderLine;\r\n}\r\n\r\nasync function createCustomerAccountTenderLine(ctx: IActionContext, Amount: number, Currency: string = 'USD'): Promise {\r\n const CustomerId = null;\r\n if (!ctx.requestContext.user.isAuthenticated) {\r\n ctx.telemetry.error('A customer id is required to pay with customer account');\r\n }\r\n\r\n const tenderTypes = await getTenderTypesAsync({ callerContext: ctx, queryResultSettings: {} }).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!tenderTypes) {\r\n ctx.telemetry.error('No tender types found for this channel');\r\n }\r\n\r\n const TenderTypeId = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCustomerAccount);\r\n if (!TenderTypeId) {\r\n ctx.telemetry.error('No customer account tender type');\r\n }\r\n return {\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n 'Amount@odata.type': '#Decimal',\r\n Currency,\r\n TenderTypeId,\r\n Amount,\r\n\r\n // @ts-expect-error\r\n CustomerId\r\n };\r\n}\r\n\r\nexport default async (\r\n ctx: IActionContext,\r\n updatedCartVersion?: number,\r\n isPaymentVerificationRedirection?: boolean\r\n): Promise => {\r\n const checkoutState = await getCheckoutState(ctx).catch(error => {\r\n throw error;\r\n });\r\n\r\n const cartState = checkoutState.checkoutCart;\r\n\r\n const channelConfiguration = ctx.requestContext.channel;\r\n\r\n if (!cartState || Object.keys(cartState).length === 0 || !channelConfiguration) {\r\n throw new Error('Fail to placeOrder');\r\n }\r\n\r\n const {\r\n giftCardExtends,\r\n tokenizedPaymentCard,\r\n cardPrefix,\r\n guestCheckoutEmail,\r\n billingAddress,\r\n loyaltyAmount,\r\n cardPaymentAcceptResult,\r\n shouldEnableSinglePaymentAuthorizationCheckout,\r\n isExpressCheckoutApplied,\r\n isExpressAddressApplied\r\n } = checkoutState;\r\n const { Currency } = channelConfiguration;\r\n\r\n let amountDue = cartState.cart.AmountDue || 0;\r\n let cartTenderLines;\r\n const getTenderLinePromises = [];\r\n const loyaltyCardNumber = cartState.cart.LoyaltyCardId;\r\n\r\n // Pay by loyalty first\r\n if (loyaltyAmount && loyaltyCardNumber) {\r\n const chargedAmount = roundNumber(Math.min(loyaltyAmount, amountDue));\r\n const loyaltyTenderLinePromise = getLoyaltyTenderLine(ctx, loyaltyCardNumber, chargedAmount, Currency);\r\n getTenderLinePromises.push(loyaltyTenderLinePromise);\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n\r\n // Then by gift card\r\n if (giftCardExtends && giftCardExtends.length > 0) {\r\n giftCardExtends.some(giftCardExtend => {\r\n if (giftCardExtend.Balance && amountDue > 0) {\r\n const chargedAmount = roundNumber(Math.min(giftCardExtend.Balance, amountDue));\r\n const tenderTypeId = giftCardExtend.TenderTypeId;\r\n const giftCardPin = giftCardExtend.Pin;\r\n const giftCardExpirationYear = giftCardExtend.ExpirationDate\r\n ? Number.parseInt(giftCardExtend.ExpirationDate?.split('/')[1], 10)\r\n : undefined;\r\n const giftCardExpirationMonth = giftCardExtend.ExpirationDate\r\n ? Number.parseInt(giftCardExtend.ExpirationDate?.split('/')[0], 10)\r\n : undefined;\r\n const creditCardTenderLinePromise = getGiftCardTenderLine(\r\n ctx,\r\n giftCardExtend.Id,\r\n chargedAmount,\r\n Currency,\r\n tenderTypeId,\r\n giftCardPin,\r\n giftCardExpirationYear,\r\n giftCardExpirationMonth\r\n );\r\n getTenderLinePromises.push(creditCardTenderLinePromise);\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n return amountDue === 0;\r\n });\r\n }\r\n\r\n // Then by customer account\r\n if (checkoutState.customerAccountAmount > 0) {\r\n const chargedAmount = roundNumber(Math.min(checkoutState.customerAccountAmount, amountDue));\r\n const customerAccountTenderLinePromise = createCustomerAccountTenderLine(ctx, chargedAmount, Currency);\r\n getTenderLinePromises.push(customerAccountTenderLinePromise);\r\n amountDue = roundNumber(amountDue - chargedAmount);\r\n }\r\n\r\n // Pay the rest by credit card\r\n if (amountDue > 0) {\r\n let creditCardTenderLinePromise: Promise;\r\n\r\n if (\r\n shouldEnableSinglePaymentAuthorizationCheckout &&\r\n (!(isExpressCheckoutApplied && !isExpressAddressApplied) || (isExpressCheckoutApplied && isPaymentVerificationRedirection))\r\n ) {\r\n creditCardTenderLinePromise = getCreditCardTenderLineForSinglePaymentAuth(ctx, amountDue, Currency, cardPaymentAcceptResult);\r\n } else {\r\n if (!tokenizedPaymentCard) {\r\n throw new Error('Fail to placeOrder: no token found');\r\n }\r\n creditCardTenderLinePromise = getCreditCardTenderLine(\r\n ctx,\r\n tokenizedPaymentCard,\r\n cardPrefix,\r\n amountDue,\r\n Currency,\r\n billingAddress\r\n );\r\n }\r\n\r\n getTenderLinePromises.push(creditCardTenderLinePromise);\r\n }\r\n\r\n if (getTenderLinePromises.length > 0) {\r\n // When payment methods is required\r\n cartTenderLines = await Promise.all(getTenderLinePromises).catch(error => {\r\n throw error;\r\n });\r\n\r\n if (!cartTenderLines || cartTenderLines.length === 0) {\r\n throw new Error('Fail to placeOrder: fail to get cart tender lines');\r\n }\r\n }\r\n\r\n const cartVersion = updatedCartVersion || cartState.cart.Version;\r\n\r\n // Proceed checkout\r\n const salesOrder = await checkoutAsync(\r\n { callerContext: ctx, bypassCache: 'get' },\r\n cartState.cart.Id,\r\n guestCheckoutEmail,\r\n undefined,\r\n undefined,\r\n cartTenderLines || null,\r\n cartVersion\r\n ).catch(async error => {\r\n if (checkoutState.shouldEnableSinglePaymentAuthorizationCheckout) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown type.\r\n if (error.data?.AdditionalContext) {\r\n await checkoutState.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown type.\r\n await checkoutState.updateRedirectAdditionalContext({\r\n newRedirectAdditionalContext: error?.data?.AdditionalContext as string\r\n });\r\n await checkoutState.updateRedirectPaymentConnectorId({\r\n newRedirectPaymentConnectorId: cardPaymentAcceptResult?.Settings?.PaymentConnectorId as string\r\n });\r\n } else {\r\n await checkoutState.updateIsCheckoutCallFailed({ newIsCheckoutCallFailed: true });\r\n\r\n if (isPaymentVerificationRedirection) {\r\n await checkoutState.checkoutCart.refreshCart({});\r\n await checkoutState.updateIsExpressCheckoutApplied({ newIsExpressCheckoutApplied: false });\r\n await checkoutState.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\r\n }\r\n }\r\n }\r\n\r\n throw error;\r\n });\r\n\r\n if (!salesOrder) {\r\n throw new Error('Fail to placeOrder: fail to checkout');\r\n }\r\n\r\n return salesOrder;\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 { getCartState, getCheckoutState } from '@msdyn365-commerce/global-state';\r\n\r\nasync function emptyActiveCart(ctx: IActionContext): Promise {\r\n let cartState;\r\n let checkoutState;\r\n const lineItemIdsToRemove = [];\r\n\r\n try {\r\n cartState = await getCartState(ctx);\r\n checkoutState = await getCheckoutState(ctx);\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n if (!cartState || !cartState.cart) {\r\n throw new Error('Fail to fetch active cart');\r\n }\r\n\r\n if (!checkoutState || !checkoutState.checkoutCart) {\r\n throw new Error('Fail to fetch checkoutCart cart');\r\n }\r\n\r\n const activeCart = cartState.cart;\r\n const checkoutCart = checkoutState.checkoutCart.cart;\r\n\r\n for (const activeCartLine of activeCart.CartLines || []) {\r\n for (const checkoutCartLine of checkoutCart.CartLines || []) {\r\n if (activeCartLine.LineId && activeCartLine.LineId === checkoutCartLine.LineId) {\r\n lineItemIdsToRemove.push(activeCartLine.LineId);\r\n }\r\n }\r\n }\r\n\r\n try {\r\n await cartState.removeCartLines({ cartLineIds: lineItemIdsToRemove });\r\n await cartState.removeAllPromoCodes({});\r\n await checkoutState.removeCheckoutCartId({});\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\nexport default emptyActiveCart;\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 * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { Cart, CartLineValidationResults, AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n updateLineDeliverySpecificationsAsync,\r\n validateForCheckoutAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport {\r\n DeliveryPreferenceType,\r\n LineDeliverySpecification,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IModuleStateManager, IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport {\r\n ArrayExtensions,\r\n getAvailabilitiesForCartLineItems,\r\n IProductInventoryInformation,\r\n ProductAvailabilitiesForCartLineItems,\r\n validateCartLinesInventory\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n Waiting\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport isEmpty from 'lodash/isEmpty';\r\nimport { computed, reaction, when } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IDynCheckoutData } from './dyn-checkout.data';\r\nimport { ICheckoutHeadingData, IDynCheckoutProps } from './dyn-checkout.props.autogenerated';\r\nimport AlertComponent from './components/alert';\r\nimport { getInvoicePaymentSummary, IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\r\nimport { getLineItems, ILineItems } from './components/get-line-items';\r\nimport { getOrderSummary, IOrderSummary } from './components/get-order-summary';\r\nimport GuidedFormComponent from './components/guided-form';\r\nimport PlaceOrderButtonComponent from './components/place-order-button';\r\nimport placeOrder from './methods/place-order';\r\n\r\nexport * from './components/get-line-items';\r\nexport * from './components/get-order-summary';\r\n\r\nimport { AttributesForSelectedVariantInput, getAttributesForSelectedVariant } from '@msdyn365-commerce-modules/product-specification';\r\n\r\n/**\r\n * Device type.\r\n */\r\ntype DeviceType = 'Mobile';\r\n\r\n/**\r\n * The Checkout state.\r\n */\r\ninterface ICheckoutState {\r\n errorMessage: string;\r\n isValidationPassed: boolean;\r\n isPlaceOrderLoading?: boolean;\r\n}\r\n\r\n/**\r\n * The Checkout view props.\r\n * @extends IDynCheckoutProps\r\n */\r\nexport interface ICheckoutViewProps extends IDynCheckoutProps {\r\n className: string;\r\n canShow?: boolean;\r\n isEmptyCart?: boolean;\r\n isConsentGiven?: boolean;\r\n hasError?: boolean;\r\n isPaymentVerificationRedirection?: boolean;\r\n shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\r\n cartStatus?: string;\r\n isMobile?: boolean;\r\n isEditorialMode?: boolean;\r\n backToShoppingUrl?: string;\r\n editCartLink?: string;\r\n hasSalesOrder: boolean;\r\n hasInvoiceLine?: boolean;\r\n hasBillingAddress?: boolean;\r\n\r\n checkoutProps: IModuleProps;\r\n headerProps: INodeProps;\r\n bodyProps: INodeProps;\r\n mainProps: INodeProps;\r\n mainControlProps: INodeProps;\r\n sideProps: INodeProps;\r\n sideControlFirstProps: INodeProps;\r\n sideControlSecondProps: INodeProps;\r\n termsAndConditionsProps: INodeProps;\r\n\r\n guidedForm?: React.ReactNode;\r\n title?: React.ReactNode;\r\n loading?: React.ReactNode;\r\n alert?: React.ReactNode;\r\n orderSummary?: IOrderSummary;\r\n invoicePaymentSummary?: IInvoicePaymentSummary;\r\n lineItems?: ILineItems;\r\n placeOrderButton?: React.ReactNode;\r\n termsAndConditions?: React.ReactNode;\r\n keepShoppingButton?: React.ReactNode;\r\n orderConfirmation?: React.ReactNode;\r\n\r\n customerInformation: React.ReactNode;\r\n webQuotationNotice: React.ReactNode;\r\n webQuotationReferences: React.ReactNode;\r\n}\r\n\r\n/**\r\n * The checkout module props interface.\r\n */\r\nexport interface ICheckoutModuleProps extends IDynCheckoutProps, IModuleStateProps {}\r\n\r\nconst expressPaymentSectionClassName = 'msc-express-payment-container';\r\n\r\nexport interface ProductWithAttributes {\r\n productDetails: SimpleProduct | undefined;\r\n productSpecificationData: AttributeValue[] | null;\r\n}\r\n\r\n/**\r\n *\r\n * CheckoutContainer component.\r\n * @extends {React.Component}\r\n */\r\n// @ts-expect-error\r\n@withModuleState\r\n@observer\r\nclass Checkout extends React.PureComponent {\r\n @computed get cartStatus(): Msdyn365.AsyncResultStatus {\r\n return this.props.data.checkout?.status;\r\n }\r\n\r\n @computed get isEmptyCart(): boolean {\r\n if (this.isEditorialMode) {\r\n // Editorial mode: Ignore empty cart\r\n return false;\r\n }\r\n const cart = this.props.data.checkout?.result?.checkoutCart?.cart;\r\n return this.cartStatus === 'SUCCESS' && !!cart && !isEmpty(cart) && (!cart.CartLines || cart.CartLines.length === 0);\r\n }\r\n\r\n @computed get hasError(): boolean {\r\n const cart = this.props.data.checkout?.result?.checkoutCart?.cart;\r\n return this.cartStatus === 'FAILED' || (this.cartStatus === 'SUCCESS' && (!cart || isEmpty(cart)));\r\n }\r\n\r\n @computed get isEditorialMode(): boolean {\r\n return this.props.context.request.params.isEditor;\r\n }\r\n\r\n @computed get canPlaceOrder(): boolean {\r\n const isTermsAndConditionAccepted = this.props.data.checkout.result && this.props.data.checkout.result?.isTermsAndConditionAccepted;\r\n\r\n const shouldEnableSinglePaymentAuthorizationCheckout =\r\n this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\r\n\r\n // If isTermsAndConditionAccepted is undefined means TermsAndCondition module is not added to page and we should able to place order.\r\n return (\r\n this.props.moduleState.isReady &&\r\n (isTermsAndConditionAccepted === undefined || isTermsAndConditionAccepted || shouldEnableSinglePaymentAuthorizationCheckout) &&\r\n (this.state.errorMessage === '' ||\r\n shouldEnableSinglePaymentAuthorizationCheckout ||\r\n (this.props.data.checkout.result?.isPaymentVerificationRedirection ?? false))\r\n );\r\n }\r\n\r\n @computed get isCartReady(): boolean {\r\n return (\r\n !!this.props.data.checkout.result?.checkoutCart?.cart &&\r\n this.props.data.customerInformation.status !== 'LOADING' &&\r\n this.props.data.featureState.status !== 'LOADING'\r\n );\r\n }\r\n\r\n @computed get hasLoadedProducts(): boolean {\r\n const hasProducts = this.props.data.products?.result?.length ?? 0;\r\n if (hasProducts) {\r\n this.setState({\r\n hasLoadedProducts: true\r\n });\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public state: ICheckoutState = {\r\n errorMessage: '',\r\n isValidationPassed: false,\r\n isPlaceOrderLoading: false\r\n };\r\n\r\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n\r\n private _getProductAttribute = async (product: SimpleProduct, actionContext: any) => {\r\n const actionInput = new AttributesForSelectedVariantInput(\r\n product.RecordId,\r\n +actionContext.requestContext.apiSettings.channelId,\r\n product\r\n );\r\n\r\n return getAttributesForSelectedVariant(actionInput, this.props.context.actionContext).catch((error: Error) => {\r\n console.log(error);\r\n });\r\n };\r\n\r\n public ProductsWithAttributes: ProductWithAttributes[] = [];\r\n\r\n public async componentDidMount(): Promise {\r\n // Dyn : this.props.context.request.cookies.setConsentCookie(); //debugger;\r\n const {\r\n resources: { genericErrorMessage }\r\n } = this.props;\r\n\r\n const products = await this.props.data.products;\r\n for (let i = 0; i < products.length; i++) {\r\n if (products[i]) {\r\n let attributes = await this._getProductAttribute(products[i], this.props.context.actionContext);\r\n this.ProductsWithAttributes.push({\r\n productDetails: products[i],\r\n productSpecificationData: attributes ?? attributes !== undefined ? attributes : null\r\n });\r\n }\r\n }\r\n\r\n when(\r\n () => this.hasError,\r\n () => {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.context.telemetry.error('Failed to get cart');\r\n }\r\n );\r\n\r\n when(\r\n () => {\r\n return this.isEmptyCart;\r\n },\r\n () => {\r\n this.redirectToCartPage('Cart is empty, but no editCartLink found');\r\n }\r\n );\r\n\r\n when(\r\n () => this.isCartReady,\r\n () => {\r\n this.validateForCheckout();\r\n }\r\n );\r\n\r\n reaction(\r\n () => this.props.moduleState.isReady,\r\n () => {\r\n this.onContainerReady();\r\n }\r\n );\r\n\r\n // Reaction to call place order when isPaymentSectionContainerReady is true for new checkout flow.\r\n reaction(\r\n () => this.props.data.checkout.result?.isPaymentSectionContainerReady,\r\n async isReady => {\r\n if (\r\n this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout &&\r\n isReady &&\r\n !this.props.data.checkout.result?.redirectAdditionalContext &&\r\n (!this.props.data.checkout.result?.isExpressCheckoutApplied ||\r\n this.props.data.checkout.result?.isPaymentVerificationRedirection)\r\n ) {\r\n if (!this.state.isPlaceOrderLoading) {\r\n this.setState({ isPlaceOrderLoading: true });\r\n }\r\n\r\n await this.onPlaceOrder();\r\n\r\n // If 3D authentication redirection, don't update isPlaceOrderLoading\r\n if (!this.props.data.checkout.result.isPaymentVerificationRequired) {\r\n this.setState({ isPlaceOrderLoading: false });\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Reaction to enable place order button when isPaymentSectionContainerHasError is true for new checkout flow.\r\n reaction(\r\n () => this.props.data.checkout.result?.isPaymentSectionContainerHasError,\r\n hasError => {\r\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && hasError) {\r\n this.setState({ isPlaceOrderLoading: false });\r\n }\r\n }\r\n );\r\n\r\n // Reaction to enable place order button when redirection is true for new checkout flow.\r\n reaction(\r\n () => this.canPlaceOrder,\r\n async () => {\r\n if (this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout && this.canPlaceOrder) {\r\n if (this.props.data.checkout.result?.isPaymentVerificationRedirection) {\r\n await this.props.data.checkout.result.updateIsPlaceOrderEnabledInRedirection({\r\n newIsPlaceOrderEnabledInRedirection: true\r\n });\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line complexity -- ignore the complexity.\r\n public render(): JSX.Element {\r\n const {\r\n moduleState,\r\n config: { className, checkoutHeading, disableGuidedCheckoutFlow },\r\n resources,\r\n context: {\r\n request: {\r\n user: { isAuthenticated }\r\n }\r\n }\r\n } = this.props;\r\n const { errorMessage } = this.state;\r\n const { backToShopping, placeOrderText, confirmPaymentText, cookieConsentRequiredMessage, genericErrorMessage } = resources;\r\n const checkoutClass = classnames('ms-checkout', className);\r\n const checkoutInformation = this.getSlotItems('checkoutInformation');\r\n\r\n const isConsentGiven =\r\n this.props.context.request &&\r\n this.props.context.request.cookies &&\r\n this.props.context.request.cookies.isConsentGiven &&\r\n this.props.context.request.cookies.isConsentGiven();\r\n\r\n const isMobile =\r\n this.props.context.request &&\r\n this.props.context.request.device &&\r\n (this.props.context.request.device.Type as DeviceType) === 'Mobile';\r\n\r\n const backToShoppingUrl = Msdyn365.getUrlSync('home', this.props.context.actionContext) || '';\r\n const editCartLink = Msdyn365.getUrlSync('cart', this.props.context.actionContext) || '';\r\n\r\n const termsAndConditions =\r\n this.props.slots.termsAndConditions && this.props.slots.termsAndConditions.length > 0 && this.props.slots.termsAndConditions[0];\r\n\r\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.BackToShopping);\r\n const backToShoppingAttributes = getTelemetryAttributes(this.telemetryContent, payLoad);\r\n\r\n const hasInvoiceLine = this.props.data.checkout && this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\r\n const checkoutBtnText = hasInvoiceLine ? confirmPaymentText : placeOrderText;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\r\n const shouldEnableSinglePaymentAuthorizationCheckout =\r\n this.props.data.checkout?.result?.shouldEnableSinglePaymentAuthorizationCheckout ?? false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const isExpressCheckoutApplied = this.props.data.checkout?.result?.isExpressCheckoutApplied ?? false;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const hasShippingAddress = this.props.data.checkout?.result?.hasShippingAddress;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const hasCartDeliveryMode = this.props.data.checkout?.result?.hasCartDeliveryMode;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const hasGuestCheckoutEmail = this.props.data.checkout?.result?.hasGuestCheckoutEmail;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const isTermsAndConditionAccepted = this.props.data.checkout?.result?.isTermsAndConditionAccepted;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check null/undefined.\r\n const isPaymentVerificationRedirection = this.props.data.checkout?.result?.isPaymentVerificationRedirection ?? false;\r\n\r\n let hasExpressPaymentContainer = false;\r\n\r\n if (\r\n typeof window !== 'undefined' &&\r\n (document?.getElementsByClassName(expressPaymentSectionClassName) as HTMLCollectionOf)[0]?.style.display === ''\r\n ) {\r\n hasExpressPaymentContainer = true;\r\n }\r\n\r\n let viewProps: ICheckoutViewProps = {\r\n ...this.props,\r\n className: checkoutClass,\r\n isEmptyCart: this.isEmptyCart,\r\n isConsentGiven,\r\n hasError: this.hasError,\r\n isPaymentVerificationRedirection: this.props.data.checkout?.result?.isPaymentVerificationRedirection,\r\n shouldEnableSinglePaymentAuthorizationCheckout,\r\n hasSalesOrder:\r\n this.props.data.checkout &&\r\n this.props.data.checkout.result !== undefined &&\r\n this.props.data.checkout.result.salesOrder !== undefined,\r\n hasInvoiceLine,\r\n cartStatus: this.cartStatus,\r\n isMobile,\r\n backToShoppingUrl,\r\n editCartLink,\r\n isEditorialMode: this.isEditorialMode,\r\n orderConfirmation:\r\n this.props.slots.orderConfirmation && this.props.slots.orderConfirmation.length > 0\r\n ? this.props.slots.orderConfirmation[0]\r\n : undefined,\r\n checkoutProps: { moduleProps: this.props, className: checkoutClass },\r\n headerProps: { className: 'ms-checkout__head' },\r\n bodyProps: { className: 'ms-checkout__body' },\r\n mainProps: { className: 'ms-checkout__main' },\r\n mainControlProps: { className: 'ms-checkout__main-control' },\r\n sideProps: { className: hasExpressPaymentContainer ? 'ms-checkout__has-express-side' : 'ms-checkout__side' },\r\n sideControlFirstProps: { className: 'ms-checkout__side-control-first' },\r\n sideControlSecondProps: { className: 'ms-checkout__side-control-second' },\r\n termsAndConditionsProps: { className: 'ms-checkout__terms-and-conditions' },\r\n title: checkoutHeading && this.renderMsdyn365Text(checkoutHeading),\r\n hasBillingAddress: this.props.data.checkout.result?.billingAddress !== undefined ? true : false,\r\n customerInformation: this._renderCustomerAccount(),\r\n webQuotationNotice: this._renderWebQuotationNotice(),\r\n webQuotationReferences: this._renderWebQuotationReference()\r\n };\r\n\r\n if (!isConsentGiven && isAuthenticated) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: \r\n };\r\n } else if (this.isLoading()) {\r\n viewProps = {\r\n ...viewProps,\r\n loading: \r\n };\r\n } else if (this.hasError) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: \r\n };\r\n } else {\r\n viewProps = {\r\n ...viewProps,\r\n alert: errorMessage && ,\r\n canShow: true,\r\n guidedForm: checkoutInformation ? (\r\n \r\n ) : (\r\n undefined\r\n ),\r\n orderSummary: getOrderSummary(this.props),\r\n invoicePaymentSummary: getInvoicePaymentSummary(this.props),\r\n lineItems: hasInvoiceLine ? undefined : getLineItems(this.props, this.ProductsWithAttributes, this.telemetryContent),\r\n placeOrderButton: (\r\n \r\n ),\r\n termsAndConditions,\r\n keepShoppingButton: backToShoppingUrl && (\r\n \r\n {backToShopping}\r\n \r\n )\r\n };\r\n }\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Renders heading.\r\n * @param checkoutHeading - The checkout heading.\r\n * @returns React node.\r\n */\r\n public renderMsdyn365Text(checkoutHeading: ICheckoutHeadingData): React.ReactNode {\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Event handler for heading change event.\r\n * @param event - The content change event in heading element.\r\n * @returns The new heading value.\r\n */\r\n public handleCheckoutHeadingChange = (event: Msdyn365.ContentEditableEvent) =>\r\n (this.props.config.checkoutHeading!.text = event.target.value);\r\n\r\n /**\r\n * Checks if cart is loading.\r\n * @returns True if is loading, false otherwise.\r\n */\r\n private readonly isLoading = (): boolean => {\r\n return !this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart || !this.state.isValidationPassed;\r\n };\r\n\r\n /**\r\n * Get slot items.\r\n * @param key - The slot key.\r\n * @returns React node or undefined.\r\n */\r\n private readonly getSlotItems = (key: string): React.ReactNode[] | undefined => {\r\n const { slots } = this.props;\r\n return slots && slots[key] && slots[key].length > 0 ? slots[key] : undefined;\r\n };\r\n\r\n /**\r\n * Trigger the payment section container submit when placing order.\r\n */\r\n private readonly triggerPaymentWithPlaceOrder = async (): Promise => {\r\n this.setState({ isPlaceOrderLoading: true });\r\n\r\n await this.props.data.checkout.result?.updateShouldTriggerPaymentWithPlaceOrder({\r\n newShouldTriggerPaymentWithPlaceOrder: !this.props.data.checkout.result.shouldTriggerPaymentWithPlaceOrder\r\n });\r\n };\r\n\r\n /**\r\n * On place order.\r\n * @returns Void promise.\r\n */\r\n private readonly onPlaceOrder = async (): Promise => {\r\n const {\r\n resources: {\r\n checkoutOutOfStockErrorMessage,\r\n genericErrorMessage,\r\n invalidCartVersionErrorMessage,\r\n missingRequiredCartTenderLinesErrorMessage\r\n },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { enableStockCheck = false }\r\n }\r\n },\r\n slots: { orderConfirmation },\r\n data: { checkout, products }\r\n } = this.props;\r\n\r\n // If hasInvoiceLine is true, no inventory check\r\n if (\r\n !this.props.data.checkout.result?.checkoutCart.hasInvoiceLine &&\r\n enableStockCheck &&\r\n (await this.isOverMaxQuantity((await checkout).checkoutCart.cart, await products))\r\n ) {\r\n this.setState({\r\n errorMessage: checkoutOutOfStockErrorMessage\r\n });\r\n this.props.context.telemetry.error(checkoutOutOfStockErrorMessage);\r\n } else {\r\n const hasOrderConfirmation = orderConfirmation && orderConfirmation.length > 0;\r\n\r\n const updatedCartVersion = await this.updateCartLineEmailAddress(this.props.data.checkout.result?.guestCheckoutEmail || '');\r\n\r\n await placeOrder(\r\n actionContext,\r\n this.props.data.checkout.result,\r\n this.props.data.products.result,\r\n !hasOrderConfirmation,\r\n updatedCartVersion,\r\n this.props.data.checkout.result?.isPaymentVerificationRedirection\r\n ).catch(error => {\r\n let errorMessage = genericErrorMessage;\r\n\r\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n errorMessage = invalidCartVersionErrorMessage;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown error type.\r\n } else if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_MissingRequiredCartTenderLines') {\r\n errorMessage = missingRequiredCartTenderLinesErrorMessage;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- unknown error type.\r\n if (\r\n this.props.data.checkout.result?.shouldEnableSinglePaymentAuthorizationCheckout &&\r\n error.data?.AdditionalContext &&\r\n !this.props.data.checkout.result?.isPaymentVerificationRedirection\r\n ) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n errorMessage\r\n });\r\n this.props.telemetry.exception(error);\r\n });\r\n\r\n await checkout.result?.updateIsPaymentSectionContainerReady({ newIsPaymentSectionContainerReady: false });\r\n }\r\n };\r\n\r\n /**\r\n * Update receipt email address for electronic cart line.\r\n * @param newGuestCheckoutEmail - The guest checkout email.\r\n * @returns The updated cart version.\r\n */\r\n private readonly updateCartLineEmailAddress = async (newGuestCheckoutEmail: string): Promise => {\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n const emailDeliveryCartLines = this.props.data.checkout.result?.checkoutCart.cart.CartLines?.filter(\r\n cartLine => cartLine.DeliveryMode && cartLine.DeliveryMode !== '' && cartLine.DeliveryMode === emailDeliveryModeCode\r\n );\r\n\r\n let updatedCartVersion: number | undefined;\r\n if (emailDeliveryCartLines && emailDeliveryCartLines.length > 0) {\r\n const lineDeliverySpecifications: LineDeliverySpecification[] = emailDeliveryCartLines.map(line => {\r\n return {\r\n LineId: line.LineId,\r\n DeliverySpecification: {\r\n DeliveryModeId: emailDeliveryModeCode,\r\n DeliveryPreferenceTypeValue: DeliveryPreferenceType.ElectronicDelivery,\r\n ElectronicDeliveryEmailAddress: newGuestCheckoutEmail\r\n }\r\n };\r\n });\r\n\r\n await updateLineDeliverySpecificationsAsync(\r\n { callerContext: this.props.context.actionContext },\r\n (await this.props.data.checkout).checkoutCart.cart.Id,\r\n lineDeliverySpecifications\r\n )\r\n .then(updatedCart => {\r\n updatedCartVersion = updatedCart.Version;\r\n })\r\n .catch(error => {\r\n this.props.context.actionContext.telemetry.exception(error);\r\n throw new Error('[updateLineDeliverySpecificationsAsync] Unable to update electronic delivery email address in cart');\r\n });\r\n }\r\n\r\n return updatedCartVersion;\r\n };\r\n\r\n /**\r\n * Return true if any product in the cart is over its max quantity.\r\n * @param cart -- The checkout cart.\r\n * @param products -- The checkout products.\r\n * @returns - Is any product in the cart is over max quantity.\r\n */\r\n private readonly isOverMaxQuantity = async (cart: Cart, products: SimpleProduct[]): Promise => {\r\n let isOverMaxQuantity = false;\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n await getAvailabilitiesForCartLineItems(\r\n new ProductAvailabilitiesForCartLineItems(this.props.context.actionContext.requestContext.apiSettings),\r\n this.props.context.actionContext\r\n )\r\n .then(productInventoryInformation => {\r\n const productsThatShouldValidateInventory: IProductInventoryInformation[] = [];\r\n\r\n cart.CartLines?.map(cartline => {\r\n const cartlineProduct = products.find(product => product.RecordId === cartline.ProductId);\r\n\r\n // If product is non-stocked or cartline is electronic delivery, then no inventory check\r\n const isStockedItem = cartlineProduct?.Behavior?.IsStockedProduct;\r\n const isEmailDelivery =\r\n cartline.DeliveryMode && cartline.DeliveryMode !== '' ? cartline.DeliveryMode === emailDeliveryModeCode : false;\r\n const shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\r\n if (!shouldSkipInventoryCheck && ArrayExtensions.hasElements(productInventoryInformation)) {\r\n const foundProductAvailability = productInventoryInformation.find(productInventory => {\r\n return productInventory.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n if (foundProductAvailability) {\r\n productsThatShouldValidateInventory.push(foundProductAvailability);\r\n }\r\n }\r\n });\r\n\r\n const cartLinesInventoryValidation = validateCartLinesInventory(\r\n cart.CartLines ?? [],\r\n productsThatShouldValidateInventory,\r\n this.props.context.actionContext,\r\n products,\r\n emailDeliveryModeCode\r\n );\r\n\r\n // If is invalid then exceeds the available quantity\r\n isOverMaxQuantity = !cartLinesInventoryValidation.isValid;\r\n return isOverMaxQuantity;\r\n })\r\n .catch(error => {\r\n this.props.context.actionContext.telemetry.exception(error);\r\n throw new Error('[getAvailabilitiesForCartLineItems] Unable to get availabilities for products in checkout cart');\r\n });\r\n\r\n return isOverMaxQuantity;\r\n };\r\n\r\n /**\r\n * Gets active child in module state.\r\n * @returns - The module state manager collection.\r\n */\r\n private readonly getActiveChildModuleStates = (): IModuleStateManager[] => {\r\n const { childIds, getModule } = this.props.moduleState;\r\n return childIds\r\n .map(getModule)\r\n .filter((state): state is IModuleStateManager => !!state && !state.isDisabled && state.hasModuleState);\r\n };\r\n\r\n /**\r\n * On container ready.\r\n */\r\n private readonly onContainerReady = (): void => {\r\n this.getActiveChildModuleStates().forEach(state => {\r\n state.isReady && state.onContainerReady && state.onContainerReady();\r\n });\r\n };\r\n\r\n /**\r\n * Redirects to cart page.\r\n * @param notFoundEditCartLinkMessage - Not found edit cart link message.\r\n */\r\n private readonly redirectToCartPage = (notFoundEditCartLinkMessage: string): void => {\r\n const editCartLink = Msdyn365.getUrlSync('cart', this.props.context.actionContext) || '';\r\n if (window && editCartLink) {\r\n window.location.assign(editCartLink);\r\n } else {\r\n this.setState({\r\n errorMessage: this.props.resources.genericErrorMessage\r\n });\r\n this.props.context.telemetry.error(notFoundEditCartLinkMessage);\r\n }\r\n };\r\n\r\n /**\r\n * Validates for checkout.\r\n * @param retry - Retry flag.\r\n */\r\n private readonly validateForCheckout = (retry: boolean = true): void => {\r\n const notFoundEditCartLinkMessage = \"Cart doesn't pass validation, but no editCartLink found\";\r\n const cart = this.props.data.checkout.result!.checkoutCart.cart;\r\n const { Id, Version } = cart;\r\n const isOrderQuantityLimitsFeatureEnabledInHq =\r\n this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n const customerInfo = this.props.data.customerInformation.result;\r\n\r\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\r\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\r\n (customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\r\n if (isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings) {\r\n if (Version && Id) {\r\n validateForCheckoutAsync({ callerContext: this.props.context.actionContext, bypassCache: 'none' }, Id, Version)\r\n .then((result: CartLineValidationResults) => {\r\n if (result.ValidationFailuresByCartLines?.length !== 0) {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n } else {\r\n this.setState({ isValidationPassed: true });\r\n }\r\n })\r\n .catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n const cartState = this.props.data.checkout.result?.checkoutCart;\r\n cartState\r\n ?.refreshCart({})\r\n .then(() => {\r\n this.validateForCheckout(false);\r\n })\r\n .catch((refreshError: Error) => {\r\n this.props.telemetry.warning(refreshError.message);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n });\r\n } else {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n }\r\n });\r\n } else {\r\n this.redirectToCartPage(notFoundEditCartLinkMessage);\r\n }\r\n } else {\r\n this.setState({ isValidationPassed: true });\r\n }\r\n };\r\n\r\n /**\r\n * Prints Customer account number for web quotation\r\n */\r\n private readonly _renderCustomerAccount = (): React.ReactNode => {\r\n return this.props.data.customerInformation.result ? (\r\n <>\r\n
\r\n

{this.props.resources.customerAccountTitle} :

\r\n
{this.props.data.customerInformation.result?.AccountNumber}
\r\n
\r\n \r\n ) : (\r\n ''\r\n );\r\n };\r\n\r\n /**\r\n * Prints legal Notice for web quotation\r\n */\r\n private readonly _renderWebQuotationNotice = (): React.ReactNode => {\r\n return (\r\n <>\r\n
{this.props.resources.webQuotationNotice}
\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Prints internal Cart references for web quotation\r\n */\r\n private readonly _renderWebQuotationReference = (): React.ReactNode => {\r\n return this.props.data.checkout?.result?.checkoutCart?.cart ? (\r\n <>\r\n
\r\n Cart ID : {this.props.data.checkout?.result?.checkoutCart?.cart.Id}\r\n
\r\n Cart Version : {this.props.data.checkout?.result?.checkoutCart?.cart.Version}\r\n
\r\n
\r\n \r\n ) : (\r\n ''\r\n );\r\n };\r\n}\r\n\r\nexport default Checkout;\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 { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport checkout from './dyn-checkout';\r\nimport emptyActiveCart from './empty-active-cart';\r\n\r\nexport default async (\r\n ctx: IActionContext,\r\n checkoutState: ICheckoutState | undefined,\r\n orderedProducts: SimpleProduct[] | undefined,\r\n redirect: boolean,\r\n updatedCartVersion?: number,\r\n isPaymentVerificationRedirection?: boolean\r\n) => {\r\n return new Promise(async (resolve: () => void, reject: (reason?: Error) => void) => {\r\n let salesOrder: SalesOrder;\r\n\r\n // Proceed checkout\r\n try {\r\n salesOrder = await checkout(ctx, updatedCartVersion, isPaymentVerificationRedirection);\r\n } catch (error) {\r\n reject(error);\r\n return;\r\n }\r\n\r\n // Remove purchased items from the active cart\r\n try {\r\n await emptyActiveCart(ctx);\r\n } catch (error) {\r\n reject(error);\r\n return;\r\n }\r\n\r\n if (redirect) {\r\n // Redirect to the order confirmation page\r\n const orderConfirmationUrl = getUrlSync('orderConfirmation', ctx) || '';\r\n if (!orderConfirmationUrl) {\r\n reject(new Error('Error: No orderConfirmationUrl'));\r\n return;\r\n }\r\n\r\n const separator = orderConfirmationUrl.includes('?') ? '&' : '?';\r\n const url = `${orderConfirmationUrl}${separator}transactionId=${salesOrder.Id}`;\r\n window.location.assign(url);\r\n } else {\r\n if (checkoutState) {\r\n const result = await checkoutState.updateSalesOrder({\r\n newSalesOrder: salesOrder,\r\n newOrderedProducts: orderedProducts || []\r\n });\r\n\r\n if (result.status === 'FAILED') {\r\n reject(new Error('Error: Updating error state failed'));\r\n return;\r\n }\r\n } else {\r\n reject(new Error('Error: No checkout state'));\r\n return;\r\n }\r\n resolve();\r\n }\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\nimport { Module, Node, Waiting, Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from './dyn-checkout';\r\nimport { IEmailDelivery } from './components';\r\nimport { IInvoicePaymentSummary } from './components/get-invoice-payment-summary';\r\n\r\nexport const PickUpAtStoreComponent: React.FC = ({ PickUpAtStore, label, location }) => (\r\n \r\n {label}\r\n {location}\r\n \r\n);\r\n\r\nexport const EmailDeliveryComponent: React.FC = ({ EmailDelivery, label }) => {label};\r\n\r\nexport const LineItemComponent: React.FC = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\r\n \r\n {item}\r\n {pickUpAtStore && }\r\n {emailDelivery && }\r\n \r\n);\r\n\r\nexport const LineItemGroupComponent: React.FC = ({ LineItemDeliveryGroup, LineItemList, heading, lineItems }) => (\r\n \r\n {heading}\r\n \r\n {lineItems.map(lineItem => (\r\n \r\n ))}\r\n \r\n \r\n);\r\n\r\nexport const LineItemGroupComponentWithMultiplePickUp: React.FC = ({\r\n LineItemDeliveryGroup,\r\n LineItemList,\r\n heading,\r\n lineItems,\r\n lineItemWraper,\r\n lineItemWraperIcon\r\n}) => (\r\n \r\n {lineItemWraperIcon}\r\n {lineItemWraper}\r\n {heading}\r\n \r\n {lineItems.map(lineItem => (\r\n \r\n ))}\r\n \r\n \r\n);\r\n\r\nexport const LineItemComponentWithMultiplePickUp: React.FC = ({ LineItem, item, pickUpAtStore, emailDelivery }) => (\r\n \r\n {item}\r\n {emailDelivery && }\r\n \r\n);\r\n\r\nexport const PickUpAtStoreComponentWithMultiplePickUp: React.FC = ({ PickUpAtStore, label, location }) => (\r\n \r\n {label}\r\n {location}\r\n \r\n);\r\n\r\nexport const LineItemsComponent: React.FC = ({\r\n LineItems,\r\n Header,\r\n heading,\r\n editLink,\r\n itemsForPickup,\r\n itemsForShip,\r\n itemsForEmail,\r\n itemsGroupWithMulitplePickupMode\r\n}) => (\r\n \r\n \r\n {heading}\r\n {editLink}\r\n \r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForPickup && }\r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForEmail && }\r\n {itemsGroupWithMulitplePickupMode === undefined && itemsForShip && }\r\n {itemsGroupWithMulitplePickupMode !== undefined\r\n ? itemsGroupWithMulitplePickupMode.map((item, index) => {\r\n return ;\r\n })\r\n : null}\r\n \r\n);\r\n\r\nconst OrderSummaryComponent: React.FC = ({ heading, lines }) => (\r\n
\r\n {heading}\r\n
\r\n {lines && (\r\n <>\r\n {lines.netTotal}\r\n {lines.totalDiscounts}\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.otherCharge}\r\n {lines.tax}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n \r\n )}\r\n
\r\n
\r\n);\r\n\r\nconst PaymentSummaryComponent: React.FC = ({ heading, lines }) => (\r\n
\r\n {heading}\r\n
\r\n {lines && (\r\n <>\r\n {lines.invoices}\r\n {lines.giftCard}\r\n {lines.loyalty}\r\n {lines.orderTotal}\r\n \r\n )}\r\n
\r\n
\r\n);\r\n\r\nconst CheckoutView: React.FC = props => {\r\n const {\r\n isPaymentVerificationRedirection,\r\n shouldEnableSinglePaymentAuthorizationCheckout,\r\n canShow,\r\n checkoutProps,\r\n headerProps,\r\n hasSalesOrder,\r\n hasInvoiceLine,\r\n bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n sideControlFirstProps,\r\n sideControlSecondProps,\r\n termsAndConditionsProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n orderSummary,\r\n invoicePaymentSummary,\r\n lineItems,\r\n placeOrderButton,\r\n termsAndConditions,\r\n keepShoppingButton,\r\n //hasBillingAddress,\r\n customerInformation,\r\n webQuotationNotice,\r\n webQuotationReferences\r\n } = props;\r\n\r\n return (\r\n \r\n {!hasSalesOrder && {title}}\r\n {!hasSalesOrder && isPaymentVerificationRedirection && shouldEnableSinglePaymentAuthorizationCheckout && !alert && !loading && (\r\n \r\n )}\r\n {!hasSalesOrder && (\r\n \r\n {loading}\r\n {alert}\r\n {canShow && (\r\n <>\r\n \r\n {webQuotationReferences}\r\n {guidedForm}\r\n {customerInformation}\r\n {termsAndConditions}\r\n \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n \r\n \r\n
{keepShoppingButton}
\r\n {lineItems && }\r\n {!hasInvoiceLine\r\n ? orderSummary && \r\n : invoicePaymentSummary && }\r\n \r\n {termsAndConditions}\r\n {placeOrderButton}\r\n {/* {keepShoppingButton} */}\r\n \r\n \r\n \r\n {termsAndConditions}\r\n {placeOrderButton}\r\n {/* {keepShoppingButton} */}\r\n \r\n
\r\n \r\n )}\r\n {webQuotationNotice}\r\n
\r\n )}\r\n {hasSalesOrder && orderConfirmation}\r\n
\r\n );\r\n};\r\n\r\nexport default CheckoutView;\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 * IDynProductCollection containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum layout {\r\n list = 'list',\r\n carousel = 'carousel',\r\n grid = 'grid'\r\n}\r\n\r\nexport interface IDynProductCollectionConfig extends Msdyn365.IModuleConfig {\r\n productCollection: Msdyn365.IProductList;\r\n heading?: IHeadingData;\r\n layout?: layout;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n clientRender?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n shouldDisplaySeeAllButton?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport interface IDynProductCollectionResources {\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingCountAriaLabel: string;\r\n ratingCountAriaLabelSingleUser: string;\r\n seeAllButtonText: string;\r\n}\r\n\r\nexport const enum HeadingTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface IHeadingData {\r\n text: string;\r\n tag?: HeadingTag;\r\n}\r\n\r\nexport interface IDynProductCollectionProps extends Msdyn365.IModule {\r\n resources: IDynProductCollectionResources;\r\n config: IDynProductCollectionConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { TebuProductComponent } from '../dyn-search-result-container/components'; // DYN : product component for list display\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n DimensionSwatchDisplayTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n ObjectExtensions,\r\n PriceForProductSearchResultInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getTelemetryObject,\r\n IComponentNodeProps,\r\n IModuleProps,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n ITelemetryContent,\r\n NodeTag,\r\n SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IDynProductCollectionData } from './dyn-product-collection.data';\r\nimport { IDynProductCollectionProps, layout } from './dyn-product-collection.props.autogenerated';\r\n\r\nexport interface IProductCollectionViewProps extends IDynProductCollectionProps {\r\n heading?: React.ReactNode;\r\n ProductCollectionContainer: IModuleProps;\r\n ListComponentProps: INodeProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n GridComponentProps: INodeProps;\r\n products: IProductComponentViewProps[];\r\n isCarousel: boolean;\r\n isList: boolean;\r\n productPrices?: ProductPrice[];\r\n seeAllButton?: React.ReactNode;\r\n}\r\n\r\nexport interface IProductComponentViewProps {\r\n ProductContainer: INodeProps;\r\n productComponent: React.ReactNode;\r\n}\r\nexport interface IProductComponentState {\r\n products: ProductSearchResult[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * ProductCollection component.\r\n */\r\nclass ProductCollection extends React.PureComponent, IProductComponentState> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n constructor(props: IDynProductCollectionProps) {\r\n super(props);\r\n this.productPrices = [];\r\n this.state = {\r\n products: this.props.config.productCollection.products || []\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\r\n await this._getActivePrice();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { heading, className, shouldDisplaySeeAllButton } = this.props.config;\r\n const { resources } = this.props;\r\n const recommendation = this.props.config.productCollection.recommendationListId;\r\n\r\n // Initialize state in case if the products were not found during initial module render\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\r\n this.initProductState(this.props.config.productCollection);\r\n\r\n const products = this.state.products;\r\n const isList = this.props.config.layout === layout.list;\r\n const isCarousel = this.props.config.layout === layout.carousel;\r\n const headingLabel = heading ? heading.text : '';\r\n const headingComponent = heading && (\r\n \r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\r\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\r\n const getProductData = this._getProduct(item, index, isList);\r\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\r\n });\r\n\r\n const productCollectionViewProps = {\r\n ...this.props,\r\n heading: headingComponent,\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: '',\r\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\r\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\r\n parentId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n } as IComponentNodeProps,\r\n ProductCollectionContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-product-collection', className)\r\n },\r\n GridComponentProps: {\r\n tag: 'ul' as NodeTag,\r\n className: 'ms-product-collection__items'\r\n },\r\n ListComponentProps: {\r\n tag: 'ul' as NodeTag,\r\n className: 'ms-product-collection-list__items'\r\n },\r\n isCarousel,\r\n isList,\r\n\r\n products:\r\n ArrayExtensions.hasElements(updatedProducts) &&\r\n updatedProducts.filter(item => {\r\n return item !== undefined;\r\n }),\r\n productPrices: this.productPrices,\r\n seeAllButton:\r\n recommendation && shouldDisplaySeeAllButton && ArrayExtensions.hasElements(updatedProducts)\r\n ? this._getSeeAllButton(recommendation, headingLabel)\r\n : undefined\r\n };\r\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\r\n }\r\n\r\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @param products - Products.\r\n * @returns Promise.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise => {\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n const validProducts = ArrayExtensions.validValues(products);\r\n if (\r\n ArrayExtensions.hasElements(validProducts) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\r\n ) {\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(\r\n validProducts,\r\n this.props.context as ICoreContext,\r\n DimensionSwatchDisplayTypes.productCard\r\n ),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Helper method to initialize products state.\r\n * @param productCollection - List of products.\r\n */\r\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\r\n let products = this.state.products;\r\n const productCollectionProducts = productCollection.products;\r\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\r\n products = productCollectionProducts;\r\n this.setState({ products });\r\n } else if (\r\n ArrayExtensions.hasElements(products) &&\r\n ArrayExtensions.hasElements(productCollectionProducts) &&\r\n !ArrayExtensions.equals(products, productCollectionProducts)\r\n ) {\r\n products = productCollectionProducts;\r\n this.setState({ products });\r\n } else if (productCollectionProducts === undefined && ArrayExtensions.hasElements(this.state.products)) {\r\n products = [];\r\n this.setState({ products: products });\r\n }\r\n\r\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\r\n await this._getProductsDimensionsAvailabilities(products);\r\n }\r\n };\r\n\r\n // DYN :\r\n private checkHidePrice(product: ProductSearchResult): boolean {\r\n if (!ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return false;\r\n }\r\n const erpMarketStatusAttribute = product.AttributeValues.find(attribute => attribute.Name === 'ERP_MarketStatus');\r\n if (erpMarketStatusAttribute && erpMarketStatusAttribute.TextValue === 'Hide price') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private readonly _getProduct = (product: ProductSearchResult, index: number, isList: boolean): IProductComponentViewProps | null => {\r\n if (!product || !product.Name) {\r\n this.props.telemetry.trace('[product-collection] Product or product name is null');\r\n return null;\r\n }\r\n const telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const resources = this.props.resources;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const quickviewSlot =\r\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\r\n const productComparisonButtonSlot = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\r\n ? this.props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n const reviewCount = 1;\r\n const reviewTotalRatings = Number(product.TotalRatings);\r\n const reviewCountAriaLabelValue =\r\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\r\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return {\r\n ProductContainer: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-product-collection__item',\r\n role: 'listitem',\r\n key: index\r\n },\r\n productComponent: isList ? ( // DYN : added TebuProductComponent for list display\r\n \r\n ) : (\r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\r\n )}\r\n />\r\n )\r\n };\r\n };\r\n\r\n /**\r\n * Get the active price for products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.state.products;\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n if (Msdyn365.msdyn365Commerce.isBrowser) {\r\n await this._getProductsDimensionsAvailabilities(products);\r\n }\r\n\r\n this.setState({ products });\r\n };\r\n\r\n /**\r\n * Get the see all button.\r\n * @param recommendation - Recommendation.\r\n * @param headingLabel - Heading label.\r\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\r\n */\r\n private readonly _getSeeAllButton = (recommendation: string, headingLabel: string): React.ReactNode => {\r\n const catalogId = getCatalogId(this.props.context.request);\r\n const seeAllLink = `/search?recommendation=${recommendation}&title=${headingLabel}&catalogid=${catalogId}`;\r\n return (\r\n \r\n {this.props.resources.seeAllButtonText}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default ProductCollection;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './dyn-product-collection';\r\n\r\nconst ProductCollectionView: React.FC = props => {\r\n const {\r\n heading,\r\n ProductCollectionContainer,\r\n products,\r\n SingleSlideCarouselComponentProps,\r\n ListComponentProps,\r\n GridComponentProps,\r\n isCarousel,\r\n isList,\r\n seeAllButton\r\n } = props;\r\n\r\n if (products) {\r\n return (\r\n \r\n {heading}\r\n {seeAllButton}\r\n {isList\r\n ? _renderList(ListComponentProps, products)\r\n : isCarousel\r\n ? _renderCarousel(SingleSlideCarouselComponentProps, products)\r\n : _renderGrid(GridComponentProps, products)}\r\n \r\n );\r\n }\r\n props.context.telemetry.error('Product collection content is empty, module wont render.');\r\n return null;\r\n};\r\n\r\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\nconst _renderList = (listContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\r\n const { ProductContainer, productComponent } = product;\r\n\r\n return {productComponent};\r\n};\r\n\r\nexport default ProductCollectionView;\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n const { selectedChoices } = this.props;\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && label && {label}}\r\n
    \r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.key}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && (\r\n \r\n {clearAllText}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(\r\n selected => (itemClicked.textContent && itemClicked.textContent.trim()) === selected.key\r\n );\r\n return (result && result.value) || undefined;\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 * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
{text}
\r\n
\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 { ICoreContext, IGridSettings, IImageSettings, IRequestContext } from '@msdyn365-commerce/core'; //Image, IImageData\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IDynSearchResultContainerResources } from '../dyn-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IDynSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading =\r\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n \r\n
\r\n

{heading}

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n altText?: string,\r\n fallbackImage?: string,\r\n context?: IRequestContext\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n // const img: IImageData = {\r\n // src: imageUrl,\r\n // altText: altText ? altText : ''\r\n // };\r\n // const imageProps = {\r\n // gridSettings,\r\n // imageSettings,\r\n // fallBackSrc: fallbackImage\r\n // };\r\n return ; //;\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return

{title}

;\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 * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n \r\n {' '}\r\n {text}{' '}\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 { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return {props.resources.modalTitle};\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \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 { TebuProductComponent } from './product.component'; //'@msdyn365-commerce/components';\r\nimport { IPriceComponentResources } from './price.component'; //'@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IDynSearchResultContainerResources } from '../dyn-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IDynSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction checkHidePrice(product: ProductSearchResult): boolean {\r\n if (!ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return false;\r\n }\r\n const erpMarketStatusAttribute = product.AttributeValues.find(attribute => attribute.Name === 'ERP_MarketStatus');\r\n if (erpMarketStatusAttribute && erpMarketStatusAttribute.TextValue === 'Hide price') {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n \r\n
  • \r\n ))}\r\n
\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 * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => {separator} ;\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 * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => {text} ;\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 { IComponent, IComponentProps, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n//import { ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductPrice, AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n//import Button from 'reactstrap/lib/Button';\r\n\r\n/**\r\n * Interface for price component resources.\r\n * @param {string} priceRangeSeparator - The price range separator.\r\n */\r\nexport interface IPriceComponentResources {\r\n priceRangeSeparator?: string;\r\n}\r\n\r\n/**\r\n * Interface for price component props.\r\n * @param {boolean} isPriceMinMaxEnabled - Whether the price range feature is enabled or not.\r\n * @param {IPriceComponentResources} priceResources - The price range resources.\r\n */\r\nexport interface ITebuPriceModel3ComponentProps extends IComponentProps<{ price: ProductPrice }> {\r\n className?: string;\r\n savingsText?: string;\r\n freePriceText?: React.ReactNode;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n productAttributes?: AttributeValue[];\r\n toggleForm?: any;\r\n hidePrice?: boolean;\r\n productEnquiryLink?: string;\r\n}\r\nexport interface ITebuPriceModel3Component extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst Price: React.FC = (props: ITebuPriceModel3ComponentProps) => {\r\n // CustomerContextualPrice could be 0\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n\r\n // Verrue pour cacher les prix sur certains canaux\r\n if (\r\n props.context.request.sitePath === '/dk-sek' ||\r\n props.context.request.sitePath === '/dk-nok' ||\r\n props.context.request.sitePath === '/dk-eur'\r\n ) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)}\r\n \r\n );\r\n};\r\n\r\nconst showStrikethroughPricing = (props: ITebuPriceModel3ComponentProps) => {\r\n const originalPrice = getOriginalPrice(props);\r\n\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getOriginalPrice = (props: ITebuPriceModel3ComponentProps) => {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\n\r\nconst formatCurrency = (\r\n props: ITebuPriceModel3ComponentProps,\r\n price: number | undefined,\r\n shouldUseFreePriceText: boolean | undefined,\r\n enableMarketingForm?: boolean\r\n): React.ReactNode | undefined => {\r\n if (price === undefined) {\r\n //return undefined;\r\n return <>;\r\n }\r\n\r\n if (props.hidePrice) {\r\n return (\r\n \r\n Price Enquiry\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {props.context.cultureFormatter.formatCurrency(price)}\r\n \r\n );\r\n};\r\n\r\nconst renderCurrentPrice = (props: ITebuPriceModel3ComponentProps): JSX.Element | undefined => {\r\n const initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice, true);\r\n const maxVariantPrice = formatCurrency(props, props.data.price.MaxVariantPrice, false);\r\n const minVariantPrice = formatCurrency(props, props.data.price.MinVariantPrice, false);\r\n if (props.hidePrice) {\r\n return
{initialPrice}
;\r\n }\r\n if (props.isPriceMinMaxEnabled && maxVariantPrice !== minVariantPrice && maxVariantPrice && minVariantPrice) {\r\n return (\r\n \r\n \r\n {minVariantPrice}\r\n \r\n \r\n {props.priceResources?.priceRangeSeparator}\r\n \r\n \r\n {maxVariantPrice}\r\n \r\n \r\n );\r\n }\r\n\r\n return
From: {initialPrice}
;\r\n};\r\n\r\nconst renderCurrentPriceWithOriginalPrice = (props: ITebuPriceModel3ComponentProps): JSX.Element | null => {\r\n const originalPrice = getOriginalPrice(props);\r\n const initialPrice = formatCurrency(props, originalPrice, true);\r\n\r\n return (\r\n <>\r\n {props.hidePrice ? (\r\n \r\n ) : (\r\n <>\r\n \r\n {' '}\r\n {props.originalPriceText} {initialPrice} {props.currentPriceText} {renderCurrentPrice(props)}\r\n \r\n \r\n \r\n {props.savingsText && {props.savingsText}}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport const TebuPriceModel3Component: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n ITebuPriceModel3Component\r\n>('TebuPriceModel3', { component: Price, ...PriceComponentActions });\r\n\r\nexport default TebuPriceModel3Component;\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 {\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageProps,\r\n IImageSettings,\r\n IRequestContext,\r\n msdyn365Commerce\r\n} from '@msdyn365-commerce/core'; // Image, IImageData,\r\nimport { AttributeSwatch, AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionTypes,\r\n generateImageUrl,\r\n getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { TebuPriceModel3Component } from './price.component';\r\nimport { IPriceComponentResources, ISwatchItem, RatingComponent, ProductComponentSwatchComponent } from '@msdyn365-commerce/components';\r\n\r\nexport interface ITebuProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n hidePrice?: boolean;\r\n}\r\n\r\nexport interface ITebuProductComponent extends IComponent {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\ndeclare global {\r\n interface Window {\r\n jQuery?: any;\r\n }\r\n}\r\n\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n hidePrice\r\n}) => {\r\n const product = data.product;\r\n\r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\r\n );\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls)\r\n ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\r\n : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n ): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState();\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback(\r\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [context, productPageUrl]\r\n );\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n
\r\n {unitOfMeasure}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {inventoryAvailabilityLabel}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches =\r\n item.Swatches?.map(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault\r\n };\r\n }) ?? [];\r\n if (\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) &&\r\n dimensionType === DimensionTypes.color\r\n ) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string\r\n ): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\r\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\r\n }`;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n requestContext?: IRequestContext\r\n ): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // const image: IImageData = {\r\n // src: imageUrl,\r\n // altText: altText ? altText : '',\r\n // fallBackSrc: fallbackImageUrl\r\n // };\r\n const imageProps: IImageProps = { gridSettings };\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return ; //;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price. */\r\n function renderPrice(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n maxVariantPrice?: number,\r\n minVariantPrice?: number,\r\n savingsPriceResourceText?: string,\r\n freePriceResourceText?: string,\r\n originalPriceResourceText?: string,\r\n currentPriceResourceText?: string,\r\n hidePrice?: boolean\r\n ): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n ): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return

{description}

;\r\n }\r\n\r\n function getErpExternalItemId(attributeValues?: AttributeValue[]): string | undefined {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute =>\r\n attribute.Name === 'External Item Id' ||\r\n attribute.Name === 'ERP_ExternalItemID' ||\r\n attribute.KeyName === 'ERPExternalItemID'\r\n );\r\n if (externalItemIdAttribute && externalItemIdAttribute.TextValue !== '') {\r\n return externalItemIdAttribute.TextValue;\r\n }\r\n return '';\r\n }\r\n\r\n function getErpSize(attributeValues?: AttributeValue[]): string | undefined {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute => attribute.Name === 'ERP_Sizes' || attribute.KeyName === 'ERPSizes'\r\n );\r\n if (externalItemIdAttribute && externalItemIdAttribute.TextValue !== '') {\r\n return externalItemIdAttribute.TextValue;\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param Name - Product Name.\r\n * @returns The product Name external item id component.\r\n */\r\n function renderErpExternalItemId(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n const attribute = getErpExternalItemId(attributeValues);\r\n if (attribute) {\r\n return (\r\n
\r\n {'Ref: '}\r\n {attribute}\r\n
\r\n );\r\n } else {\r\n return <>;\r\n }\r\n }\r\n\r\n function renderErpSize(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n const attribute = getErpSize(attributeValues);\r\n if (attribute) {\r\n return (\r\n
\r\n Sizes: \r\n {attribute}\r\n
\r\n );\r\n } else {\r\n return <>;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param Name - Product Name.\r\n * @returns The product Name external item id component.\r\n */\r\n function renderName(name?: string, attributeValues?: AttributeValue[]): JSX.Element | null {\r\n /*const attribute = getExternalItemId(attributeValues);\r\n if (attribute) {\r\n return (\r\n

\r\n {name}-{getExternalItemId(attributeValues)}\r\n

\r\n );\r\n } else {\r\n */\r\n return

{name}

;\r\n //}\r\n }\r\n\r\n React.useEffect(() => {\r\n const recordId = product.RecordId;\r\n const catalogNumber =\r\n product.AttributeValues?.find(attribute => attribute.Name === 'ERP_Bioz_BadgeRepresentative')?.TextValue ?? '';\r\n const catalogNumberFormatted = catalogNumber.replace(/[ .]/g, '_');\r\n\r\n if (!catalogNumberFormatted) {\r\n return;\r\n } // Exit if there's no catalog number formatted\r\n\r\n // Append styles\r\n appendStyles();\r\n\r\n let isJQueryLoaded = typeof window.jQuery !== 'undefined';\r\n const scriptJQueryExisting = getScriptBySrc('https://cdn.bioz.com/assets/jquery-2.2.4.js');\r\n const scriptJQueryNew = !scriptJQueryExisting\r\n ? appendResource('script', null, 'https://cdn.bioz.com/assets/jquery-2.2.4.js')\r\n : null;\r\n\r\n if (isJQueryLoaded) {\r\n loadAfterJQuery();\r\n } else if (scriptJQueryExisting) {\r\n scriptJQueryExisting.addEventListener('load', () => {\r\n isJQueryLoaded = true;\r\n loadAfterJQuery();\r\n });\r\n } else if (scriptJQueryNew) {\r\n scriptJQueryNew.addEventListener('load', loadAfterJQuery);\r\n }\r\n\r\n function loadAfterJQuery() {\r\n // Load other scripts after jQuery\r\n appendOtherScripts();\r\n\r\n // Load script2 and append inlineBioz after script2 loads\r\n const script2 = document.createElement('script');\r\n script2.src = 'https://cdn.bioz.com/assets/v_widget-2.5.tebubio.js';\r\n script2.addEventListener('load', () => {\r\n const inlineBioz = createInlineBiozScript(recordId, catalogNumberFormatted);\r\n document.body.appendChild(inlineBioz);\r\n });\r\n document.head.appendChild(script2);\r\n }\r\n\r\n // Cleanup on component unmount\r\n return () => {\r\n const resources: (HTMLElement | null)[] = [\r\n getScriptBySrc('https://cdn.bioz.com/assets/jquery-2.2.4.js') as HTMLElement,\r\n getScriptBySrc('https://cdn.bioz.com/assets/bioz-w-api-2.5.min.js') as HTMLElement,\r\n getScriptBySrc('https://cdn.bioz.com/assets/tooltipster.js') as HTMLElement,\r\n getScriptBySrc('https://cdn.bioz.com/assets/v_widget-2.5.tebubio.js') as HTMLElement,\r\n document.querySelector(`script:contains(\"var _type = 'commercial';\")`) as HTMLElement\r\n ].filter(Boolean) as HTMLElement[]; // filter out any null values and assert the resulting type\r\n\r\n cleanupResources(resources);\r\n };\r\n }, [product]);\r\n\r\n function appendStyles(): void {\r\n // CSS Links\r\n appendResource('link', 'stylesheet', 'https://cdn.bioz.com/assets/font-awesome-reg.css');\r\n appendResource('link', 'stylesheet', 'https://cdn.bioz.com/assets/tooltipster.css');\r\n appendResource('link', 'stylesheet', 'https://cdn.bioz.com/assets/tooltipster-theme2.css');\r\n appendResource('link', 'stylesheet', 'https://cdn.bioz.com/assets/v_widget-2.5.css');\r\n }\r\n\r\n function appendOtherScripts(): void {\r\n // Load other scripts (script1, script3, and inline script)\r\n appendResource('script', null, 'https://cdn.bioz.com/assets/bioz-w-api-2.5.min.js');\r\n appendResource('script', null, 'https://cdn.bioz.com/assets/tooltipster.js');\r\n\r\n const inlineScript = document.createElement('script');\r\n inlineScript.innerHTML = `\r\n var _type = \"commercial\";\r\n var _company = \"19338\";\r\n var _vendor = \"tebu-bio sa\";\r\n var _vendor_partner_color = \"#0F37AF\";\r\n var _form_url = \"https://back-badge-8.bioz.com\";\r\n var _key = \"\";\r\n var _form_mobile = false;\r\n `;\r\n document.body.appendChild(inlineScript);\r\n }\r\n\r\n function appendResource(type: 'link' | 'script', rel: string | null, hrefOrSrc: string): HTMLElement | null {\r\n if (isResourceAlreadyAdded(type, hrefOrSrc)) {\r\n return null;\r\n }\r\n\r\n const element = document.createElement(type);\r\n\r\n if (type === 'link') {\r\n (element as HTMLLinkElement).rel = rel as string;\r\n (element as HTMLLinkElement).href = hrefOrSrc;\r\n document.head.appendChild(element);\r\n } else if (type === 'script') {\r\n (element as HTMLScriptElement).src = hrefOrSrc;\r\n document.head.appendChild(element);\r\n } else {\r\n return null; // Make sure to return null for any other conditions\r\n }\r\n\r\n return element;\r\n }\r\n\r\n function createInlineBiozScript(recordId: number, catalogNumberFormatted: string): HTMLScriptElement {\r\n const inlineBioz = document.createElement('script');\r\n inlineBioz.innerHTML = `\r\n var widget_micro_obj_${recordId} = new v_widget_obj(\"s\", 2);\r\n widget_micro_obj_${recordId}.request_catalog_number_widget_data_internal(\"${catalogNumberFormatted}\", \"${catalogNumberFormatted}-${recordId}\");\r\n `;\r\n return inlineBioz;\r\n }\r\n\r\n function cleanupResources(resources: (HTMLElement | null)[]): void {\r\n resources.forEach(resource => {\r\n if (resource && document.body.contains(resource)) {\r\n document.body.removeChild(resource);\r\n } else if (resource && document.head.contains(resource)) {\r\n document.head.removeChild(resource);\r\n }\r\n });\r\n }\r\n\r\n function getScriptBySrc(src: string): HTMLScriptElement | null {\r\n return document.querySelector(`script[src=\"${src}\"]`);\r\n }\r\n\r\n function isResourceAlreadyAdded(type: 'link' | 'script', srcOrHref: string): boolean {\r\n if (type === 'link') {\r\n return !!document.querySelector(`link[href=\"${srcOrHref}\"]`);\r\n } else if (type === 'script') {\r\n return !!document.querySelector(`script[src=\"${srcOrHref}\"]`);\r\n }\r\n return false;\r\n }\r\n\r\n const catalogNumber = product.AttributeValues?.find(attribute => attribute.Name === 'ERP_Bioz_BadgeRepresentative')?.TextValue ?? '';\r\n const catalogNumberFormatted = catalogNumber?.replace(/[ .]/g, '_');\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n
\r\n

{renderName(product.Name, product.AttributeValues)}

\r\n
\r\n \r\n {catalogNumberFormatted ? (\r\n
\r\n
\r\n
\r\n \r\n Powered by Bioz\r\n \r\n
\r\n
\r\n ) : (\r\n ''\r\n )}\r\n
\r\n {renderErpExternalItemId(product.AttributeValues)}\r\n {renderErpSize(product.AttributeValues)}\r\n {renderProductDimensions(product.AttributeValues)}\r\n
\r\n
\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n product.MaxVariantPrice,\r\n product.MinVariantPrice,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n hidePrice\r\n )}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n \r\n
Product detail
\r\n \r\n
\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n \r\n );\r\n};\r\n\r\nexport const TebuProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n ITebuProductComponent\r\n>('TebuProduct', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default TebuProductComponent;\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 { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return [\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ];\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (\r\n sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string\r\n ): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return [\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ];\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n // Dyn : récupération correctif MS V9.41.18\r\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n return amount || '';\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(productRefinerValue, parentProductRefinerHierarchy, isChecked, context, index, telemetryContent);\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n return (\r\n
  • \r\n \r\n {this._renderSwatch()}\r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _renderSwatch(): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasValidSwatch = hasColor || hasImage;\r\n const shouldDisplayAsSwatch =\r\n hasValidSwatch && checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\r\n const swatchItems = shouldDisplayAsSwatch\r\n ? [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ]\r\n : undefined;\r\n\r\n if (!swatchItems) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n private _renderRating(\r\n productRefinerValue: ProductRefinerValue,\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean,\r\n context: ICoreContext,\r\n index?: number,\r\n telemetryContent?: ITelemetryContent\r\n ): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n />\r\n );\r\n });\r\n return (\r\n \r\n {listItems}\r\n \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\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 { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry\r\n): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\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 * IDynSearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n none = 'none',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IDynSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport interface IDynSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n}\r\n\r\nexport interface IDynSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IDynSearchResultContainerResources;\r\n config: IDynSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\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 { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { getCartFromCustomer } from '@msdyn365-commerce/global-state';\r\nimport {\r\n format,\r\n ProductPrice,\r\n ProductRefinerValue,\r\n ProjectionDomain,\r\n SortColumn,\r\n TextValueTranslation\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\n// import {\r\n// buildListPageUrl,\r\n// getCollectionProducts,\r\n// getCollectionRefinersAction,\r\n// getCurrentUrl,\r\n// GetFullProductsByCollectionInput,\r\n// parseQueryParam,\r\n// RefinersByCollectionInput,\r\n// sortOptions\r\n// } from './actions';\r\n\r\nimport getCollectionProducts, { GetFullProductsByCollectionInput } from './actions/get-full-products-by-collection';\r\nimport { sortOptions } from './actions/get-mapped-search-configuration';\r\nimport getCollectionRefinersAction, { RefinersByCollectionInput } from './actions/get-refiners-for-collection';\r\nimport { getCurrentUrl, buildListPageUrl, parseQueryParam } from './actions/url-utils';\r\n\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IDynSearchResultContainerData } from './dyn-search-result-container.data';\r\nimport { expandRefinersCount, IDynSearchResultContainerProps } from './dyn-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IDynSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container.\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n refiners: IProductRefinerHierarchy[];\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IDynSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n constructor(props: IDynSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: []\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n\r\n // Initalization of list page\r\n this.props.data.products.then(products => {\r\n this.props.data.listPageState.then(listPageState => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber,\r\n listPageState.sortingCritera &&\r\n listPageState.sortingCritera.Columns &&\r\n listPageState.sortingCritera.Columns.length\r\n ];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n\r\n this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n !!(\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes\r\n ),\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n listPageState.totalProductCount = productResults.count;\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n this._getActivePrice();\r\n }\r\n });\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera ?? {}\r\n },\r\n listPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.itemId ?? 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel\r\n );\r\n\r\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext)\r\n .then(refiners => {\r\n this.setState({ refiners });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n }\r\n );\r\n });\r\n });\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then(products => {\r\n this.props.data.listPageState.then(listPageStateFeature => {\r\n listPageStateFeature.featureProduct = products;\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n this._getActivePrice();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className } = this.props.config;\r\n const { resources } = this.props;\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0\r\n ? this._getSortingDropDown()\r\n : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct:\r\n this.props.data.listPageState.result &&\r\n this.props.data.listPageState.result.featureProduct !== null &&\r\n this.props.data.listPageState.result.featureProduct !== undefined\r\n ? featureComponent\r\n : null,\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private readonly _getActivePrice = async (): Promise => {\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n const cart = await getCartFromCustomer(this.props.context.actionContext);\r\n const affliations = cart?.AffiliationLines;\r\n\r\n await getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n affliations,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(\r\n activePrice.BasePrice || 0,\r\n activePrice.TradeAgreementPrice || 0,\r\n activePrice.AdjustedPrice || 0\r\n );\r\n }\r\n return prod;\r\n });\r\n this.props.data.listPageState.then(listPageState => {\r\n listPageState.activeProducts = products;\r\n });\r\n })\r\n .catch((error: Error) => {\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n '[get Affiliation based price on search result container ]Error executing action'\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='>' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdwonOptions = this.sortByDropdownOptions;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdwonOptions = this.sortByDropdownOptions.filter(dropdownOption => dropdownOption.key !== 'AverageRating-Desc');\r\n }\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdwonOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount =\r\n listPageState && listPageState.currentPageNumber !== null\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = (listPageState && listPageState.totalProductCount) || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n //debugger;\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n });\r\n\r\n const sortedValidRefiners = validRefiners?.map((refiner: IProductRefinerHierarchy) => {\r\n const sortedRefiner: IProductRefinerHierarchy = {\r\n ...refiner,\r\n Values: refiner.Values.filter(refiner => {\r\n return refiner.LeftValueBoundString?.toLowerCase() !== 'not specified';\r\n }).sort((a, b) => ((a.LeftValueBoundString?.toLowerCase() ?? '') > (b.LeftValueBoundString?.toLowerCase() ?? '') ? 1 : -1))\r\n };\r\n return sortedRefiner;\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus =\r\n validRefiners &&\r\n sortedValidRefiners &&\r\n sortedValidRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getProducts = (): JSX.Element => {\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={allowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewslot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find(mappedSearchConfig => {\r\n return (\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || []\r\n );\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n // Dyn : Added none\r\n case expandRefinersCount.none:\r\n this.expandrefinerCount = 0;\r\n break;\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{paginationPreviousText}</span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{paginationNextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './dyn-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage,\r\n FeatureSearchContainer,\r\n similarLookProduct\r\n } = props;\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n const img_tetiere = [\r\n 'https://images-eu-prod.cms.commerce.dynamics.com/cms/api/gxltbxxkkq/imageFileData/ME2XB?ver=478b',\r\n 'https://images-eu-prod.cms.commerce.dynamics.com/cms/api/gxltbxxkkq/imageFileData/ME2Xp?ver=46cc',\r\n 'https://images-eu-prod.cms.commerce.dynamics.com/cms/api/gxltbxxkkq/imageFileData/ME5LW?ver=e936'\r\n ];\r\n //const color_tetiere = ['orange', 'purple', 'green'];\r\n //const index = Math.floor(Math.random() * 3);\r\n const class_tetiere = 'ms-content-block tetiere product-tetiere tetiere-orange'; // + color_tetiere[0];\r\n\r\n if (isMobile) {\r\n return (\r\n <React.Fragment>\r\n {renderTetiere(categoryHierarchy, img_tetiere[0], class_tetiere)}\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n </React.Fragment>\r\n );\r\n }\r\n return (\r\n <React.Fragment>\r\n {renderTetiere(categoryHierarchy, img_tetiere[0], class_tetiere)}\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>{categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}</Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n <div className='searchResultTitle_header'>\r\n <div className='searchResultTitle_wrapper'>\r\n <Node {...TitleViewProps.TitleContainer}>\r\n <h2>\r\n {TitleViewProps && renderTitle(TitleViewProps)} {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </h2>\r\n </Node>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </div>\r\n {choiceSummary}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n </React.Fragment>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <div className='refinerSectionTitle'>Filters</div>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title } = props;\r\n if (title) {\r\n return (\r\n <React.Fragment>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </React.Fragment>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title } = props;\r\n if (title) {\r\n return (\r\n <React.Fragment>\r\n <span className='searchResultCount'>({title.titleCount})</span>\r\n </React.Fragment>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTetiere = (props: ICategoryHierarchyViewProps, img_tetiere: string, class_tetiere: string): JSX.Element | null => {\r\n const { categoryHierarchyList } = props;\r\n\r\n return categoryHierarchyList ? (\r\n <React.Fragment>\r\n <div className='default-container default-container fluid'>\r\n <div className='row'>\r\n <div className='col-12'>\r\n <div className={class_tetiere} data-m-t='content-block'>\r\n <div className='ms-content-block__image'>\r\n <picture>\r\n <img\r\n alt='Products banner'\r\n src={img_tetiere}\r\n width='1600'\r\n height='315'\r\n className='msc-main_image msc_image'\r\n />\r\n </picture>\r\n </div>\r\n <div className='banner__bg bg-orange-gradient-top'></div>\r\n <div className='ms-content-block__details'>\r\n <div className='ms-content-block__text'>\r\n <h1>{categoryHierarchyList[categoryHierarchyList.length - 1]}</h1>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </React.Fragment>\r\n ) : (\r\n <Node className='tetiere'></Node>\r\n );\r\n};\r\n\r\nexport default SearchResultContainerView;\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 {\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageProps,\r\n IImageSettings,\r\n IRequestContext,\r\n msdyn365Commerce\r\n} from '@msdyn365-commerce/core'; // Image, IImageData,\r\nimport { AttributeSwatch, AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionTypes,\r\n generateImageUrl,\r\n getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport { IPriceComponentResources, PriceComponent } from '@msdyn365-commerce/components';\r\nimport { ISwatchItem } from '@msdyn365-commerce/components';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ProductComponentSwatchComponent } from '@msdyn365-commerce/components';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources\r\n}) => {\r\n const product = data.product;\r\n\r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\r\n );\r\n if (!colorAttribute) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute.Swatches?.find(item => item.IsDefault === true) ?? colorAttribute.Swatches?.[0];\r\n return defaultSwatch ?? null;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls)\r\n ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\r\n : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n ): string | undefined {\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryString = `color=${defaultSwatch.SwatchValue}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n const [productPageUrl = productPageUrlFromSwatch, setProductPageUrl] = useState<string | undefined>();\r\n const [productImageUrl = productImageUrlFromSwatch, setProductImageUrl] = useState<string | undefined>();\r\n\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback(\r\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [context, productPageUrl]\r\n );\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>{unitOfMeasure}</span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>{inventoryAvailabilityLabel}</span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Checks if rendering the particular dimensions is allowed for product card.\r\n * @param dimensionType - Dimension to be displayed.\r\n * @returns Updates the state with new product page url.\r\n */\r\n function shouldDisplayDimension(dimensionType: string): boolean {\r\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\r\n return (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @param attributeValues - Attribute value property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n if (!attributeValues) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {attributeValues.map((item: AttributeValue) => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n if (!shouldDisplayDimension(dimensionTypeValue)) {\r\n return null;\r\n }\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches =\r\n item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault\r\n };\r\n }) ?? [];\r\n if (\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) &&\r\n dimensionType === DimensionTypes.color\r\n ) {\r\n swatches[0].isDefault = true;\r\n }\r\n return (\r\n <ProductComponentSwatchComponent\r\n key={item.RecordId}\r\n context={context}\r\n onSelectDimension={updatePageAndImageUrl}\r\n swatches={swatches}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component. */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string\r\n ): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\r\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\r\n }`;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n requestContext?: IRequestContext\r\n ): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // const image: IImageData = {\r\n // src: imageUrl,\r\n // altText: altText ? altText : '',\r\n // fallBackSrc: fallbackImageUrl\r\n // };\r\n const imageProps: IImageProps = { gridSettings };\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return <React.Fragment></React.Fragment>; //<Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} />;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param basePrice - Product base price.\r\n * @param adjustedPrice - Product adjusted price.\r\n * @param maxVariantPrice - Product variant max price.\r\n * @param minVariantPrice - Product variant min price.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price. */\r\n function renderPrice(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n maxVariantPrice?: number,\r\n minVariantPrice?: number,\r\n savingsPriceResourceText?: string,\r\n freePriceResourceText?: string,\r\n originalPriceResourceText?: string,\r\n currentPriceResourceText?: string\r\n ): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice,\r\n MaxVariantPrice: maxVariantPrice ? maxVariantPrice : adjustedPrice,\r\n MinVariantPrice: minVariantPrice ? minVariantPrice : adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n data={{ price }}\r\n savingsText={savingsPriceResourceText}\r\n freePriceText={freePriceResourceText}\r\n originalPriceText={originalPriceResourceText}\r\n currentPriceText={currentPriceResourceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n ): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n }\r\n\r\n function getErpExternalItemId(attributeValues?: AttributeValue[]): string | undefined {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute =>\r\n attribute.Name === 'External Item Id' ||\r\n attribute.Name === 'ERP_ExternalItemID' ||\r\n attribute.KeyName === 'ERPExternalItemID'\r\n );\r\n if (externalItemIdAttribute && externalItemIdAttribute.TextValue !== '') {\r\n return externalItemIdAttribute.TextValue;\r\n }\r\n return '';\r\n }\r\n\r\n function getErpSize(attributeValues?: AttributeValue[]): string | undefined {\r\n if (!attributeValues || !ArrayExtensions.hasElements(attributeValues)) {\r\n return '';\r\n }\r\n const externalItemIdAttribute = attributeValues.find(\r\n attribute => attribute.Name === 'ERP_Sizes' || attribute.KeyName === 'ERPSizes'\r\n );\r\n if (externalItemIdAttribute && externalItemIdAttribute.TextValue !== '') {\r\n return externalItemIdAttribute.TextValue;\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param Name - Product Name.\r\n * @returns The product Name external item id component.\r\n */\r\n function renderErpExternalItemId(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n const attribute = getErpExternalItemId(attributeValues);\r\n if (attribute) {\r\n return (\r\n <div className='msc-product__ErpExternalItemId'>\r\n <span>{'Ref: '}</span>\r\n {attribute}\r\n </div>\r\n );\r\n } else {\r\n return <></>;\r\n }\r\n // return (\r\n // <div className='msc-product__ErpExternalItemId'>\r\n // <span>{'Ref: '}</span>\r\n // {attribute}\r\n // </div>\r\n // );\r\n }\r\n function renderErpSize(attributeValues?: AttributeValue[]): JSX.Element | null {\r\n const attribute = getErpSize(attributeValues);\r\n if (attribute) {\r\n return (\r\n <div className='msc-product__ErpSize'>\r\n <span>{'Size: '}</span>\r\n {attribute}\r\n </div>\r\n );\r\n } else {\r\n return <></>;\r\n }\r\n // return (\r\n // <div className='msc-product__ErpSize'>\r\n // <span>{'Size: '}</span>\r\n // {attribute}\r\n // </div>\r\n // );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param Name - Product Name.\r\n * @returns The product Name external item id component.\r\n */\r\n function renderName(name?: string, attributeValues?: AttributeValue[]): JSX.Element | null {\r\n /*const attribute = getExternalItemId(attributeValues);\r\n if (attribute) {\r\n return (\r\n <p className='msc-product__name'>\r\n {name}-{getExternalItemId(attributeValues)}\r\n </p>\r\n );\r\n } else {\r\n */\r\n return <p className='msc-product__name'>{name}</p>;\r\n //}\r\n }\r\n return (\r\n <>\r\n <div className='product-component-infos-wrapper'>\r\n <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel,\r\n product.TotalRatings,\r\n ratingCountAriaLabel\r\n )}\r\n className='msc-product'\r\n {...attribute}\r\n >\r\n <div className='msc-product__image'>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n </div>\r\n <div className='msc-product__titleblock'>\r\n <h4 className='msc-product__title'>{renderName(product.Name, product.AttributeValues)}</h4>\r\n </div>\r\n </a>\r\n {renderErpExternalItemId(product.AttributeValues)}\r\n {renderErpSize(product.AttributeValues)}\r\n {renderProductDimensions(product.AttributeValues)}\r\n </div>\r\n <div className='msc-product__details'>\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n product.MaxVariantPrice,\r\n product.MinVariantPrice,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel,\r\n product.TotalRatings,\r\n ratingCountAriaLabel\r\n )}\r\n className='msc-product-add-button'\r\n {...attribute}\r\n >\r\n <div className='msc-product-add-button__title'>Product detail</div>\r\n </a>\r\n </div>\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n </>\r\n );\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;\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 { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { Button, format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPromoCodeProps extends IComponentProps<{}> {\r\n cart: ICartState | undefined;\r\n promoCodeHeadingText: string;\r\n appliedPromoCodeHeadingText: string;\r\n removePromoAriaLabelFormat: string;\r\n promoPlaceholderText: string;\r\n promoCodeApplyButtonText: string;\r\n collapseTimeOut: number;\r\n removePromoText: string;\r\n invalidPromoCodeErrorText: string;\r\n failedToAddPromoCodeErrorText: string;\r\n duplicatePromoCodeErrorText: string;\r\n failedToRemovePromoCodeErrorText: string;\r\n\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n promoCodeApplyCallback?(): void;\r\n}\r\n\r\ninterface IPromoCodeState {\r\n isCollapseOpen: boolean;\r\n promoCodeInputValue: string;\r\n error: string;\r\n canApply: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The PromoCode component renders the promocode section.\r\n * @extends {React.PureComponent<IRefineSubmenuProps>}\r\n */\r\nclass PromoCode extends React.Component<IPromoCodeProps, IPromoCodeState> {\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\r\n this.state = {\r\n isCollapseOpen: false,\r\n promoCodeInputValue: '',\r\n error: '',\r\n canApply: false\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IPromoCodeProps, nextState: IPromoCodeState): 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 public render(): JSX.Element {\r\n return (\r\n <div>\r\n <div className='msc-promo-code-heading'>\r\n {this.props.promoCodeHeadingText}\r\n </div>\r\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\r\n <p className={this.state.error ? 'msc-alert-danger' : ''}aria-live='assertive'>\r\n {this.state.error}\r\n </p>\r\n {this._renderAppliedPromoCode(this.props)}\r\n </div>\r\n );\r\n }\r\n\r\n private readonly _onInputChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const error = e.target.value === '' ? '' : this.state.error;\r\n this.setState({\r\n promoCodeInputValue: e.target.value, error,\r\n canApply: !!e.target.value\r\n });\r\n };\r\n\r\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart) {\r\n return;\r\n }\r\n const appliedPromo = this.state.promoCodeInputValue;\r\n\r\n cartState.addPromoCode({ promoCode: appliedPromo })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // Show success text\r\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\r\n } else if (result.substatus === 'ALREADYADDED') {\r\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\r\n } else {\r\n this.setState({ error: this.props.invalidPromoCodeErrorText });\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\r\n });\r\n };\r\n\r\n /**\r\n * On Submit function.\r\n * @param cartState -Cartstate.\r\n * @returns Apply promotion.\r\n */\r\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n this._applyPromotionHandler(cartState);\r\n };\r\n\r\n /**\r\n * On apply promotion function.\r\n * @param cartState -Cartstate.\r\n * @returns Apply promotion.\r\n */\r\n private readonly _applyPromotionHandler = (cartState: ICartState | undefined) => () => {\r\n this._applyPromotion(cartState);\r\n };\r\n\r\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\r\n\r\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n <form onSubmit={this._onSubmitHandler(cartState)} className='msc-promo-code__form-container'>\r\n <div className='msc-promo-code__group'>\r\n <input\r\n className='msc-promo-code__input-box'\r\n aria-label={promoPlaceholderText}\r\n onChange={this._onInputChangeHandler}\r\n value={this.state.promoCodeInputValue}\r\n placeholder={promoPlaceholderText}\r\n />\r\n <Button\r\n title={promoCodeApplyButtonText}\r\n className='msc-promo-code__apply-btn btn'\r\n onClick={this._applyPromotionHandler(cartState)}\r\n disabled={!this.state.canApply}\r\n {...attributes}\r\n >\r\n {promoCodeApplyButtonText}\r\n </Button>\r\n </div>\r\n </form>\r\n );\r\n };\r\n\r\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\r\n if (!cartState) {\r\n return;\r\n }\r\n const code = event.currentTarget.getAttribute('data-value') || '';\r\n cartState.removePromoCodes({\r\n promoCodes: [code]\r\n })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n this.setState({ error: '' });\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\r\n });\r\n\r\n };\r\n\r\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\r\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\r\n return;\r\n }\r\n let discountAmount = 0;\r\n for (const line of cartState.cart.CartLines) {\r\n if (line.DiscountLines) {\r\n for (const discountLine of line.DiscountLines) {\r\n if (discountLine.DiscountCode === code) {\r\n discountAmount += discountLine.DiscountCost!;\r\n }\r\n }\r\n }\r\n }\r\n return discountAmount * -1;\r\n };\r\n\r\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\r\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || props.cart.cart.Coupons.length === 0) {\r\n return;\r\n }\r\n\r\n const removePromotionHandler = (event: React.MouseEvent<HTMLElement>) => {\r\n this._removePromotion(props.cart, event);\r\n };\r\n\r\n const promoCodTotalDiscount = props.cart.cart.Coupons.reduce(\r\n (count: number, coupon: Coupon) => {\r\n return count + (this._calculateDiscount(coupon.Code || '', props.cart) || 0);\r\n },\r\n 0);\r\n\r\n return (\r\n <>\r\n <div className='msc-promo-code__discount'>\r\n <div className='msc-promo-code__discount-heading'>\r\n {this.props.appliedPromoCodeHeadingText}\r\n </div>\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: promoCodTotalDiscount\r\n\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-promo-code__discount-value'\r\n />\r\n </div>\r\n {\r\n props.cart.cart.Coupons.map((coupon: Coupon) => {\r\n const ariaLabel = props.removePromoAriaLabelFormat ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code) : '';\r\n\r\n return (\r\n <div key={coupon.Code} className='msc-promo-code__line-container'>\r\n <div className='msc-promo-code__line-value'>\r\n {coupon.Code}\r\n {' '}\r\n (\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\r\n\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-promo-code__line-discount-value'\r\n />\r\n )\r\n </div>\r\n <Button\r\n title={props.removePromoText}\r\n className='msc-promo-code__line__btn-remove'\r\n onClick={removePromotionHandler}\r\n data-value={coupon.Code}\r\n aria-label={ariaLabel}\r\n >\r\n {props.removePromoText}\r\n </Button>\r\n </div>\r\n );\r\n })\r\n }\r\n </>\r\n );\r\n };\r\n}\r\n\r\nexport default PromoCode;\r\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 <Node {...props.miniCartItemWrapper} key={index}>\n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\nconst CartIconView: React.FC<ICartIconViewProps> = (props: ICartIconViewProps) => (\n <Node {...props.miniCartWrapper} {...props.renderModuleAttributes(props)}>\n {props.cartIcon}\n {props.FlyoutContainer ? (\n <Node {...props.FlyoutContainer}>\n {props.flyoutTitle}\n {props.checkoutBlockedDueToUnavailableFunds}\n <Node {...props.CartlinesWrapper}>{_renderCartlines(props.cartlines, props)}</Node>\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.goToCartButton}\n </Node>\n ) : (\n false\n )}\n </Node>\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 IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\n\nimport { CheckoutState } from './checkout-state';\n\n/**\n * CheckoutState - action input.\n */\nexport class CheckoutStateInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => buildCacheKey('CheckoutState', this.apiSettings);\n\n public getCacheObjectType = () => 'CheckoutState';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\n/**\n * CheckoutState - action.\n * @param input\n * @param ctx\n */\nexport async function checkoutStateAction(input: CheckoutStateInput, ctx: IActionContext): Promise<CheckoutState> {\n return new CheckoutState();\n}\n\n/**\n * CheckoutState - create new input for create action.\n * @param inputData\n */\nconst createInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\n return new CheckoutStateInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * CheckoutState - create action.\n */\nexport const checkoutStateActionDataAction = createObservableDataAction<CheckoutState>({\n action: <IAction<CheckoutState>>checkoutStateAction,\n input: createInput\n});\n\nexport default checkoutStateActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Address, GiftCard, TenderLine, TokenizedPaymentCard } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { action, computed, observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a checkout.\n */\nexport class CheckoutState {\n @observable private _tokenizedPaymentCard: TokenizedPaymentCard | undefined;\n\n @computed public get tokenizedPaymentCard(): Readonly<TokenizedPaymentCard> | undefined {\n return this._tokenizedPaymentCard;\n }\n\n @observable private _tenderLine: TenderLine | undefined;\n\n @computed public get tenderLine(): Readonly<TenderLine> | undefined {\n return this._tenderLine;\n }\n\n @observable private _billingAddress: Address | undefined;\n\n @computed public get billingAddress(): Readonly<Address> | undefined {\n return this._billingAddress;\n }\n\n @observable private _shippingAddress: Address | undefined;\n\n @computed public get shippingAddress(): Readonly<Address> | undefined {\n return this._shippingAddress;\n }\n\n @observable private _cardPrefix: string | undefined;\n\n @computed public get cardPrefix(): Readonly<string> | undefined {\n return this._cardPrefix;\n }\n\n @observable private _giftCards: GiftCard[] = [];\n\n @computed public get giftCards(): readonly GiftCard[] {\n return this._giftCards;\n }\n\n @observable private _giftCardExtends: IGiftCardExtend[] = [];\n\n @computed public get giftCardExtends(): readonly IGiftCardExtend[] {\n return this._giftCardExtends;\n }\n\n @observable private _loyaltyCardNumber?: string;\n\n @computed public get loyaltyCardNumber(): Readonly<string> | undefined {\n return this._loyaltyCardNumber;\n }\n\n @observable private _loyaltyAmount: number = 0;\n\n @computed public get loyaltyAmount(): Readonly<number> | number {\n return this._loyaltyAmount;\n }\n\n @observable private _guestCheckoutEmail: string = '';\n\n @computed public get guestCheckoutEmail(): Readonly<string> | string {\n return this._guestCheckoutEmail;\n }\n\n @observable private _isTermsAndConditionAccepted: boolean = false;\n\n @computed public get isTermsAndConditionAccepted(): Readonly<boolean> | boolean {\n return this._isTermsAndConditionAccepted;\n }\n\n @observable private _customerAccountAmount: number = 0;\n\n @computed public get customerAccountAmount(): Readonly<number> | number {\n return this._customerAccountAmount;\n }\n\n @action\n public updateTokenizedPaymentCard(newTokenizedPaymentCard: TokenizedPaymentCard): void {\n this._tokenizedPaymentCard = newTokenizedPaymentCard;\n }\n\n @action\n public updateTenderLine(newTenderLine: TenderLine | undefined): void {\n this._tenderLine = newTenderLine;\n }\n\n @action\n public updateShippingAddress(newShippingAddress: Address): void {\n this._shippingAddress = newShippingAddress;\n }\n\n @action\n public updateBillingAddress(newBillingAddress: Address): void {\n this._billingAddress = newBillingAddress;\n }\n\n @action\n public updateCardPrefix(newCardPrefix: string): void {\n this._cardPrefix = newCardPrefix;\n }\n\n @action\n public removeGiftCard(giftCardNumber: string): void {\n this._giftCards = this._giftCards.filter(giftCard => giftCard.Id !== giftCardNumber);\n }\n\n @action\n public removeGiftCardExtend(giftCardNumber: string): void {\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== giftCardNumber);\n }\n\n @action\n public addGiftCard(giftCard: GiftCard): void {\n this._giftCards = [giftCard, ...this._giftCards];\n }\n\n @action\n public addGiftCardExtend(giftCard: IGiftCardExtend): void {\n this._giftCardExtends = [giftCard, ...this._giftCards];\n }\n\n @action\n public updateLoyaltyCardNumber(newLoyaltyCardNumber: string): void {\n this._loyaltyCardNumber = newLoyaltyCardNumber;\n }\n\n @action\n public updateLoyaltyAmount(newAmount: number): void {\n this._loyaltyAmount = newAmount;\n }\n\n @action\n public updateGuestCheckoutEmail(newGuestCheckoutEmail: string): void {\n this._guestCheckoutEmail = newGuestCheckoutEmail;\n }\n\n @action\n public updateTermsAndConditionsAcceptance(newIsTermsAndConditionAccepted: boolean): void {\n this._isTermsAndConditionAccepted = newIsTermsAndConditionAccepted;\n }\n\n @action\n public updateCustomerAccountAmount(newAmount: number): void {\n this._customerAccountAmount = newAmount;\n }\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\n/**\n * EnabledPaymentsForOBO enum.\n */\n export enum EnabledPaymentsForOBO {\n OnCustomerAccount = 1,\n ExpressPayment = 0,\n Loyalty = 0,\n GiftCard = 0,\n PaymentInstrument = 0,\n ApplePay = 0\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CacheType, IActionContext, IActionInput } from '@msdyn365-commerce/core';\n\nimport { IModuleStates } from './module-state.data';\n\n/**\n * GetModulesInput.\n */\nexport class ModuleStatesCacheKey implements IActionInput {\n public getCacheKey = () => 'ModuleState';\n\n public getCacheObjectType = () => 'ModuleState';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nexport function getModuleStates(ctx: IActionContext): IModuleStates {\n const cacheKey = new ModuleStatesCacheKey();\n\n let moduleStates = <IModuleStates>ctx.get<IModuleStates>(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n if (moduleStates) {\n return moduleStates;\n }\n ctx.update(cacheKey, {});\n moduleStates = <IModuleStates>ctx.get<IModuleStates>(cacheKey.getCacheObjectType(), cacheKey.getCacheKey());\n return moduleStates;\n}\n\nexport function updateModuleStates(value: IModuleStates, ctx: IActionContext): void {\n const cacheKey = new ModuleStatesCacheKey();\n ctx.update(cacheKey, value);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IModule } from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport isMatch from 'lodash/isMatch';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { getModuleStates, updateModuleStates } from './module-state';\nimport { IModuleState, IModuleStateManager, IModuleStateProps, IModuleStates } from './module-state.data';\n\nexport interface IProps extends IModule, IModuleStateProps {\n enableControl?: boolean;\n}\n\nconst sectionContainerModuleId = 'section-container';\nconst paymentInstrumentModuleId = 'payment-instrument';\n\nconst withModuleState = <P extends IProps>(WrappedComponent: React.ComponentType<P>): React.ComponentType<P> => {\n /**\n *\n * ModuleState component.\n * @extends {React.Component<P>}\n */\n @observer\n class ModuleState extends React.Component<P> {\n constructor(props: P) {\n super(props);\n this.initializeState();\n }\n\n public shouldComponentUpdate(nextProps: IModuleStateProps): boolean {\n if (this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { id } = this.props;\n return <WrappedComponent {...this.props} moduleState={this.getModuleStateManager(id)} />;\n }\n\n private readonly initializeState = (): void => {\n const { id, typeName, context } = this.props;\n const states = getModuleStates(context.actionContext);\n if (!states) {\n this.props.telemetry.error('withModuleState initializeState() - states not found');\n return;\n }\n\n if (states[id]) {\n // State has been initialized\n return;\n }\n\n updateModuleStates(\n {\n ...states,\n [id]: {\n id,\n typeName,\n hasInitialized: false,\n hasError: false,\n isRequired: true,\n isCancellable: true,\n isSubmitContainer: false,\n status: undefined,\n childIds: []\n }\n },\n context.actionContext\n );\n };\n\n /**\n * GetModuleStateManager\n * Get module state manager by id.\n * @param id\n */\n private readonly getModuleStateManager = (id: string): IModuleStateManager => {\n const moduleState = this.get()[id];\n return {\n ...moduleState!,\n hasInitialized: this.validate(id, { hasInitialized: true }, true), // All has initialized is initialized\n hasError: this.validate(id, { hasError: true }), // Partial has error is error\n isReady: this.validate(id, { status: 'ready' }, true, true), // All ready is ready (exclued disabled and skipped)\n isUpdating: this.validate(id, { status: 'updating' }), // Partial updating is updating\n isPending: this.validate(id, { status: 'pending' }), // Partial pending is pending\n isSkipped: this.validate(id, { status: 'skipped' }, true, true), // All skipped is skipped (exclued disabled)\n isDisabled: this.validate(id, { status: 'disabled' }, true), // All disabled is disabled\n isCancelAllowed: this.validate(id, { isCancellable: true }, true, true), // Partial not allowed is not allowed\n shouldSubmitContainer: this.validate(id, { isSubmitContainer: true }), // Partial submit is submit.\n hasExternalSubmitGroup: this.hasExternalSubmitGroup(),\n hasModuleState: this.hasModuleState(id),\n setIsRequired: (value: boolean): void => {\n this.update(id, { isRequired: value });\n },\n setIsCancellable: (value: boolean): void => {\n this.update(id, { isCancellable: value });\n },\n setIsSubmitContainer: (value: boolean): void => {\n this.update(id, { isSubmitContainer: value });\n },\n setHasError: (value: boolean): void => {\n this.update(id, { hasError: value });\n },\n onReady: (): void => {\n this.update(id, { status: 'ready' });\n },\n onUpdating: (): void => {\n this.update(id, { status: 'updating' });\n },\n onPending: (): void => {\n this.update(id, { status: 'pending' });\n },\n onSkip: (): void => {\n this.update(id, { status: 'skipped' });\n },\n onDisable: (): void => {\n this.update(id, { status: 'disabled' });\n },\n getModule: (moduleId: string): IModuleStateManager => this.getModuleStateManager(moduleId),\n getModuleByTypeName: (typeName: string): IModuleStateManager => this.getModuleStateManagerByTypeName(typeName),\n init: (options?: Partial<IModuleState>): void => {\n if (moduleState?.hasInitialized) {\n // State has been initialized\n return;\n }\n this.update(id, {\n hasInitialized: true,\n ...options\n });\n }\n };\n };\n\n /**\n * GetModuleStateManagerByTypeName\n * Get module state manager by type name.\n * @param typeName\n */\n private readonly getModuleStateManagerByTypeName = (typeName: string): IModuleStateManager => {\n const moduleStates = getModuleStates(this.props.context.actionContext);\n const moduleState = Object.values(moduleStates).find(_moduleState => _moduleState?.typeName === typeName);\n return this.getModuleStateManager((moduleState && moduleState.id) || '');\n };\n\n /**\n * Get\n * Get all module states.\n */\n private readonly get = (): IModuleStates => {\n return getModuleStates(this.props.context.actionContext);\n };\n\n /**\n * Update\n * Update module state.\n * @param id\n * @param value\n */\n private readonly update = (id: string, value: Partial<IModuleState>): void => {\n // Console.log('withModuleState - update', id, value);\n const modules = this.get();\n if (!modules[id]) {\n this.props.telemetry.error(`withModuleState update() - Module state with id ${id} is not found.`);\n return;\n }\n modules[id] = {\n ...modules[id]!,\n ...value\n };\n };\n\n private readonly _validateLeaf = (id: string, source: Partial<IModuleState>): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n return isMatch(module, source);\n };\n\n private readonly _validateContainer = (\n id: string,\n source: Partial<IModuleState>,\n allMatched?: boolean,\n skipSkippableItem?: boolean\n ): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n // Module doesn't has module state\n return !!allMatched;\n }\n\n if (skipSkippableItem && (module.status === 'disabled' || module.status === 'skipped')) {\n // Skip disabled or skipped modules\n return !!allMatched;\n }\n\n // It is leaf module\n if (!module.childIds || module.childIds.length === 0) {\n return this._validateLeaf(id, source);\n }\n\n let childIds = module.childIds;\n\n if (this.props.context.app.config.shouldEnableSinglePaymentAuthorizationCheckout) {\n // For new checkout flow, we bypass the isReady check for payment section container to enable the place order button.\n childIds = childIds.filter(childId => !this._isPaymentSectionContainer(childId));\n }\n\n // It is container module\n const method = allMatched ? 'every' : 'some';\n return childIds[method](childId => this._validateContainer(childId, source, allMatched, skipSkippableItem));\n };\n\n /**\n * Check if it is a section container with payment module.\n * @param moduleId -- The id of the module.\n * @returns If it is a section container with payment module.\n */\n private readonly _isPaymentSectionContainer = (moduleId: string): boolean => {\n if (!moduleId.includes(sectionContainerModuleId)) {\n return false;\n }\n\n const modules = this.get();\n const module = modules[moduleId];\n\n if (module && ArrayExtensions.hasElements(module.childIds.filter(childId => childId.includes(paymentInstrumentModuleId)))) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Validate\n * Validate current module and all its child module match the provided condition.\n * @param id\n * @param source\n * @param allMatched\n * @param skipSkippableItem\n */\n private readonly validate = (\n id: string,\n source: Partial<IModuleState>,\n allMatched?: boolean,\n skipSkippableItem?: boolean\n ): boolean => {\n const modules = this.get();\n const module = modules[id];\n if (!module) {\n return false;\n }\n\n // It is leaf module\n if (!module.childIds || module.childIds.length === 0) {\n return this._validateLeaf(id, source);\n }\n\n // It is container module\n return this._validateContainer(id, source, allMatched, skipSkippableItem);\n };\n\n /**\n * HasExternalSubmitGroup\n * Module will use external submit group.\n */\n private readonly hasExternalSubmitGroup = (): boolean => {\n return !!this.props.enableControl;\n };\n\n /**\n * HasModuleState\n * Module is using module state manager.\n * @param id\n */\n private readonly hasModuleState = (id: string): boolean => {\n const modules = this.get();\n const module = modules[id];\n return !!module;\n };\n }\n\n return ModuleState;\n};\n\nexport default withModuleState;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions, getFallbackImageUrl, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n /**\n * Display string for discount label\n */\n discountStringText: string;\n\n /**\n * String for size key\n */\n sizeString: string;\n\n /**\n * String for color key\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension\n */\n configString: string;\n\n /**\n * String for style key\n */\n styleString: string;\n\n /**\n * String for amount key\n */\n amountString?: string;\n\n /**\n * Display string for quantity label\n */\n quantityDisplayString: string;\n\n /**\n * Display string for quantity label\n */\n inputQuantityAriaLabel: string;\n\n /**\n * Aria label for the decrement button in quantity component\n */\n decrementButtonAriaLabel: string;\n\n /**\n * Aria label for the increment button in quantity component\n */\n incrementButtonAriaLabel: string;\n\n /**\n * Original text screenreader\n */\n originalPriceText: string;\n\n /**\n * Current text screenreader\n */\n currentPriceText: string;\n\n /**\n * Shipping Charges Text\n */\n shippingChargesText: string;\n\n priceEditorResources?: ICartLinePriceEditorResources;\n salesAgreementPricePrompt?: string;\n}\n\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\n /**\n * The flag to change the quantity component from intractable to static.\n */\n disableQuantityInteractivity?: boolean;\n\n /**\n * The primary image url.\n */\n primaryImageUrl?: string;\n\n /**\n * The product url.\n */\n productUrl?: 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\n /**\n * Boolean flag to indicate if the item is out of stock.\n */\n isOutOfStock?: boolean;\n\n /**\n * Flag to make quantity section editable.\n */\n isQuantityEditable?: boolean;\n\n /**\n * Max quantity for line item.\n */\n maxQuantity?: number;\n\n /**\n * Current quantity for line item.\n */\n currentQuantity?: number;\n\n /**\n * Resource string for the component.\n */\n resources: ICartlineResourceString;\n\n /**\n * SalesLine flag.\n */\n isSalesLine?: boolean;\n\n /**\n * Error message to show in place of quantity.\n */\n errorMessage?: string;\n\n /**\n * Inventory information label.\n */\n inventoryInformationLabel?: string;\n\n /**\n * Inventory information class name.\n */\n inventoryLabelClassName?: string;\n\n /**\n * Flag to show/hide shipping charges for line items.\n */\n showShippingChargesForLineItems?: boolean;\n\n /**\n * Boolean flag to indicate if cart state status is ready.\n */\n isCartStateReady?: boolean;\n\n /**\n * Chanel Delivery Option configuration is from api.\n */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n /**\n * The telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n /**\n * The cart line index.\n */\n lineIndex?: number;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): boolean;\n priceCurrency?: string;\n}\n\ninterface IDimensionStrings {\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n validateCatalogId(catalogId);\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return <div className='msc-cart-line__catalog-label'>{catalog.Name}</div>;\n};\n\nconst CartLineItemFunctions = {\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n if (!Product || !Product.Dimensions) {\n return [];\n }\n\n return Product.Dimensions.map(productDimension => {\n if (productDimension.DimensionTypeValue === 1) {\n return (\n <div key={`${Product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-color'>\n {DimensionStrings.colorString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n <div key={`${Product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-configuration'>\n {DimensionStrings.configString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n <div key={`${Product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-size'>\n {DimensionStrings.sizeString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n <div key={`${Product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-style'>\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n return null;\n });\n },\n\n renderDiscountLines: (props: ICartLineProps) => {\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n return null;\n }\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n <div key={discountLine.OfferId || index} className='msc-cart-line-item-product-discount'>\n <span>\n {discountLine.OfferName ? discountLine.OfferName : ''}:{` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <span className='cart-line-item-product-discount-price'>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: discountLine.EffectiveAmount,\n BasePrice: discountLine.EffectiveAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n currencyCode={props.priceCurrency}\n />\n </span>\n <span>{` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}</span>\n </div>\n );\n });\n },\n renderInventoryLabel: (props: ICartLineProps) => {\n if (!props.inventoryInformationLabel) {\n return null;\n }\n const inventoryCssName = props.inventoryLabelClassName\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\n : 'msc-cart-line__product-inventory-label';\n return <span className={inventoryCssName}>{props.inventoryInformationLabel}</span>;\n },\n\n /**\n * Gets the react node for product unit of measure display.\n * @param props - Icartline props.\n * @returns The node representing markup for unit of measure component.\n */\n renderUnitOfMeasure: (props: ICartLineProps) => {\n if (props.data.cartLine.IsInvoiceLine) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\n return undefined;\n }\n\n const product = props.data.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-cartline__product-unit-of-measure'>\n <span>{product.DefaultUnitOfMeasure}</span>\n </div>\n );\n },\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if (channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!(\n cartline.DeliveryMode &&\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\n );\n } else {\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n if (shippingChargeLines.length === 0) {\n return undefined;\n }\n\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\n }, 0);\n\n const priceComponent = (\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: freightFee\n }\n }}\n freePriceText='Free'\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__freight-actual'\n currencyCode={props.priceCurrency}\n />\n );\n return (\n <>\n <label className='msc-cart-line__freight-label'>{`${props.resources.shippingChargesText}:`}</label>\n <span className='shipping-value'>{priceComponent}</span>\n </>\n );\n },\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\n\n return (\n (otherCharges &&\n otherCharges.map((otherCharge, key) => {\n return otherCharge && otherCharge.CalculatedAmount ? (\n <div className='msc-cart-line__other-charges' key={key}>\n <label className='msc-cart-line__other-charges-label'>{`${otherCharge.Description}:`}</label>\n <span className='other-charge-value'>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: otherCharge.CalculatedAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__other-charges-actual'\n currencyCode={props.priceCurrency}\n />\n </span>\n </div>\n ) : (\n ''\n );\n })) ||\n undefined\n );\n },\n\n /**\n * Render the sales agreement prompt.\n * @param props - The ICartLineProps.\n * @returns The JSX.Element.\n */\n renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\n return null;\n }\n return <div className='msc-cart-line__sales-agreement-prompt'>{props.resources.salesAgreementPricePrompt}</div>;\n }\n};\n\n// eslint-disable-next-line no-redeclare\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl =\n product &&\n getFallbackImageUrl(\n product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const imageSettings = props.imageSettings;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n const renderSalesAgreementPrompt = CartLineItemFunctions.renderSalesAgreementPrompt(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name || cartLine.Description;\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue, props.lineIndex);\n }\n return true;\n };\n\n const _generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n <div className='msc-cart-line__error-message msc-alert__header'>\n <span className='msi-exclamation-triangle' />\n <span>{props.errorMessage}</span>\n </div>\n );\n }\n\n return null;\n };\n\n const _generateQuantityandPrice = (): JSX.Element[] | null => {\n const nodes = [];\n if (props.isOutOfStock) {\n return null;\n }\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.data.product && props.isQuantityEditable) {\n nodes.push(\n <div className='msc-cart-line__product-quantity'>\n <div className='msc-cart-line__product-quantity-label'>{resources.quantityDisplayString}</div>\n <IncrementalQuantity\n id={`msc-cart-line__quantity_${props.data.product.RecordId}-${props.data.cartLine.DeliveryMode}-${props.data.cartLine.LineId}`}\n max={props.maxQuantity || 10}\n currentCount={props.currentQuantity}\n onChange={onChange}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n key={props.data.cartLine.LineId}\n disabled={!props.isCartStateReady}\n isGiftCard={props.data.product.IsGiftCard}\n telemetryContent={props.telemetryContent}\n />\n </div>\n );\n } else {\n nodes.push(\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === 1 })}>\n <label className='quantity-label'>{resources.quantityDisplayString}:</label>\n <span className='quantity-value'>{props.data.cartLine.Quantity}</span>\n </div>\n );\n }\n }\n\n nodes.push(\n <div className='msc-cart-line__product-savings'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-actual'\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n currencyCode={props.priceCurrency}\n />\n {(props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && (\n <>\n <span className='msc-cart-line__product-savings-label'>\n {` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.DiscountAmount,\n BasePrice: props.data.cartLine.DiscountAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-text'\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n currencyCode={props.priceCurrency}\n />\n </>\n )) ||\n null}\n </div>\n );\n\n return nodes;\n };\n\n return (\n <>\n <div className='msc-cart-line'>\n <div className={imgeClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n src={props.primaryImageUrl ?? 'empty'}\n fallBackSrc={fallbackImageUrl}\n altText={productName}\n gridSettings={props.gridSettings}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n <div className='msc-cart-line__content'>\n <div className='msc-cart-line__product'>\n <CatalogLabelComponent {...props} />\n {MsDyn365.isBrowser ? (\n <a className='msc-cart-line__product-title' {...productAttribute} href={productUrl} key={productUrl}>\n {productName}\n </a>\n ) : null}\n {ArrayExtensions.hasElements(productDimensions) ? (\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\n ) : (\n ''\n )}\n {renderUnitOfMeasure}\n <div className='msc-cart-line__product-price'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='discount-value'\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n currencyCode={props.priceCurrency}\n />\n </div>\n {renderDisountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>{renderShippingLabel}</div>}\n {renderOtherCharges}\n {renderSalesAgreementPrompt}\n </div>\n {_generateQuantityandPrice()}\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n <CartLinePriceEditor\n className='msc-cart-line__price-editor-container'\n context={props.context}\n resources={props.resources.priceEditorResources}\n cartState={props.data.cartState}\n cartLine={props.data.cartLine}\n />\n )}\n </div>\n </div>\n {_generateErrorMessage()}\n </>\n );\n};\n\nexport default CartLine;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n}\n\nexport const PromoBannerCloseButton: React.FC<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose} {...attributes}>\n <span className='ms-promo-banner__close-button__label' aria-hidden>\n {label}\n </span>\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n <span className='ms-promo-banner__links'>\n {editableLinks && editableLinks.length > 0 ? (\n <Msdyn365.Links links={editableLinks} editProps={{ onTextChange, requestContext }} />\n ) : null}\n </span>\n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n return <Msdyn365.Text className='ms-promo-banner__text' tag='span' text={text} editProps={{ onEdit: onTextChange, requestContext }} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText, bannerAriaLabel } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: {\n className: classnames('ms-promo-banner', className),\n moduleProps: this.props,\n role: 'banner',\n 'aria-label': bannerAriaLabel\n },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && (\n <PromoBannerCloseButton\n {...{\n onClose: this._onDismiss,\n label: closeButtonLabel,\n closeButtonAriaLabel,\n telemetryContent: this.telemetryContent\n }}\n />\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem()\n ? this.props.config.bannerMessages\n ? this.props.config.bannerMessages.length - 1\n : 0\n : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () =>\n this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides =\n bannerMessages &&\n bannerMessages.map((message, index) => {\n return (\n <Node {...contentProps} key={index} aria-live='off' role='marquee'>\n <span className='sr-only'>{promoBannerText}</span>\n {message.text && <Node {...promoBannerTextProps} text={message.text} onClick={handleText} />}\n {message.links && message.links.length > 0 && (\n <Node {...promoBannerLinksProps} links={message.links} onClick={handleLinks} />\n )}\n </Node>\n );\n });\n\n return (\n <Module {...promoBannerProps}>\n <Node {...carouselProps} items={slides} />\n {closeButton}\n </Module>\n );\n};\nexport default PromoBannerView;\n"],"names":["message","React","className","role","getInvoicePaymentSummary","input","data","checkout","resources","totalAmountLabel","invoiceLabel","invoiceSummaryTitle","context","typeName","id","telemetry","checkoutCart","get","cart","heading","lines","hasInvoiceLine","InvoiceSummary","orderTotalLabel","checkoutState","result","undefined","getLineItems","productsWithAttributes","telemetryContent","pickupDeliveryModeCode","emailDeliveryModeCode","channelDeliveryOptionConfig","featureState","retailMultiplePickUpOptionEnabled","find","feature","Name","IsEnabled","_getDeliveryLocation","cartLine","orgUnitLocations","FulfillmentStoreId","locationMatch","location","OrgUnitNumber","OrgUnitName","_getLineItemComponent","product","ProductId","productId","_product","RecordId","productAttributes","productWithAttributes","productDetails","productSpecificationData","_getProductWithAttributes","config","imageSettings","showShippingChargesForLineItems","quantityDisplayString","productDimensionTypeColor","productDimensionTypeSize","productDimensionTypeStyle","productDimensionTypeAmount","configString","inputQuantityAriaLabel","discountStringText","shippingCharges","request","gridSettings","TebuCartLineItemComponent","sizeString","colorString","styleString","amountString","originalPriceText","currentPriceText","shippingChargesText","isQuantityEditable","productUrl","getProductUrlSync","actionContext","primaryImageUrl","PrimaryImageUrl","_getPickUpAtStoreComponents","pickupDeliveryLocation","pickUpAtStoreWithLocationText","PickUpAtStore","label","_getEmailDeliveryComponents","emailDeliveryText","EmailDelivery","_getLineItemsComponents","items","map","isPickUp","_getCartPickDeliveryMode","isEmailDelivery","DeliveryMode","LineId","LineItem","item","pickUpAtStore","emailDelivery","cartLineItem","StringExtensions","PickupDeliveryModeCodes","deliveryMode","_countItems","reduce","count","Quantity","_filterItemsByDiliveryType","type","CartLines","filter","_getLineItemsByDeliveryType","length","title","itemLabel","itemsLabel","inStorePickUpLabel","shippingCountCheckoutLineItem","emailDeliveryModeDesc","deliveryOptions","productDeliveryOptions","DeliveryOptions","deliveryOption","Code","Description","suffix","replace","toString","_getGroupTitleComponent","LineItemDeliveryGroup","classnames","LineItemList","lineItems","handleLineItemHeadingChange","event","lineItemsHeading","text","target","value","_getLineItemsByDeliveryTypeWithMulitplePickupMode","multiplePickUpLabel","shippingLable","getGroupByStorePickup","groupBy","groupDelivery","cartLinesGroup","cartLinesGrp","Object","entries","forEach","groupByDeliveryType","push","keys","key","cartLines","index","_filterItemsByMultiplePickupMode","lineItemDeliveryGroup","fulFillmentStoreId","pickupDeliveryModeDesc","_getGroupTitleComponentWithMultiplePickUp","groupTitle","iconClass","lineItemWraperIcon","lineItemWraper","products","editCartText","payLoad","getPayloadObject","TelemetryConstant","attribute","getTelemetryAttributes","groupClass","LineItems","Header","Msdyn365","tag","editProps","onEdit","requestContext","editLink","Button","color","href","itemsForPickup","itemsForShip","itemsForEmail","itemsGroupWithMulitplePickupMode","_getLineItems","getOrderSummary","orderSummaryHeading","subTotalLabel","shippingLabel","taxLabel","loyaltyLabel","giftcardLabel","totalDiscountsLabel","freeText","toBeCalculatedText","otherCharges","showLineItems","channelConfiguration","channel","orderSummaryProps","OrderSummary","otherChargeLabel","CheckoutGuidedCard","constructor","props","super","editButtonRef","formCardRef","renderFooder","isVisted","isReady","isSubmitting","isCancelAllowed","hasControlGroup","onCancel","onSubmit","resource","this","saveBtnLabel","cancelBtnLabel","saveAndContinueBtnLabel","canSubmit","canCancel","contentAction","etext","saveBtnAttributes","cancelBtnAttributes","classname","disabled","onClick","focusOnFirstFocusableElement","console","log","focusOnEditButton","editButton","current","focus","scrollToTitle","formCard","isMobile","scrollIntoView","getTitle","step","headingTag","Tag","componentDidUpdate","prevProps","isActive","onNext","render","isExpanded","children","isPending","isUpdating","hasInitialized","changeBtnLabel","changeBtnAttributes","canEdit","active","expanded","closed","visted","hidden","initialized","ready","pending","updating","ref","innerRef","CheckoutGuidedForm","state","currentStep","getEnabledModules","moduleState","childIds","getModule","childId","isDisabled","getStep","indexOf","getId","getHeading","isEditor","setState","componentDidMount","init","hasModuleState","GuidedCard","disableGuidedCheckoutFlow","enableControl","observer","buttonsStates","onPlaceOrderHandler","isBusy","canPlaceOrder","placeOrder","async","buttonSetState","checkoutBtnText","isPlaceOrderLoading","setIsBusy","useState","payload","TelemetryEvent","attributes","roundNumber","Number","toFixed","ctx","cartState","lineItemIdsToRemove","getCartState","getCheckoutState","error","Error","activeCart","activeCartLine","checkoutCartLine","removeCartLines","cartLineIds","removeAllPromoCodes","removeCheckoutCartId","getCheckout","hookUrl","Promise","resolve","reject","protocol","window","sessionStorage","getItem","token","buyerCookie","ropcCheckoutUrl","azureFunctionUrl","accountNum","ropcCheckoutRequestBody","cartData","cartLinesWithAttributes","itemWithAttributes","DynName","DynDescription","DynCurrency","DynExternalID","DynTebuErpSizes","DynSupplierName","DynCustomField1","DynCustomField2","DynCustomField3","DynCustomField4","DynCustomField5","DynFirstTebuDimension","DynDimensionTypeValue","DynDimensionId","DynDimensionValue","currentProduct","externalItemId","KeyName","TextValue","erpSize","supplierName","casNumber","Currency","dimensions","Dimensions","dimensionValue","DimensionValue","DimensionTypeValue","DimensionId","Value","cartWithAttributes","cartlinesWithAttributes","fromCredentialDomain","fromCredentialIdentity","toCredentialDomain","toCredentialIdentity","punchoutCurrency","JSON","stringify","constructCheckoutBody","ropcCheckoutRequest","fetch","method","headers","Authorization","accept","body","status","reader","getReader","decoder","TextDecoder","responseEncodedBody","done","chunkDone","read","decode","urlEncodedResponseEncodedBody","encodeURIComponent","assign","sitePath","orderedProducts","requestResponse","updatedCartVersion","catch","amountDue","AmountDue","customerAccountAmount","chargedAmount","Math","min","emptyActiveCart","Checkout","errorMessage","isValidationPassed","getTelemetryObject","telemetryPageName","friendlyName","_getProductAttribute","actionInput","AttributesForSelectedVariantInput","apiSettings","channelId","getAttributesForSelectedVariant","ProductsWithAttributes","handleCheckoutHeadingChange","checkoutHeading","isLoading","cartStatus","isEmptyCart","getSlotItems","slots","onPlaceOrder","checkoutOutOfStockErrorMessage","genericErrorMessage","invalidCartVersionErrorMessage","app","enableStockCheck","isOverMaxQuantity","then","name","shouldEnableSinglePaymentAuthorizationCheckout","AdditionalContext","exception","EmailDeliveryModeCode","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","productInventoryInformation","cartline","cartlineProduct","ItemTypeValue","ReleasedProductType","ArrayExtensions","foundProductAvailability","productInventory","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","getActiveChildModuleStates","onContainerReady","redirectToCartPage","notFoundEditCartLinkMessage","editCartLink","validateForCheckout","retry","isPunchOutParameters","Id","Version","isOrderQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","customerInformation","isOrderQuantityLimitsFeatureEnabledInSiteSettings","IsB2b","validateForCheckoutAsync","callerContext","bypassCache","ValidationFailuresByCartLines","warning","debug","refreshCart","refreshError","isEditorialMode","isEmpty","params","isTermsAndConditionAccepted","i","when","hasError","isCartReady","reaction","isPaymentSectionContainerReady","redirectAdditionalContext","requestFormData","query","pv","updateIsPlaceOrderEnabledInRedirection","newIsPlaceOrderEnabledInRedirection","backToShopping","placeOrderText","confirmPaymentText","cookieConsentRequiredMessage","checkoutClass","checkoutInformation","isConsentGiven","cookies","device","Type","backToShoppingUrl","termsAndConditions","backToShoppingAttributes","viewProps","hasSalesOrder","salesOrder","orderConfirmation","checkoutProps","moduleProps","headerProps","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","termsAndConditionsProps","renderMsdyn365Text","loading","Waiting","alert","AlertComponent","canShow","guidedForm","GuidedFormComponent","orderSummary","invoicePaymentSummary","placeOrderButton","PlaceOrderButtonComponent","keepShoppingButton","renderView","retValue","isPunchout","__decorate","computed","withModuleState","PickUpAtStoreComponent","Node","EmailDeliveryComponent","LineItemComponent","LineItemGroupComponent","lineItem","LineItemGroupComponentWithMultiplePickUp","LineItemComponentWithMultiplePickUp","PickUpAtStoreComponentWithMultiplePickUp","LineItemsComponent","OrderSummaryComponent","subtotal","shipping","otherCharge","tax","totalDiscounts","loyalty","giftCard","orderTotal","PaymentSummaryComponent","invoices","Module","MsDyn365","fullUrl","URL","searchParams","set","CatalogId","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","DynOrderSummary","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","node","child","querySelector","hasShippingAddress","hasCartDeliveryMode","hasGuestCheckoutEmail","currentId","includes","shouldCollapseAfterRedirect","isPaymentVerificationRedirection","hasMissingInfo","hasOrderError","isExpressCheckoutApplied","OPERATIONS","getCardTypeId","cardPrefix","response","resolveCardTypesAsync","CardType","TypeId","findTenderIdTypeByOperationId","tenderTypes","operationId","matchedTenderType","tenderType","OperationId","TenderTypeId","giftCardExtends","tokenizedPaymentCard","guestCheckoutEmail","billingAddress","loyaltyAmount","cardPaymentAcceptResult","isExpressAddressApplied","cartTenderLines","getTenderLinePromises","loyaltyCardNumber","LoyaltyCardId","loyaltyTenderLinePromise","Amount","getTenderTypesAsync","queryResultSettings","getLoyaltyTenderLine","some","giftCardExtend","Balance","tenderTypeId","giftCardPin","Pin","giftCardExpirationYear","ExpirationDate","parseInt","split","giftCardExpirationMonth","creditCardTenderLinePromise","GiftCardId","GiftCardPin","GiftCardExpirationYear","GiftCardExpirationMonth","getGiftCardTenderLine","customerAccountTenderLinePromise","CustomerId","user","isAuthenticated","createCustomerAccountTenderLine","amount","currency","CardPaymentAcceptResult","getCreditCardTenderLineForSinglePaymentAuth","cartTypeId","CardTypeId","TenderType","cardTenderLine","TokenizedPaymentCard","House","CardTokenInfo","Phone","Country","ThreeLetterISORegionName","Address1","Street","City","State","Zip","ZipCode","getCreditCardTenderLine","all","cartVersion","checkoutAsync","updateShouldCollapsePaymentSection","newShouldCollapsePaymentSection","updateRedirectAdditionalContext","newRedirectAdditionalContext","updateRedirectPaymentConnectorId","newRedirectPaymentConnectorId","Settings","PaymentConnectorId","updateIsCheckoutCallFailed","newIsCheckoutCallFailed","updateIsExpressCheckoutApplied","newIsExpressCheckoutApplied","triggerPaymentWithPlaceOrder","updateShouldTriggerPaymentWithPlaceOrder","newShouldTriggerPaymentWithPlaceOrder","shouldTriggerPaymentWithPlaceOrder","missingRequiredCartTenderLinesErrorMessage","hasOrderConfirmation","updateCartLineEmailAddress","redirect","orderConfirmationUrl","getUrlSync","separator","url","updateSalesOrder","newSalesOrder","newOrderedProducts","updateIsPaymentSectionContainerReady","newIsPaymentSectionContainerReady","emailDeliveryCartLines","lineDeliverySpecifications","line","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","DeliveryPreferenceType","ElectronicDeliveryEmailAddress","newGuestCheckoutEmail","updateLineDeliverySpecificationsAsync","updatedCart","productsThatShouldValidateInventory","isStockedItem","Behavior","IsStockedProduct","cartLinesInventoryValidation","validateCartLinesInventory","isValid","_renderCustomerAccount","customerAccountTitle","AccountNumber","_renderWebQuotationNotice","webQuotationNotice","_renderWebQuotationReference","hasLoadedProducts","isPaymentVerificationRequired","isPaymentSectionContainerHasError","hasExpressPaymentContainer","document","getElementsByClassName","style","display","hasBillingAddress","webQuotationReferences","netTotal","print","layout","HeadingTag","ProductCollection","handleHeadingChange","_getProductsDimensionsAvailabilities","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","DimensionTypes","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","initProductState","productCollectionProducts","productCollection","_getProduct","isList","trace","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","quickviewSlot","quickview","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","TotalRatings","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","isPriceMinMaxEnabled","priceResources","priceRangeSeparator","ProductContainer","productComponent","TebuProductComponent","freePriceText","priceFree","ratingAriaLabel","quickViewButton","inventoryLabel","hidePrice","checkHidePrice","ProductComponent","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","_getActivePrice","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","recommendation","headingLabel","seeAllLink","getCatalogId","seeAllButtonText","productPrices","enableAffiliationBasedPricing","shouldDisplaySeeAllButton","recommendationListId","list","isCarousel","carousel","headingComponent","updatedProducts","getProductData","ObjectExtensions","productCollectionViewProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperPrevious","flipperNextLabel","flipperNext","parentId","ProductCollectionContainer","GridComponentProps","ListComponentProps","seeAllButton","AttributeValues","erpMarketStatusAttribute","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","_renderList","listContainer","ChoiceSummary","closeButtonGlyph","_onClick","e","preventDefault","stopPropagation","currentTarget","clearAll","getAttribute","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","_getKeyForRefinerValue","clearAllText","classNames","choiceAriaLabel","selectedRefinersMap","clearAllAttributes","listItemProps","urlBuilder","productRefinerValue","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","Values","isMatchingRefinementCriterion","isRangeType","DataTypeValue","_formatPrice","LeftValueBoundString","UnitText","RightValueBoundString","LeftValueBoundLocalizedString","cultureFormatter","formatCurrency","selected","textContent","trim","ErrorMessage","FeatureSearchResultItem","productName","productRecordId","getProductPageUrlSync","getFallbackImageUrl","ItemId","featureSimilarDescriptionTitle","featureSimilarLooksTitle","onTelemetryClick","imageUrl","altText","fallbackImage","renderProductPlacementImage","Link","ariaLabel","ModalToggle","SearchResultModal","modal","modalNode","modalHeader","modalHeaderNode","modalFooter","modalFooterNode","modalBody","ModalBody","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","ModalHeader","modalTitle","ModalFooter","modalCloseButtonText","getInventoryLabel","channelInventoryConfigurationId","inventoryAttribute","ProductSearchResultItems","moduleType","moduleId","Separator","Title","showStrikethroughPricing","originalPrice","getOriginalPrice","price","CustomerContextualPrice","max","BasePrice","TradeAgreementPrice","AdjustedPrice","shouldUseFreePriceText","enableMarketingForm","productEnquiryLink","itemProp","renderCurrentPrice","initialPrice","maxVariantPrice","MaxVariantPrice","minVariantPrice","MinVariantPrice","renderCurrentPriceWithOriginalPrice","savingsText","TebuPriceModel3Component","msdyn365Commerce","component","updateProductUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","baseUrl","search","pathname","getDefaultColorSwatchSelected","productData","colorAttribute","attributeValue","toLocaleLowerCase","defaultSwatch","Swatches","IsDefault","productImageUrlFromSwatch","ProductImageUrls","generateImageUrl","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","updatePageAndImageUrl","swatchItem","dimensionType","productPageUrlWithSwatch","newUrl","delete","swatchProductImageUrl","productImageUrls","newImageUrl","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","getRatingAriaLabel","rating","ratingAriaLabelText","roundedRating","format","getReviewAriaLabel","reviewCount","ratingCountAriaLabelText","renderLabel","reviewCountArialableText","appendResource","rel","hrefOrSrc","srcOrHref","isResourceAlreadyAdded","element","createElement","head","appendChild","src","getScriptBySrc","recordId","catalogNumberFormatted","isJQueryLoaded","jQuery","scriptJQueryExisting","scriptJQueryNew","loadAfterJQuery","inlineScript","innerHTML","appendOtherScripts","script2","addEventListener","inlineBioz","createInlineBiozScript","contains","removeChild","cleanupResources","Boolean","catalogNumber","Price","AverageRating","productCardimageSettings","fallbackImageUrl","imageProps","cropFocalRegion","attributeValues","externalItemIdAttribute","getErpExternalItemId","renderErpExternalItemId","getErpSize","renderErpSize","dimensionTypeValue","shouldDisplayDimension","swatches","itemId","colorHexCode","SwatchColorHexCode","SwatchImageUrl","isDefault","swatch","ProductComponentSwatchComponent","onSelectDimension","moduleTypeName","basePrice","adjustedPrice","savingsPriceResourceText","freePriceResourceText","originalPriceResourceText","currentPriceResourceText","renderPrice","unitOfMeasure","DefaultUnitOfMeasure","description","hideRating","avgRating","totalRatings","numberRatings","RatingComponent","ratingCount","readOnly","renderRating","inventoryAvailabilityLabel","selectedProductId","renderQuickView","RangeRefineItem","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","parentProductRefinerHierarchy","RefinerRecordId","minValue","maxValue","labels","sliderKeyString","sliderThumbs","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","isSelecting","rangeStart","rangeEnd","selectedMaxValue","maxTouched","minNum","setTimeout","touched","validationError","validationErrorRange","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","getElementById","tooltip","RefineItem","anchorType","attrs","isSingleSelect","RefinerTypeValue","RefinerType","itemTypeClassName","SourceValue","ProductRefinerSource","_renderRating","_getRefinerUrl","tabIndex","_renderSwatch","Count","hasColor","hasImage","swatchItems","checkIfShouldDisplayAsSwatch","SwatchComponent","isSelectionEnabled","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","hideCount","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","productRefinerHierarchy","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","findMatchingRefinementCriterion","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","itemToggleNotification","onUpdateRefiners","prevState","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","dataTypeValue","AttributeDataType","refinementCriteria","refinementCriterion","RefinerSourceValue","getUpdatedRefinementCriteria","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","next","matchingIndex","findIndex","criterion","splice","expandRefinersCount","SearchResultContainer","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","expandrefinerCount","defaultPageNumber","listPageState","activeProducts","productRecIds","prod","projectDomain","ChannelId","catalogId","getCartFromCustomer","affliations","AffiliationLines","getActivePricesAsync","Date","activePricesResponse","activePrice","_getSearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","q","category","SearchResultContainer_1","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","totalProductCount","numberOfProducts","oneProduct","TitleContainer","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdwonOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","nextText","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","refiner","sortedValidRefiners","sort","a","b","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","quickviewslot","isPriceMinMaxFeatureState","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","option","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","none","one","two","three","four","paginationPreviousText","paginationNextText","_viewport","_updateViewport","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","hydrateRefinersFromUrl","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","Recommendation","includeAttributes","getCollectionProducts","productResults","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","Text","componentWillUnmount","removeEventListener","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","FeatureSearchContainer","similarLookProduct","_getViewport","innerWidth","xs","w","sm","md","lg","observable","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","renderTetiere","img_tetiere","class_tetiere","alt","width","height","PriceComponent","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","promoCode","substatus","duplicatePromoCodeErrorText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","_onSubmitHandler","_applyPromotionHandler","_renderForm","promoPlaceholderText","promoCodeApplyButtonText","_removePromotion","code","removePromoCodes","promoCodes","failedToRemovePromoCodeErrorText","_calculateDiscount","discountAmount","DiscountLines","discountLine","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","removePromotionHandler","promoCodTotalDiscount","coupon","appliedPromoCodeHeadingText","removePromoAriaLabelFormat","removePromoText","isCollapseOpen","promoCodeHeadingText","miniCartWrapper","renderModuleAttributes","cartIcon","FlyoutContainer","flyoutTitle","checkoutBlockedDueToUnavailableFunds","CartlinesWrapper","miniCartItemWrapper","storeLocation","remove","_renderCartlines","cartlines","totalPrice","checkoutAsSignInUserButton","checkoutAsGuestButton","goToCartButton","getCacheKey","buildCacheKey","_this","getCacheObjectType","dataCacheType","createObservableDataAction","action","CheckoutState","inputData","CheckoutStateInput","_giftCards","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_isTermsAndConditionAccepted","_customerAccountAmount","_tokenizedPaymentCard","_tenderLine","_billingAddress","_shippingAddress","_cardPrefix","_loyaltyCardNumber","newTokenizedPaymentCard","newTenderLine","newShippingAddress","newBillingAddress","newCardPrefix","giftCardNumber","__spreadArrays","newLoyaltyCardNumber","newAmount","newIsTermsAndConditionAccepted","EnabledPaymentsForOBO","getModuleStates","cacheKey","ModuleStatesCacheKey","moduleStates","update","updateModuleStates","WrappedComponent","_super","states","_a","isRequired","isCancellable","isSubmitContainer","validate","isSkipped","shouldSubmitContainer","hasExternalSubmitGroup","setIsRequired","setIsCancellable","setIsSubmitContainer","setHasError","onReady","onUpdating","onPending","onSkip","onDisable","getModuleStateManager","getModuleByTypeName","getModuleStateManagerByTypeName","options","__assign","values","_moduleState","modules","source","module","isMatch","allMatched","skipSkippableItem","_validateLeaf","_isPaymentSectionContainer","_validateContainer","initializeState","__extends","ModuleState","CatalogLabelComponent","validateCatalogId","isB2b","catalogs","catalog","CartLineItemFunctions","Product","DimensionStrings","productDimension","IsGiftCard","OfferId","OfferName","isSalesLine","PeriodicDiscount","EffectiveAmount","priceCurrency","EffectivePercentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","IsInvoiceLine","PickupDeliveryModeCode","hasShippingMethod","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","chargeTotal","CalculatedAmount","priceComponent","chargeline","SalesAgreementLineRecordId","salesAgreementPricePrompt","destructDimensionStrings","OmniChannelMedia","productDimensions","renderDisountLines","renderInventoryLabel","renderUnitOfMeasure","renderShippingLabel","renderOtherCharges","renderSalesAgreementPrompt","productAttribute","imgeClassName","newValue","quantityOnChange","lineIndex","Image","fallBackSrc","loadFailureBehavior","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","NetPrice","salesAgreementLineId","nodes","isOutOfStock","IncrementalQuantity","maxQuantity","currentCount","currentQuantity","decrementButtonAriaLabel","incrementButtonAriaLabel","isCartStateReady","isGiftCard","DiscountAmount","_generateQuantityandPrice","priceEditorResources","CartLinePriceEditor","PromoBannerCloseButton","closeButtonAriaLabel","onClose","PromoBannerLinks","links","onTextChange","editableLinks","_mapEditableLinks","linkdata","link","linkText","editableLink","linkUrl","destinationUrl","openInNewTab","additionalProperties","PromoBannerText","PromoBanner","animating","isVisible","activeIndex","handleTextChange","bannerMessages","handleLinkTextChange","linkIndex","_next","nextIndex","_isLastItem","_goToIndex","_previous","_isFirstItem","_onDismiss","dismissEnabled","interval","hideFlipper","autoplay","closeButtonLabel","bannerText","bannerAriaLabel","onDismiss","handleLinks","handleText","promoBannerProps","promoBannerTextProps","promoBannerLinksProps","contentProps","promoBannerText","carouselProps","Carousel","previous","onIndicatorsClickHandler","hideIndicator","closeButton","slides"],"sourceRoot":""}