{"version":3,"file":"static/js/10.08d0031c128dd900816c.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/common/components/order-summary-lineitem.tsx?0022","webpack://Msdyn365.Commerce.Online/./src/common/method/functions.ts?3a9c","webpack://Msdyn365.Commerce.Online/./src/helpers/cart-validation-helpers.ts?a1a9","webpack://Msdyn365.Commerce.Online/./src/helpers/esam-validation-helpers.tsx?24d6","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/utilities/error-utilities.ts?b9b4","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/components/farmlands-buybox-small-components.tsx?4a3d","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/components/dropdown/dropdown.tsx?a526","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/components/farmlands-buybox-product-configure.tsx?d193","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/common/buyboxInterface.ts?805b","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/common/utilities/error-utilities.ts?b982","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/common/buybox-components.tsx?8718","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/components/buybox-find-in-store.tsx?edab","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/farmlands-buybox.tsx?e07b","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-buybox/farmlands-buybox.view.tsx?9873","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart-icon/components/flyout-cart-line-items.tsx?e445","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart-icon/utils/get-products-in-mini-cart.ts?3890","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart-icon/farmlands-cart-icon.tsx?b6b4","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart-icon/farmlands-cart-icon.view.tsx?9e30","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart/components/farmlands-cart-pick-up-in-store.tsx?8390","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart/components/farmlands-cart-line-items.tsx?d25c","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart/components/farmlands-cart-delivery-methods.tsx?3341","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart/farmlands-cart.tsx?1c4a","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart/farmlands-cart.view.tsx?f3ee","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-cart/inventoryStore.ts?9493","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-delivery-options/components/farmlands-checkout-delivery-options.description.tsx?b6fe","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-delivery-options/components/farmlands-checkout-delivery-options.error-message.tsx?b47a","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-delivery-options/components/farmlands-checkout-delivery-options.error-title.tsx?f86b","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-delivery-options/components/farmlands-checkout-delivery-options.radio-button.tsx?1ec1","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-delivery-options/farmlands-checkout-delivery-options.tsx?ca42","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-delivery-options/farmlands-checkout-delivery-options.view.tsx?3b79","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-shareholder-payment/components/add-payment-form.tsx?13f7","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-shareholder-payment/components/error.tsx?b44e","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-shareholder-payment/components/payment-information.tsx?420c","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout-shareholder-payment/farmlands-checkout-shareholder-payment.tsx?afc5","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/components/alert.tsx?c984","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/components/get-line-items.tsx?0a95","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/components/get-order-summary.tsx?8df5","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/components/guided-card.tsx?4582","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/components/guided-form.tsx?4d37","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/components/place-order-button.tsx?0bc1","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/methods/farmlands-checkout.ts?0f95","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/methods/empty-active-cart.ts?4469","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/farmlands-checkout.tsx?dcf8","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/methods/place-order.ts?146b","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-checkout/farmlands-checkout.view.tsx?8007","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-product-collection/farmlands-product-collection.props.autogenerated.ts?bdf8","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-product-collection/farmlands-product-collection.tsx?b8c2","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-product-collection/farmlands-product-collection.view.tsx?037c","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/link.tsx?7ca6","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/product-search-result-items.tsx?a750","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/feature-search-result-item.tsx?3d89","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/title.tsx?1911","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/separator.tsx?b985","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/types/CommerceTypes.ts?b6ba","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/utilities.ts?b7d3","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/range-refine-item.tsx?8966","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/refine-item.tsx?18cc","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/choice-summary.tsx?d424","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/modal.tsx?f88a","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/refine-submenu.tsx?adaa","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/components/error-message.tsx?dbc9","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/farmlands-search-result-container.props.autogenerated.ts?d768","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/farmlands-search-result-container.tsx?0348","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search-result-container/farmlands-search-result-container.view.tsx?e4fe","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search/actions/get-auto-suggest-suggestions.ts?3e76","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search/components/farmlands-search.productsuggest.tsx?5f35","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search/components/farmlands-search.categorysuggest.tsx?7265","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search/components/farmlands-search.form.tsx?6c09","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search/components/farmlands-search.label.tsx?91de","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search/farmlands-search.tsx?594f","webpack://Msdyn365.Commerce.Online/./src/modules/farmlands-search/farmlands-search.view.tsx?5a4c","webpack://Msdyn365.Commerce.Online/./src/themes/farmlandstheme/utilities/quantity/Quantity.tsx?7b05","webpack://Msdyn365.Commerce.Online/./src/themes/farmlandstheme/views/components/cartlineitem.component.tsx?12c8","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.tsx?80d4","webpack://Msdyn365.Commerce.Online/./src/modules/carousel/carousel.view.tsx?d82f","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/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/common/error.tsx?096f","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-delivery-options/components/checkout-delivery-options.description.tsx?840c","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-delivery-options/components/checkout-delivery-options.error-message.tsx?8ca3","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-delivery-options/components/checkout-delivery-options.error-title.tsx?f7e7","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-delivery-options/components/checkout-delivery-options.radio-button.tsx?9df9","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-delivery-options/checkout-delivery-options.tsx?6764","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-delivery-options/checkout-delivery-options.view.tsx?1e75","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-loyalty/components/checkout-loyalty-input.tsx?cadb","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-loyalty/components/checkout-loyalty-label.tsx?e02b","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-loyalty/components/checkout-loyalty-text.tsx?895a","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-loyalty/checkout-loyalty.tsx?8b4b","webpack://Msdyn365.Commerce.Online/./src/modules/checkout-loyalty/checkout-loyalty.view.tsx?b79f","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/promocode.component.tsx?d9d6","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/header-preferred-store.tsx?ee9c","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/logo.tsx?f27e","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/nav-icon.tsx?2475","webpack://Msdyn365.Commerce.Online/./src/modules/header/header.tsx?e91a","webpack://Msdyn365.Commerce.Online/./src/modules/header/header.view.tsx?cf0f","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.tsx?4008","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.view.tsx?5d36","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/add-to-list/add-to-cart-selected-items.tsx?de21","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-actions.tsx?ca97","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-drawer.tsx?8701","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-form.tsx?5cbb","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-product.ts?187e","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-header-component.tsx?69b3","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-row-component.tsx?cd92","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/quick-order-grid-table-component.tsx?7cbc","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/quick-order-grid.tsx?fddf","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/quick-order-grid.view.tsx?f941","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/components/title.tsx?c269","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Msdyn365.Commerce.Online/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://Msdyn365.Commerce.Online/./src/search-state.ts?dd10","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/components/additional-content.tsx?b368","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.tsx?53e5","webpack://Msdyn365.Commerce.Online/./src/modules/video-player/video-player.view.tsx?fedb","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\r\nimport { Cart, ChannelConfiguration, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\nexport interface IOrderSummaryProps {\r\n subTotalLabel: string;\r\n shippingLabel: string;\r\n taxLabel: string;\r\n orderTotalLabel: string;\r\n loyaltyLabel?: string;\r\n giftcardLabel?: string;\r\n totalDiscountsLabel: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n cart: Cart;\r\n channelConfiguration: ChannelConfiguration;\r\n id: string;\r\n typeName: string;\r\n otherChargeLabel?: string;\r\n freeText?: string;\r\n toBeCalculatedText?: string;\r\n checkoutState?: ICheckoutState;\r\n isOnCartPage?: boolean;\r\n}\r\n\r\nexport interface IOrderSummaryLines {\r\n subtotal: React.ReactNode;\r\n shipping?: React.ReactNode;\r\n otherCharge?: React.ReactNode;\r\n tax: React.ReactNode;\r\n orderTotal: React.ReactNode;\r\n totalDiscounts?: React.ReactNode;\r\n giftCard?: React.ReactNode;\r\n loyalty?: React.ReactNode;\r\n}\r\n\r\ninterface IOrderSummaryLineProps {\r\n label: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n price?: number;\r\n freeText?: string;\r\n toBeCalculatedText?: string;\r\n id: string;\r\n typeName: string;\r\n cssLabel: string;\r\n}\r\n\r\ninterface IShippingOrderLine {\r\n cart: Cart;\r\n channelConfiguration: ChannelConfiguration;\r\n canShip?: boolean;\r\n hasDeliveryMethod?: boolean;\r\n hasShippingMethod?: boolean;\r\n freightFee?: number;\r\n}\r\n\r\nconst OrderSummaryLine: React.FC = ({\r\n price,\r\n label,\r\n context,\r\n id,\r\n typeName,\r\n toBeCalculatedText,\r\n freeText,\r\n cssLabel\r\n}) => {\r\n return (\r\n

\r\n {label}\r\n {price || price === 0 ? (\r\n \r\n ) : (\r\n {toBeCalculatedText}\r\n )}\r\n

\r\n );\r\n};\r\n\r\nconst _buildOrderSummarySection = (\r\n props: IOrderSummaryProps,\r\n price: number | undefined,\r\n cssLabel: string,\r\n label: string = ''\r\n): React.ReactNode => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\r\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\r\n};\r\n\r\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\r\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\r\n return count + (giftCard.Balance || 0);\r\n };\r\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\r\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\r\n return Math.min(giftCardTotalValue, amount);\r\n};\r\n\r\nconst getDeliveryConfiguration = (cart: Cart, channelConfiguration: ChannelConfiguration): IShippingOrderLine => {\r\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\r\n const freightFee = cart.ChargeLines?.[0]?.GrossAmount;\r\n const canShip = cart.DeliveryMode !== '' && cart.DeliveryMode === pickupDeliveryModeCode ? false : true;\r\n const hasDeliveryMethod = !!cart.DeliveryMode;\r\n const hasShippingMethod = cart.ExtensionProperties!.find(\r\n (prop: CommerceProperty) => prop.Key === 'IsDeliveryChargeCalculated'\r\n )?.Value?.BooleanValue;\r\n return {\r\n canShip,\r\n hasDeliveryMethod,\r\n hasShippingMethod,\r\n freightFee\r\n } as IShippingOrderLine;\r\n};\r\n\r\nexport const OrderSummary = (props: IOrderSummaryProps) => {\r\n const { isOnCartPage } = props;\r\n const { TaxAmount, TotalAmount, OtherChargeAmount, ExtensionProperties } = props.cart;\r\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(\r\n props.cart,\r\n props.channelConfiguration\r\n );\r\n const totalExclShippingCharges = ExtensionProperties?.find(\r\n (prop: CommerceProperty) => prop.Key === 'TotalSalesLinesIncGst'\r\n )?.Value?.DecimalValue;\r\n const totalDiscountPriceIncGST =\r\n ExtensionProperties?.find((prop: CommerceProperty) => prop.Key === 'DiscountPriceIncGst')?.Value\r\n ?.DecimalValue || 0;\r\n\r\n if (typeof window !== 'undefined') {\r\n (Window as any).digitalData.transaction.profile.total.transactionTotal = TotalAmount;\r\n (Window as any).digitalData.transaction.profile.total.totalDiscount = totalDiscountPriceIncGST;\r\n }\r\n\r\n const reactNodes: IOrderSummaryLines = {\r\n subtotal: _buildOrderSummarySection(props, totalExclShippingCharges, 'sub-total', props.subTotalLabel),\r\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\r\n orderTotal: _buildOrderSummarySection(\r\n props,\r\n isOnCartPage ? totalExclShippingCharges : TotalAmount,\r\n 'total',\r\n props.orderTotalLabel\r\n ),\r\n otherCharge:\r\n (OtherChargeAmount &&\r\n _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel)) ||\r\n undefined\r\n };\r\n\r\n if (canShip) {\r\n reactNodes.shipping = _buildOrderSummarySection(\r\n props,\r\n hasShippingMethod && !props.isOnCartPage ? freightFee : undefined,\r\n 'shipping',\r\n props.shippingLabel\r\n );\r\n }\r\n if (props.checkoutState) {\r\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\r\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\r\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\r\n\r\n if (loyaltyAmount > 0) {\r\n reactNodes.loyalty = _buildOrderSummarySection(\r\n props,\r\n -loyaltyAmount,\r\n 'loyalty',\r\n props.loyaltyLabel || 'Loyalty amount'\r\n );\r\n }\r\n\r\n if (giftCardAmount > 0) {\r\n reactNodes.giftCard = _buildOrderSummarySection(\r\n props,\r\n -giftCardAmount,\r\n 'gift-card',\r\n props.giftcardLabel || 'Gift card amount'\r\n );\r\n }\r\n\r\n reactNodes.orderTotal = _buildOrderSummarySection(\r\n { ...props, freeText: undefined },\r\n totalAmountAfterGiftCard,\r\n 'total',\r\n props.orderTotalLabel\r\n );\r\n }\r\n\r\n if (totalDiscountPriceIncGST > 0) {\r\n reactNodes.totalDiscounts = _buildOrderSummarySection(\r\n props,\r\n -totalDiscountPriceIncGST,\r\n 'total-discounts',\r\n props.totalDiscountsLabel\r\n );\r\n }\r\n\r\n return reactNodes;\r\n};\r\n","import { Cart, CommerceProperty } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g.d';\r\n\r\nenum ePropsValue {\r\n String = 'STRING',\r\n Integer = 'INTEGER',\r\n Boolean = 'BOOLEAN',\r\n Decimal = 'DECIMAL'\r\n}\r\n\r\ntype ExtensionPropsValue = ePropsValue.Boolean | ePropsValue.Integer | ePropsValue.String | ePropsValue.Decimal | null;\r\n\r\nconst IS_BUSINESS_ACCOUNT_KEY = 'IsBusinessAccount';\r\nconst CUST_HOLD_STATUS_KEY = 'CustHoldStatus';\r\nconst CUST_ACCOUNT_STATUS_KEY = 'CustAccountStatus';\r\n\r\n\r\nconst isShareholder = (cart: Cart): boolean => {\r\n console.log(cart)\r\n const { CustomerId, ExtensionProperties } = cart;\r\n const isBusinessAccountProperty = ExtensionProperties!.find((prop: CommerceProperty) => prop.Key === IS_BUSINESS_ACCOUNT_KEY);\r\n if (CustomerId !==undefined)\r\n {\r\n return CustomerId !== null && CustomerId!.length > 0 && ((isBusinessAccountProperty && isBusinessAccountProperty?.Value?.BooleanValue) || false);\r\n }\r\n else\r\n {\r\n return false;\r\n }\r\n};\r\n\r\nconst isCasual = (cart: Cart): boolean => {\r\n const { CustomerId, ExtensionProperties } = cart;\r\n const isBusinessAccountProperty = ExtensionProperties!.find((prop: CommerceProperty) => prop.Key === IS_BUSINESS_ACCOUNT_KEY);\r\n if (CustomerId !==undefined)\r\n {\r\n return CustomerId !== null && CustomerId!.length > 0 && ((isBusinessAccountProperty && !(isBusinessAccountProperty?.Value?.BooleanValue)) || false);\r\n }\r\n else{\r\n return false;\r\n }\r\n};\r\n\r\nconst isGuest = (cart: Cart): boolean => {\r\n const { CustomerId } = cart;\r\n if (CustomerId !==undefined)\r\n {\r\n return !(CustomerId!.length > 0);\r\n }\r\n else{\r\n return true;\r\n }\r\n\r\n};\r\n\r\nconst findExtensionProperty = (ExtensionProperties: CommerceProperty[], key: string): CommerceProperty | undefined => {\r\n return ExtensionProperties.find((prop: CommerceProperty) => prop.Key === key);\r\n};\r\n\r\n// CustHoldStatus for the customer is not set to \"Tax invoice\" or \"All\"\r\nconst isShareholderAccountNotOnHold = (ExtensionProperties: CommerceProperty[]): boolean => {\r\n const custHoldStatusProp = findExtensionProperty(ExtensionProperties, CUST_HOLD_STATUS_KEY);\r\n const onHoldStatus = custHoldStatusProp ? custHoldStatusProp.Value!.StringValue! : '';\r\n return !['Tax invoice', 'All'].includes(onHoldStatus);\r\n};\r\n\r\n// CustAccountStatus for the customer is set to \"Active\" or \"Monitored\"\r\nconst isShareholderAccountNotInactive = (ExtensionProperties: CommerceProperty[]): boolean => {\r\n const custAccountStatusProp = findExtensionProperty(ExtensionProperties, CUST_ACCOUNT_STATUS_KEY);\r\n const accountStatus = custAccountStatusProp ? custAccountStatusProp.Value!.StringValue! : '';\r\n return ['Active', 'Monitored'].includes(accountStatus);\r\n};\r\n\r\n// CustAccountStatus for the customer is set to \"Off-boarding\" or \"Suspended\"\r\nconst isShareholderAccountDisabled = (ExtensionProperties: CommerceProperty[]): boolean => {\r\n const custAccountStatusProp = findExtensionProperty(ExtensionProperties, CUST_ACCOUNT_STATUS_KEY);\r\n const accountStatus = custAccountStatusProp ? custAccountStatusProp.Value!.StringValue! : '';\r\n return ['Off-boarding', 'Suspended'].includes(accountStatus);\r\n};\r\n\r\n// CustAccountStatus for the customer is set to specifically to \"Inactive\"\r\nconst isShareholderAccountInactive = (ExtensionProperties: CommerceProperty[]): boolean => {\r\n const custAccountStatusProp = findExtensionProperty(ExtensionProperties, CUST_ACCOUNT_STATUS_KEY);\r\n const accountStatus = custAccountStatusProp ? custAccountStatusProp.Value!.StringValue! : '';\r\n return ['Inactive'].includes(accountStatus);\r\n};\r\n\r\nconst hasEcommerceAccess = (userContactDetails: any): boolean => {\r\n return userContactDetails?.CustomerAccounts.find((account: any) => account.IsActive === true).Permissions[0]?.Authorities.find(\r\n (prop: any) => prop.Authority === 'EcommerceAccess'\r\n );\r\n};\r\n\r\n/**\r\n * Get the value of an ExtensionProperty (EP)\r\n * @param extensionProperties The EP used to search for property\r\n * @param keyValue The key value to search\r\n * @param typeValue The type value to return\r\n * @returns The value from EP or EP Object if no typeValue is passed\r\n */\r\nconst getExtensionProperty = (extensionProperties: CommerceProperty[], keyValue: string, typeValue: ExtensionPropsValue = null): any => {\r\n const extensionProperty = extensionProperties.find((prop: CommerceProperty) => prop.Key === keyValue);\r\n\r\n if (typeValue === null || !extensionProperty) {\r\n return extensionProperty;\r\n }\r\n\r\n switch (typeValue) {\r\n case ePropsValue.String:\r\n return extensionProperty.Value!.StringValue;\r\n case ePropsValue.Boolean:\r\n return extensionProperty.Value!.BooleanValue;\r\n case ePropsValue.Integer:\r\n return extensionProperty.Value!.IntegerValue;\r\n case ePropsValue.Decimal:\r\n return extensionProperty.Value!.DecimalValue;\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nconst isValidColour = (str: string | undefined): string | void => {\r\n if (str === undefined || str.match(/^#[a-f0-9]{6}$/i) === null) {\r\n return;\r\n }\r\n return str;\r\n};\r\n\r\nexport {\r\n isShareholder,\r\n isCasual,\r\n isGuest,\r\n isShareholderAccountNotInactive,\r\n isShareholderAccountDisabled,\r\n isShareholderAccountInactive,\r\n isShareholderAccountNotOnHold,\r\n hasEcommerceAccess,\r\n ePropsValue,\r\n getExtensionProperty,\r\n isValidColour\r\n};\r\n","import { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n IDeliveryOptions,\r\n getDeliveryOptionsAsync,\r\n IDeliveryOption,\r\n DeliveryType\r\n} from '../actions/farmlands-get-delivery-options-calls.action';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\n\r\nenum DeliveryMethodsAllowedValue {\r\n PICKUP = 'Pickup',\r\n DELIVERY = 'Delivery',\r\n PICKUP_OR_DELIVERY = 'PickupOrDelivery'\r\n}\r\n\r\nconst DELIVERY_METHODS_ALLOWED_KEY = 'DeliveryMethodsAllowed';\r\n\r\nexport const getDeliveryMethodsAllowedProperty = (cartline: CartLine): DeliveryMethodsAllowedValue | undefined => {\r\n const extensionProperties = cartline?.ExtensionProperties;\r\n\r\n const deliveryMethodsAllowed = extensionProperties?.filter((keyValuePair) => {\r\n return keyValuePair.Key === DELIVERY_METHODS_ALLOWED_KEY;\r\n });\r\n\r\n return deliveryMethodsAllowed?.[0]?.Value?.StringValue;\r\n};\r\n\r\nexport const hasDeliveryOnlyError = (cartline: CartLine, deliveryOptions: IDeliveryOption[]): boolean => {\r\n // Check both extension property and the delivery options data to determine if cart line is delivery only.\r\n const hasDeliveryOptionOnly =\r\n hasDeliveryType(deliveryOptions, DeliveryType.DELIVERY) &&\r\n !hasDeliveryType(deliveryOptions, DeliveryType.PICKUP);\r\n\r\n\r\n return (\r\n (hasDeliveryOptionOnly ||\r\n getDeliveryMethodsAllowedProperty(cartline) === DeliveryMethodsAllowedValue.DELIVERY) &&\r\n cartline.FulfillmentStoreId !== undefined &&\r\n cartline.FulfillmentStoreId !== ''\r\n );\r\n};\r\n\r\nexport const hasPickupOnlyError = (cartline: CartLine, deliveryOptions: IDeliveryOption[]): boolean => {\r\n // Check both extension property and the delivery options data to determine if cart line is pickup only.\r\n const hasPickupOptionOnly =\r\n hasDeliveryType(deliveryOptions, DeliveryType.PICKUP) &&\r\n !hasDeliveryType(deliveryOptions, DeliveryType.DELIVERY);\r\n\r\n\r\n return (\r\n (hasPickupOptionOnly || getDeliveryMethodsAllowedProperty(cartline) === DeliveryMethodsAllowedValue.PICKUP) &&\r\n (cartline.FulfillmentStoreId === undefined || cartline.FulfillmentStoreId === '')\r\n );\r\n};\r\n\r\nexport const hasCartLineValidationErrors = (cartlines: CartLine[], deliveryOptions: IDeliveryOptions[]): boolean => {\r\n return (\r\n cartlines.filter((cartline) => {\r\n const deliveryOptionForCartLine = deliveryOptions.filter(\r\n (item) => item.ProductId === cartline.ItemId?.toString()\r\n )[0];\r\n return (\r\n hasDeliveryOnlyError(cartline, deliveryOptionForCartLine.DeliveryOptions) ||\r\n hasPickupOnlyError(cartline, deliveryOptionForCartLine.DeliveryOptions)\r\n );\r\n }).length > 0\r\n );\r\n};\r\n\r\nexport const retrieveDeliveryOptionsForCartItems = async (\r\n actionContext: IActionContext,\r\n products: SimpleProduct[]\r\n): Promise => {\r\n if (products && products?.length > 0) {\r\n return Promise.all(\r\n products.map((product) =>\r\n getDeliveryOptionsAsync({\r\n context: { callerContext: actionContext, queryResultSettings: {} },\r\n recordId: product.RecordId,\r\n salesPriceInclGST: product.AdjustedPrice\r\n }).then((response) => {\r\n return response;\r\n })\r\n )\r\n );\r\n } else {\r\n return [];\r\n }\r\n};\r\n\r\nexport const filterDeliveryOptionsForProductId = (\r\n deliveryOptions: IDeliveryOptions[],\r\n productId: string\r\n): IDeliveryOptions => {\r\n return deliveryOptions.filter((deliveryOption) => {\r\n return deliveryOption.ProductId === productId.toString();\r\n })[0];\r\n};\r\n\r\nexport const hasDeliveryType = (deliveryOptions: IDeliveryOption[], type: DeliveryType): boolean => {\r\n return (\r\n deliveryOptions && deliveryOptions.filter((deliveryOption) => {\r\n return deliveryOption.DeliveryType === type;\r\n }).length > 0\r\n );\r\n};\r\n","import { debounce } from 'lodash';\r\nimport {\r\n getESAMAddressSuggestions,\r\n IESAMAddressSuggestionsResult,\r\n IESAMFullAddressResult\r\n} from '../actions/farmlands-esam-address-calls.action';\r\n\r\nexport const ESAM_EXTENSION_PROPERTY_KEY = 'FBHADDRESSVALIDATION';\r\nexport const CHECKOUT_ADDRESS_FLAG = 'CheckoutAddressFlag';\r\n\r\nexport interface IAddressModuleState {\r\n fullAddressResponse?: IESAMFullAddressResult;\r\n suggestionResults: IESAMAddressSuggestionsResult[] | null;\r\n selectedAddressValue: string;\r\n isManualEdit: boolean;\r\n isSearching: boolean;\r\n}\r\n\r\n/**\r\n * Sets or removes read only status on form inputs for an address form.\r\n * Relies on ids of form inputs to target.\r\n *\r\n * @param setAsReadOnly\r\n */\r\nexport const toggleReadOnlyFormInputs = (setAsReadOnly: boolean, inputIdList: string[]) => {\r\n inputIdList.forEach((id) => {\r\n const element = document.getElementById(id);\r\n if (setAsReadOnly) {\r\n element?.removeAttribute('readonly');\r\n } else {\r\n element?.setAttribute('readonly', 'true');\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Debounced function for calling API for address suggestions.\r\n */\r\nexport const debouncedESAMSuggestionsAPICall = debounce(\r\n (\r\n value: string,\r\n proxyUrl: string,\r\n subscriptionKey: string,\r\n onSuccessCallback: (response: IESAMAddressSuggestionsResult[]) => void\r\n ) => {\r\n getESAMAddressSuggestions(value, proxyUrl, subscriptionKey)\r\n .then((response) => {\r\n if (onSuccessCallback) {\r\n onSuccessCallback(response!);\r\n }\r\n })\r\n .catch(() => {\r\n return;\r\n });\r\n },\r\n 150\r\n);\r\n\r\n// Construct street value to save in address form based on ESAM full address response\r\nexport const constructStreetValue = (addressResponse: IESAMFullAddressResult) => {\r\n let address = '';\r\n if (addressResponse.AddressType === 'PO Box') {\r\n if (!addressResponse.AddressLine3) {\r\n return addressResponse.AddressLine1;\r\n }\r\n return `${addressResponse.AddressLine1}, ${addressResponse.AddressLine2}`;\r\n } else {\r\n if (addressResponse.AddressLine3) {\r\n address = `${addressResponse.AddressLine1}, ${addressResponse.AddressLine2}`;\r\n } else {\r\n address = `${addressResponse.AddressLine1}`;\r\n\r\n if (addressResponse.SuburbLocality) {\r\n address = `${address}, ${addressResponse.SuburbLocality}`;\r\n }\r\n\r\n if (addressResponse.UnitType) {\r\n address = `${address}, ${addressResponse.AddressLine2}`;\r\n }\r\n\r\n if (addressResponse.RuralDelivery) {\r\n address = `${address}, ${addressResponse.RuralDelivery}`;\r\n }\r\n }\r\n }\r\n return address;\r\n};\r\n","import { IAddToCartFailureResult } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ProductDimension } from '@msdyn365-commerce/retail-proxy';\r\nimport { IFarmlandsBuyboxResources } from '../farmlands-buybox.props.autogenerated';\r\n\r\nexport function getQuantityError(\r\n stockLeft: number | undefined,\r\n resources: IFarmlandsBuyboxResources\r\n): string | undefined {\r\n if (!stockLeft || stockLeft <= 0) {\r\n return resources.errorMessageOutOfStock;\r\n } else if (stockLeft === 1) {\r\n return resources.errorMessageOutOfRangeOneLeft;\r\n } else {\r\n return resources.errorMessageOutOfRangeFormat.replace('{numLeft}', stockLeft.toString());\r\n }\r\n}\r\n\r\nexport function getGenericError(\r\n result: IAddToCartFailureResult,\r\n cart: ICartState | undefined,\r\n resources: IFarmlandsBuyboxResources,\r\n context: ICoreContext>\r\n): string | undefined {\r\n if (result.failureReason === 'EMPTYINPUT') {\r\n return resources.addedToCartFailureMessage;\r\n } else if (result.failureReason === 'CARTACTIONFAILED') {\r\n if (result.cartActionResult && result.cartActionResult.substatus === 'MAXQUANTITY') {\r\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\r\n const curQuantity =\r\n cart!.cart.ExtensionProperties?.find((item) => item.Key === 'curQuantity')?.Value?.IntegerValue || 0;\r\n return resources.maxQuantityLimitText\r\n .replace('{curQuantity}', curQuantity.toString())\r\n .replace('{maxQuantity}', maxQuantityForLineItem.toString());\r\n }\r\n\r\n return resources.addedToCartFailureMessage;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function getConfigureErrors(\r\n result: ProductDimension[] | undefined,\r\n resources: IFarmlandsBuyboxResources\r\n): { [configureId: string]: string | undefined } {\r\n if (!result) {\r\n return {};\r\n }\r\n\r\n const dimensions: { [configureId: string]: string | undefined } = {};\r\n\r\n result.forEach((dimension) => {\r\n dimensions[dimension.DimensionTypeValue] = getDimensionErrorString(dimension.DimensionTypeValue, resources);\r\n });\r\n\r\n return dimensions;\r\n}\r\n\r\nexport function getDimensionErrorString(dimensionTypeValue: number, resources: IFarmlandsBuyboxResources): string {\r\n switch (dimensionTypeValue) {\r\n case 1: // ProductDimensionType.Color\r\n return resources.productDimensionTypeColorErrorMessage;\r\n case 2: // ProductDimensionType.Configuration\r\n return resources.productDimensionTypeConfigurationErrorMessage;\r\n case 3: // ProductDimensionType.Size\r\n return resources.productDimensionTypeSizeErrorMessage;\r\n case 4: // ProductDimensionType.Style\r\n return resources.productDimensionTypeStyleErrorMessage;\r\n default:\r\n return '';\r\n }\r\n}\r\n","import * as React from 'react';\r\n\r\nimport { format, Heading, INodeProps, Quantity } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToCartComponent,\r\n AddToWishlistComponent,\r\n IAddToCartFailureResult,\r\n IWishlistActionErrorResult,\r\n IWishlistActionSuccessResult,\r\n RatingComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { IAddToCartResources } from '@msdyn365-commerce/components/dist/types/index';\r\nimport { IFarmlandsBuyboxProps } from '../farmlands-buybox.props.autogenerated';\r\nimport { IBuyboxCallbacks, IBuyboxState } from '../farmlands-buybox';\r\nimport { IFarmlandsBuyboxData } from '../farmlands-buybox.data';\r\nimport { getConfigureErrors, getGenericError, getQuantityError } from '../utilities/error-utilities';\r\nimport { CartLine, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\n\r\n\r\nexport function getBuyBoxInventoryLabel(props: IFarmlandsBuyboxProps): React.ReactElement | undefined {\r\n const {\r\n data: {\r\n productAvailableQuantity: { result: productAvailableQuantity }\r\n }\r\n } = props;\r\n if (!productAvailableQuantity || !productAvailableQuantity.length) {\r\n return undefined;\r\n }\r\n if (productAvailableQuantity && productAvailableQuantity.length && productAvailableQuantity[0].StockLevelLabel) {\r\n const inventoryClassName = productAvailableQuantity[0].StockLevelCode\r\n ? `ms-buybox__inventory-label ms-buybox__inventory-code-${productAvailableQuantity[0].StockLevelCode.toLowerCase()}`\r\n : 'ms-buybox__inventory-label';\r\n return (\r\n
\r\n {productAvailableQuantity[0].StockLevelLabel}\r\n
\r\n );\r\n }\r\n\r\n return undefined;\r\n}\r\nexport function getBuyboxProductTitle(props: IFarmlandsBuyboxProps): React.ReactElement | undefined {\r\n const {\r\n data: {\r\n product: { result: product }\r\n },\r\n config: { titleHeadingTag = 'h1' }\r\n } = props;\r\n\r\n return product && ;\r\n}\r\n\r\nexport function getBuyboxProductDescription(props: IFarmlandsBuyboxProps): React.ReactElement | undefined {\r\n const {\r\n data: {\r\n product: { result: product }\r\n }\r\n } = props;\r\n\r\n return product &&

{product.Description}

;\r\n}\r\n\r\nexport interface IBuyboxAddToCartViewProps {\r\n ContainerProps: INodeProps;\r\n errorBlock?: React.ReactNode;\r\n button?: React.ReactNode;\r\n}\r\nexport function getBuyboxAddToCart(\r\n props: IFarmlandsBuyboxProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n): IBuyboxAddToCartViewProps {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n cart: { result: cart },\r\n product: { result: product },\r\n productAvailableQuantity: { result: productAvailableQuantity }\r\n },\r\n resources\r\n } = props;\r\n const { quantity, selectedProduct, isUpdatingDimension, selectedDimensions } = state;\r\n const priceData = props.data?.product?.result?.ExtensionProperties;\r\n const priceIncGST = priceData!.find((prop: CommerceProperty) => prop.Key === 'BasePriceWithGST')?.Value?.DecimalValue;\r\n const specialPriceIncGST = priceData!.find((prop: CommerceProperty) => prop.Key === 'ItemPriceWithGST')?.Value?.DecimalValue;\r\n let { isCartEmpty } = state;\r\n const onAdd = () => {\r\n let productdetail = {\r\n productInfo: {\r\n productName: props.data.product.result?.Name,\r\n sku: props.data.product.result?.ItemId,\r\n price: props.data.product.result?.Price,\r\n productId: props.data.product.result?.RecordId\r\n },\r\n category: {\r\n primaryCategory: ''\r\n }\r\n };\r\n (Window as any).digitalData.product = [productdetail];\r\n if (!isCartEmpty) {\r\n window.dispatchEvent(new CustomEvent('CartOpen'));\r\n isCartEmpty = true;\r\n }\r\n window.dispatchEvent(new CustomEvent('AddToCart'));\r\n }\r\n const onAddToCartFailed = (result: IAddToCartFailureResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'ADDTOCART',\r\n quantityError: result.failureReason === 'OUTOFSTOCK' ? getQuantityError(result.stockLeft, resources) : undefined,\r\n configureErrors: result.failureReason === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources) : {},\r\n otherError: getGenericError(result, cart, resources, context)\r\n });\r\n };\r\n\r\n const dialogStrings: IAddToCartResources = {\r\n goToCartText: resources.buyBoxGoToCartText,\r\n continueShoppingText: resources.buyBoxContinueShoppingText,\r\n headerItemOneText: resources.buyBoxSingleItemText,\r\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\r\n headerMessageText: resources.buyBoxHeaderMessageText,\r\n freePriceText: resources.priceFree,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n closeNotificationLabel: resources.closeNotificationLabel,\r\n addedQuantityText: resources.addedQuantityText\r\n };\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=240&h=240&m=6`, w: 0, h: 0 },\r\n xl: { q: `w=240&h=240&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n const productAvailability = state.productAvailableQuantity\r\n ? state.productAvailableQuantity.ProductAvailableQuantity\r\n : productAvailableQuantity && productAvailableQuantity.length\r\n ? productAvailableQuantity[0].ProductAvailableQuantity\r\n : undefined;\r\n\r\n const isLoading = typeName !== 'quickview' && props.data.productAvailableQuantity.status === 'LOADING';\r\n if (isLoading) {\r\n callbacks.changeUpdatingDimension(false);\r\n }\r\n\r\n // Check product dimensions\r\n const productDim = props.data.product.result?.Dimensions?.find((dim) => !(dim.DimensionValue && dim.DimensionValue.DimensionId));\r\n\r\n // Check selected dimensions\r\n const allDim = selectedDimensions && Object.keys(selectedDimensions).length === props.data.productDimensions.result?.length;\r\n\r\n // Ensure custom API check is still compatible with pre-existing logic\r\n const disableButton = (state.disableAddToCartButton) || (allDim && productDim !== undefined);\r\n\r\n //Check the return values\r\n console.log(state.disableAddToCartButton);\r\n console.log(allDim);\r\n console.log(productDim);\r\n\r\n let addToCartText;\r\n //Fix GA issue\r\n // if(disableButton) {\r\n // addToCartText = resources.outOfStockText;\r\n // } else {\r\n addToCartText = resources.addToCartText;\r\n // }\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__add-to-cart-container'\r\n },\r\n button: product && (\r\n \r\n )\r\n };\r\n}\r\n\r\nexport function getBuyboxProductPrice(props: IFarmlandsBuyboxProps): React.ReactElement | undefined {\r\n const priceData = props?.data.productPrice.result?.ExtensionProperties;\r\n const priceIncGST = priceData?.find((prop: CommerceProperty) => prop.Key === 'BasePriceWithGST')?.Value?.DecimalValue || 0;\r\n const specialPriceIncGST = priceData?.find((prop: CommerceProperty) => prop.Key === 'ItemPriceWithGST')?.Value?.DecimalValue || 0;\r\n const isOnSpecial = priceIncGST > specialPriceIncGST;\r\n return props ? (\r\n isOnSpecial ? (\r\n
\r\n \r\n ${Number(priceIncGST).toFixed(2)}\r\n \r\n Your price ${Number(specialPriceIncGST).toFixed(2)}*\r\n
\r\n ) : (\r\n
${Number(priceIncGST).toFixed(2)}
\r\n )\r\n ) : undefined;\r\n}\r\n\r\nexport function getBuyboxProductRating(props: IFarmlandsBuyboxProps): React.ReactElement | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n ratingsSummary: { result: ratingsSummary }\r\n },\r\n resources\r\n } = props;\r\n\r\n const ratingComponent =\r\n (ratingsSummary && ratingsSummary.averageRating && (\r\n \r\n )) ||\r\n undefined;\r\n\r\n return ratingsSummary && ratingComponent && ratingComponent;\r\n}\r\n\r\nexport interface IBuyboxAddToWishlistViewProps {\r\n ContainerProps: INodeProps;\r\n errorBlock?: React.ReactNode;\r\n button?: React.ReactNode;\r\n}\r\nexport function getBuyboxProductAddToWishlist(\r\n props: IFarmlandsBuyboxProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n): IBuyboxAddToWishlistViewProps | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n product: { result: product },\r\n wishlists: { result: wishlists }\r\n },\r\n resources\r\n } = props;\r\n\r\n const { selectedProduct } = state;\r\n const onAddToWishlistSuccess = (result: IWishlistActionSuccessResult, cartline: CartLine) => {\r\n if (result.status === 'ADDED') {\r\n window.dispatchEvent(new CustomEvent('AddToWishlist'));\r\n }\r\n }\r\n const onAddToWishlistFailed = (result: IWishlistActionErrorResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'WISHLIST',\r\n configureErrors: result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources) : {}\r\n });\r\n };\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__add-to-wishlist-container'\r\n },\r\n button: product && (\r\n \r\n )\r\n };\r\n}\r\n\r\nexport interface IBuyboxProductQuantityViewProps {\r\n ContainerProps: INodeProps;\r\n LabelContainerProps: INodeProps;\r\n\r\n heading: React.ReactNode;\r\n errors?: React.ReactNode;\r\n\r\n input: React.ReactNode;\r\n}\r\nexport function getBuyboxProductQuantity(\r\n props: IFarmlandsBuyboxProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n): IBuyboxProductQuantityViewProps {\r\n const {\r\n resources,\r\n context: {\r\n app: {\r\n config: { maxQuantityForCartLineItem }\r\n }\r\n }\r\n } = props;\r\n\r\n const {\r\n quantity,\r\n errorState: { quantityError }\r\n } = state;\r\n\r\n const onChange = (newValue: number) => {\r\n if (callbacks.updateQuantity) {\r\n callbacks.updateQuantity(newValue);\r\n }\r\n };\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__quantity'\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: 'ms-buybox__product-quantity-label',\r\n htmlFor: 'ms-buybox__product-quantity-input'\r\n },\r\n heading:
{resources.productQuantityHeading}
,\r\n errors: quantityError && (\r\n \r\n \r\n ),\r\n input: (\r\n \r\n )\r\n };\r\n}\r\n","/**\r\n * Copyright (c) 2018 Microsoft Corporation\r\n */\r\nimport * as React from 'react';\r\nimport { IDropdownProps } from './';\r\nimport { IDropdownItemProps } from './dropdown.props';\r\n\r\ntype IDropdownState = {\r\n /**\r\n * @friendlyName selectedIndex\r\n * @description selected index\r\n */\r\n selectedIndex: string;\r\n};\r\n\r\n/**\r\n *\r\n * DropDown component\r\n * @extends {React.PureComponent}\r\n */\r\nexport class Dropdown extends React.PureComponent {\r\n private selectMenu: React.RefObject = React.createRef();\r\n\r\n constructor(props: IDropdownProps, state: IDropdownState) {\r\n super(props);\r\n this.state = {\r\n selectedIndex: ''\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (this.selectMenu.current) {\r\n this.selectMenu.current.selectedIndex = 0;\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {dropdownId, dropdownList, dropdownName, dropdownToggleName} = this.props;\r\n\r\n return (\r\n \r\n \r\n {dropdownList.map(\r\n (item: IDropdownItemProps) => item && \r\n )}\r\n \r\n );\r\n }\r\n\r\n private _onChanged = async (event: React.ChangeEvent) => {\r\n this.setState({selectedIndex: event.target.value});\r\n\r\n if (this.props.onChange) {\r\n await this.props.onChange({\r\n dropdownId: this.props.dropdownId,\r\n selectId: event.target.value,\r\n selectedValue: event.target.innerText\r\n });\r\n }\r\n };\r\n}","import * as React from 'react';\r\n\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IFarmlandsBuyboxProps, IFarmlandsBuyboxResources } from '../farmlands-buybox.props.autogenerated';\r\nimport { IBuyboxCallbacks, IBuyboxState } from '../farmlands-buybox';\r\nimport { IFarmlandsBuyboxData } from '../farmlands-buybox.data';\r\nimport { Dropdown, IDropdownItemProps, IDropdownOnSelectionChangeNotification } from './dropdown';\r\n\r\nexport interface IBuyboxProductConfigureProps {\r\n product: SimpleProduct;\r\n productDimensions: ProductDimensionFull[];\r\n resources: IFarmlandsBuyboxResources;\r\n channelId: number;\r\n actionContext: IActionContext;\r\n errors: { [configureId: string]: string | undefined };\r\n\r\n dimensionChanged?(newValue: number): void;\r\n}\r\n\r\nexport interface IBuyboxProductConfigureDropdownViewProps {\r\n ContainerProps: INodeProps;\r\n LabelContainerProps: INodeProps;\r\n\r\n heading: React.ReactNode;\r\n errors?: React.ReactNode;\r\n sizeGuideLink?: React.ReactNode;\r\n\r\n select: React.ReactNode;\r\n}\r\n\r\nexport interface IBuyboxProductConfigureViewProps {\r\n ContainerProps: INodeProps;\r\n\r\n dropdowns: IBuyboxProductConfigureDropdownViewProps[];\r\n}\r\n\r\nexport function getBuyboxProductConfigure(\r\n props: IFarmlandsBuyboxProps,\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks\r\n): IBuyboxProductConfigureViewProps | undefined {\r\n const {\r\n data: {\r\n product: { result: product },\r\n productDimensions: { result: productDimensions }\r\n },\r\n config,\r\n resources\r\n } = props;\r\n\r\n const {\r\n errorState: { configureErrors }\r\n } = state;\r\n\r\n const { getDropdownName } = callbacks;\r\n\r\n if (!product || !productDimensions) {\r\n return undefined;\r\n }\r\n\r\n const onChanged = async (notification: IDropdownOnSelectionChangeNotification) =>\r\n _onChanged(notification, callbacks.dimensionSelectedAsync);\r\n\r\n const dropdowns = productDimensions.map((productDimensionFull) =>\r\n _mapProductDimensionFullToDropdownViewProps(\r\n productDimensionFull,\r\n resources,\r\n configureErrors,\r\n getDropdownName,\r\n onChanged,\r\n config.sizeGuideLink!\r\n )\r\n );\r\n\r\n if (!dropdowns || dropdowns.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__configure'\r\n },\r\n dropdowns: dropdowns\r\n };\r\n}\r\n\r\nconst _onChanged = async (\r\n notification: IDropdownOnSelectionChangeNotification,\r\n dimensionChanged: (newValue: number, selectedDimensionValue: string) => Promise\r\n): Promise => {\r\n await dimensionChanged(+notification.dropdownId, notification.selectId);\r\n};\r\n\r\nconst _mapProductDimensionFullToDropdownViewProps = (\r\n productDimensionFull: ProductDimensionFull,\r\n resources: IFarmlandsBuyboxResources,\r\n configureErrors: { [configureId: string]: string | undefined },\r\n getDropdownName: (dimensionType: number, resources: IFarmlandsBuyboxResources) => string,\r\n dropdownCallback: (notification: IDropdownOnSelectionChangeNotification) => Promise,\r\n sizeGuideLink: string\r\n): IBuyboxProductConfigureDropdownViewProps => {\r\n const dropdownName = getDropdownName(productDimensionFull.DimensionTypeValue, resources);\r\n const dropdownId = productDimensionFull.DimensionTypeValue.toString();\r\n const dropdownToggleName = resources.selectDimensionFormatString.replace('{0}', dropdownName.toLocaleLowerCase());\r\n const dropdownList: IDropdownItemProps[] = productDimensionFull.DimensionValues\r\n ? productDimensionFull.DimensionValues.map((dimensionValue) => {\r\n return {\r\n value: dimensionValue.Value || '',\r\n id: dimensionValue.RecordId.toString()\r\n };\r\n })\r\n : [];\r\n const errorMessage = configureErrors[dropdownId];\r\n const isSizeDropdown = dropdownId === '3';\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__dropdown'\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: 'ms-buybox__dropdown-quantity-label',\r\n htmlFor: `ms-buybox__dropown-quantity-input-${dropdownId}`\r\n },\r\n errors: errorMessage && (\r\n \r\n \r\n ),\r\n sizeGuideLink: isSizeDropdown && (\r\n \r\n Size Guide\r\n \r\n ),\r\n heading:
{dropdownName}
,\r\n select: (\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\nimport { ProductDimensionFull, RatingsSummary } from '@msdyn365-commerce/commerce-entities';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CommerceList, Customer, FeatureState, ProductDeliveryOptions, ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { IProductInventoryInformation, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\n\r\nexport interface IBuyboxState {\r\n quantity: number;\r\n min: number | undefined;\r\n max: number | undefined;\r\n errorState: IErrorState;\r\n selectedProduct?: Promise;\r\n productAvailableQuantity?: IProductInventoryInformation;\r\n productPrice?: ProductPrice;\r\n productDeliveryOptions?: ProductDeliveryOptions;\r\n modalOpen?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isServiceItem?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n keyInPriceAmount?: number;\r\n isCustomPriceSelected?: boolean;\r\n activeIndex?: number;\r\n animating?: boolean;\r\n lastUpdate?: number;\r\n mediaGalleryItems?: Msdyn365.IImageData[] | undefined;\r\n}\r\n\r\nexport interface IBuyboxCommonData {\r\n deliveryOptions: AsyncResult | undefined;\r\n product: AsyncResult;\r\n productDimensions: AsyncResult;\r\n productPrice: AsyncResult;\r\n ratingsSummary: AsyncResult;\r\n storeSelectorStateManager: AsyncResult;\r\n wishlists: AsyncResult;\r\n orderTemplates: AsyncResult;\r\n cart: AsyncResult;\r\n productAvailableQuantity: AsyncResult;\r\n customerInformation: AsyncResult;\r\n featureState: AsyncResult;\r\n}\r\nexport declare type IBuyboxErrorHost = 'ADDTOCART' | 'FINDINSTORE' | 'WISHLIST' | 'SHOPSIMILARITEM' | 'ORDER_TEMPLATE';\r\n\r\nexport interface IErrorState {\r\n errorHost?: IBuyboxErrorHost;\r\n configureErrors: { [configureId: string]: string | undefined };\r\n quantityError?: string;\r\n customAmountError?: string;\r\n otherError?: string;\r\n}\r\n\r\nexport interface IBuyboxAddToCartViewProps {\r\n ContainerProps: INodeProps;\r\n errorBlock?: React.ReactNode;\r\n button?: React.ReactNode;\r\n}\r\n\r\nexport interface IBuyboxAddToOrderTemplateViewProps {\r\n ContainerProps: INodeProps;\r\n errorBlock?: React.ReactNode;\r\n button?: React.ReactNode;\r\n}\r\n\r\nexport interface IBuyboxProductQuantityViewProps {\r\n ContainerProps: INodeProps;\r\n LabelContainerProps: INodeProps;\r\n\r\n heading: React.ReactNode;\r\n errors?: React.ReactNode;\r\n\r\n input: React.ReactNode;\r\n}\r\n\r\nexport interface IBuyboxAddToWishlistViewProps {\r\n ContainerProps: INodeProps;\r\n errorBlock?: React.ReactNode;\r\n button?: React.ReactNode;\r\n}\r\n\r\nexport interface IBuyboxShopSimilarLookViewProps {\r\n ContainerProps: INodeProps;\r\n errors?: React.ReactNode;\r\n input: React.ReactNode;\r\n}\r\n\r\nexport enum ShopSimiliarButtonType {\r\n Looks = 'looks',\r\n Description = 'descriptions'\r\n}\r\n\r\nexport interface IBuyboxKeyInPriceViewProps {\r\n ContainerProps: INodeProps;\r\n LabelContainerProps: INodeProps;\r\n heading: React.ReactNode;\r\n input: React.ReactNode;\r\n}\r\n\r\nexport interface IBuyboxErrorBlockProps {\r\n configureErrors: { [configureId: string]: string | undefined };\r\n quantityError?: string;\r\n customAmountError?: string;\r\n otherError?: string;\r\n resources: IBuyboxCommonResources;\r\n showError: boolean;\r\n}\r\n\r\nexport interface IBuyboxProductConfigureProps {\r\n product: SimpleProduct;\r\n productDimensions: ProductDimensionFull[];\r\n resources: IBuyboxCommonResources;\r\n channelId: number;\r\n actionContext: Msdyn365.IActionContext;\r\n errors: { [configureId: string]: string | undefined };\r\n\r\n dimensionChanged?(newValue: number): void;\r\n}\r\n\r\nexport interface IBuyboxProductConfigureDropdownViewProps {\r\n ContainerProps: INodeProps;\r\n LabelContainerProps: INodeProps;\r\n\r\n heading: React.ReactNode;\r\n errors?: React.ReactNode;\r\n\r\n select: React.ReactNode;\r\n}\r\n\r\nexport interface IBuyboxProductConfigureViewProps {\r\n ContainerProps: INodeProps;\r\n\r\n dropdowns: IBuyboxProductConfigureDropdownViewProps[];\r\n}\r\n\r\nexport interface IBuyboxCallbacks {\r\n updateQuantity(newQuantity: number): boolean;\r\n updateKeyInPrice(keyInPrice: number): void;\r\n updateErrorState(newErrorState: IErrorState): void;\r\n updateSelectedProduct(\r\n selectedProduct: Promise,\r\n newInventory: IProductInventoryInformation | undefined,\r\n newPrice: ProductPrice | undefined,\r\n newDeliveryOptions: ProductDeliveryOptions | undefined): void;\r\n getDropdownName(dimensionType: number, resources: IBuyboxCommonResources): string;\r\n dimensionSelectedAsync(selectedDimensionId: number, selectedDimensionValueId: string): Promise;\r\n changeModalOpen(isModalOpen: boolean): void;\r\n changeUpdatingDimension(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\nexport interface IBuyboxExtentedProps extends Msdyn365.IModule {\r\n resources: IBuyboxCommonResources;\r\n config: IBuyboxCommonConfig;\r\n slots: {};\r\n}\r\n\r\nexport interface IBuyboxCommonConfig {\r\n titleHeadingTag?: titleHeadingTag;\r\n className?: string;\r\n enableShopSimilarLooks?: boolean;\r\n enableShopSimilarDescription?: boolean;\r\n enableKeyInPrice?: boolean;\r\n minimumKeyInPrice?: number;\r\n maximumKeyInPrice?: number;\r\n}\r\n\r\nexport interface IProductDetails {\r\n product?: SimpleProduct | null;\r\n productPrice?: ProductPrice | null;\r\n ratingsSummary?: RatingsSummary;\r\n productAvailableQuantity?: IProductInventoryInformation[];\r\n cart?: ICartState | undefined;\r\n productDimensions?: ProductDimensionFull[] | null;\r\n}\r\n\r\nexport const enum titleHeadingTag {\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 IBuyboxCommonResources {\r\n priceFree: string;\r\n invalidSmallCustomAmountText: string;\r\n invalidLargeCustomAmountText: string;\r\n buyBoxGoToCartText: string;\r\n buyBoxContinueShoppingText: string;\r\n closeNotificationLabel: string;\r\n buyBoxSingleItemText: string;\r\n buyBoxMultiLineItemFormatText: string;\r\n buyBoxHeaderMessageText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n addToCartText: string;\r\n outOfStockText: string;\r\n averageRatingAriaLabel: string;\r\n addToOrderTemplateHeader: string;\r\n noOrderTemplatesMessage: string;\r\n noOrderTemplatesDescription: string;\r\n createAnOrderTemplateButtonText: string;\r\n createNewOrderTemplateButtonText: string;\r\n cancelOrderTemplateCreationButtonText: string;\r\n selectTemplatesText: string;\r\n addToTemplateButtonText: string;\r\n lineItemsText: string;\r\n createOrderTemplateHeader: string;\r\n orderTemplateTitle: string;\r\n orderTemplateNameAriaLabel: string;\r\n createOrderTemplateDescription: string;\r\n defaultOrderTemplateName: string;\r\n createOrderTemplateButtonText: string;\r\n cancelNewOrderTemplateCreationButtonText: string;\r\n viewOrderTemplateButtonText: string;\r\n continueShoppingButtonText: string;\r\n itemAddedToOrderTemplateHeaderItemOneText: string;\r\n itemAddedToOrderTemplateHeaderItemFormatText: string;\r\n itemAddedToOrderTemplateHeaderMessageText: string;\r\n duplicatedProductsHeader: string;\r\n duplicatedProductsDescription: string;\r\n updateQuantityButtonText: string;\r\n cancelDuplicateItemsButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n addToWishlistMessage: string;\r\n removedFromWishlistMessage: string;\r\n addItemToWishlistError: string;\r\n removeItemFromWishlistError: string;\r\n nameOfWishlist: string;\r\n productQuantityHeading: string;\r\n inputQuantityAriaLabel: string;\r\n buyboxKeyInPriceLabelHeading: string;\r\n buyboxErrorMessageHeader: string;\r\n maxQuantityText: string;\r\n minQuantityText: string;\r\n selectDimensionFormatString: string;\r\n errorMessageOutOfStock: string;\r\n errorMessageOutOfRangeOneLeft: string;\r\n errorMessageOutOfRangeFormat: string;\r\n addToOrderTemplateButtonText: string;\r\n addedToCartFailureMessage: string;\r\n maxQuantityLimitText: string;\r\n productDimensionTypeColorErrorMessage: string;\r\n productDimensionTypeConfigurationErrorMessage: string;\r\n productDimensionTypeSizeErrorMessage: string;\r\n productDimensionTypeAmountErrorMessage: string;\r\n productDimensionTypeStyleErrorMessage: string;\r\n shopSimilarLooksText?: string;\r\n shopSimilarDescriptionText?: string;\r\n addToOrderTemplateButtonTooltip: string;\r\n loadingText?: string;\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 { IAddToCartFailureResult } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { OrgUnitLocation, ProductAvailableQuantity, ProductDimension, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IBuyboxCommonResources } from '../buyboxInterface';\r\n\r\nexport function getQuantityError(stockLeft: number | undefined, resources: IBuyboxCommonResources): string | undefined {\r\n if (!stockLeft || stockLeft <= 0) {\r\n return resources.errorMessageOutOfStock;\r\n } else if (stockLeft === 1) {\r\n return resources.errorMessageOutOfRangeOneLeft;\r\n }\r\n return resources.errorMessageOutOfRangeFormat.replace('{numLeft}', stockLeft.toString());\r\n\r\n}\r\n\r\nexport function getGenericError(\r\n result: IAddToCartFailureResult,\r\n cart: ICartState | undefined,\r\n resources: IBuyboxCommonResources,\r\n context: ICoreContext>,\r\n product: SimpleProduct | undefined,\r\n productAvailability: ProductAvailableQuantity | undefined,\r\n location: OrgUnitLocation | undefined): string | undefined {\r\n if (result.failureReason === 'EMPTYINPUT') {\r\n return resources.addedToCartFailureMessage;\r\n } else if (result.failureReason === 'CARTACTIONFAILED') {\r\n if (result.cartActionResult && result.cartActionResult.substatus === 'MAXQUANTITY') {\r\n // Get the quantity of the product in cart\r\n let elementFoundAt: number = -1;\r\n const productIdToFind = product?.RecordId;\r\n\r\n for (let i = 0; i < cart!.cart.CartLines!.length; i++) {\r\n if (cart!.cart.CartLines![i].ProductId === productIdToFind &&\r\n (cart!.cart.CartLines![i].DeliveryMode || '') === (location && context.actionContext.requestContext.channel?.PickupDeliveryModeCode || '') &&\r\n (cart!.cart.CartLines![i].FulfillmentStoreId || '') === (location?.OrgUnitNumber || '')) {\r\n elementFoundAt = i;\r\n\r\n break;\r\n }\r\n }\r\n\r\n let curQuantity: number = 0;\r\n\r\n if (elementFoundAt !== -1) {\r\n const cartLineToUpdate = { ...cart!.cart.CartLines![elementFoundAt] };\r\n curQuantity = cartLineToUpdate.Quantity || 0;\r\n }\r\n\r\n // Get the quantity limit for the product\r\n const maxQuantityForCartLineItem = context.app.config.maxQuantityForCartLineItem;\r\n const availableQty = productAvailability?.AvailableQuantity;\r\n\r\n let quantityLimit: number;\r\n\r\n if (maxQuantityForCartLineItem === undefined && availableQty === undefined) {\r\n quantityLimit = 10;\r\n } else if (availableQty === undefined) {\r\n quantityLimit = maxQuantityForCartLineItem;\r\n } else if (maxQuantityForCartLineItem === undefined) {\r\n quantityLimit = availableQty;\r\n } else {\r\n quantityLimit = Math.min(maxQuantityForCartLineItem, availableQty);\r\n }\r\n\r\n return resources.maxQuantityLimitText.replace('{curQuantity}', curQuantity.toString()).replace('{maxQuantity}', quantityLimit.toString());\r\n } else if (result.cartActionResult && (result.cartActionResult.substatus === 'QUANTITYLIMITS' || result.cartActionResult.substatus === 'INVOICEINCART')) {\r\n return result.cartActionResult?.errorDetails?.LocalizedMessage;\r\n }\r\n\r\n return resources.addedToCartFailureMessage;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function getConfigureErrors(result: ProductDimension[] | undefined, resources: IBuyboxCommonResources, isGiftCard?: boolean): { [configureId: string]: string | undefined } {\r\n if (!result) {\r\n return {};\r\n }\r\n\r\n const dimensions: { [configureId: string]: string | undefined } = {};\r\n\r\n result.forEach(dimension => {\r\n dimensions[dimension.DimensionTypeValue] = getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\r\n });\r\n\r\n return dimensions;\r\n}\r\n\r\nexport function getDimensionErrorString(dimensionTypeValue: number, resources: IBuyboxCommonResources, isGiftCard?: boolean): string {\r\n switch (dimensionTypeValue) {\r\n case 1: // ProductDimensionType.Color\r\n return resources.productDimensionTypeColorErrorMessage;\r\n case 2: // ProductDimensionType.Configuration\r\n return resources.productDimensionTypeConfigurationErrorMessage;\r\n case 3: // ProductDimensionType.Size\r\n return resources.productDimensionTypeSizeErrorMessage;\r\n case 4: // ProductDimensionType.Style\r\n return isGiftCard ? resources.productDimensionTypeAmountErrorMessage : resources.productDimensionTypeStyleErrorMessage;\r\n default:\r\n return '';\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 {\r\n AddToCartComponent, AddToOrderTemplateComponent, AddToWishlistComponent, IAddToCartFailureResult, IAddToCartResources, IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources, IOrderTemplateActionErrorResult, IOrderTemplateNameDialogResources, IWishlistActionErrorResult,\r\n PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Alert, Button, format, getPayloadObject, getTelemetryAttributes, getTelemetryObject, Heading, ITelemetryContent, Node, Quantity, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n IBuyboxAddToCartViewProps, IBuyboxAddToOrderTemplateViewProps, IBuyboxAddToWishlistViewProps, IBuyboxCallbacks, IBuyboxCommonData, IBuyboxCommonResources,\r\n IBuyboxErrorBlockProps, IBuyboxExtentedProps, IBuyboxKeyInPriceViewProps, IBuyboxProductQuantityViewProps, IBuyboxShopSimilarLookViewProps, IBuyboxState,\r\n IProductDetails, ShopSimiliarButtonType } from './buyboxInterface';\r\nimport { getConfigureErrors, getGenericError, getQuantityError } from './utilities/error-utilities';\r\n\r\nconst _getClassNamePrefix = (typeName: string): string => {\r\n return typeName.toLocaleLowerCase() === 'quickview' ? 'ms-quickView' : 'ms-buybox';\r\n};\r\n\r\nexport function getBuyBoxInventoryLabel(props: IBuyboxExtentedProps, productDetails?: IProductDetails): React.ReactElement | undefined {\r\n const { typeName } = props;\r\n const productAvailableQuantity = props.data.productAvailableQuantity?.result ? props.data.productAvailableQuantity?.result : productDetails?.productAvailableQuantity!;\r\n\r\n const className = _getClassNamePrefix(typeName);\r\n if (!productAvailableQuantity || productAvailableQuantity.length === 0) {\r\n return undefined;\r\n }\r\n if (productAvailableQuantity &&\r\n productAvailableQuantity.length > 0 &&\r\n productAvailableQuantity[0].StockLevelLabel) {\r\n const inventoryClassName = productAvailableQuantity[0].StockLevelCode ? `${className}__inventory-label ${className}__inventory-code-${productAvailableQuantity[0].StockLevelCode.toLowerCase()}` : `${className}__inventory-label`;\r\n return (
\r\n \r\n {productAvailableQuantity[0].StockLevelLabel}\r\n \r\n
);\r\n }\r\n\r\n return undefined;\r\n\r\n}\r\n\r\nexport function getBuyboxProductTitle(props: IBuyboxExtentedProps, productDetails?: IProductDetails): React.ReactElement | undefined {\r\n const {\r\n config: { titleHeadingTag = 'h1' },\r\n typeName\r\n } = props;\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n const product = props.data.product?.result ? props.data.product?.result : productDetails?.product!;\r\n\r\n return product && (\r\n \r\n );\r\n}\r\n\r\nexport function getBuyboxProductDescription(props: IBuyboxExtentedProps, productDetails?: IProductDetails): React.ReactElement | undefined {\r\n const { typeName } = props;\r\n const className = _getClassNamePrefix(typeName);\r\n const product = props.data.product?.result ? props.data.product?.result : productDetails?.product!;\r\n\r\n return product && (\r\n

\r\n {product.Description}\r\n

\r\n );\r\n}\r\n\r\n/**\r\n * Gets the react node for product unit of measure display.\r\n * @param {IBuyboxExtentedProps} props The buybox module props.\r\n * @param {IProductDetails} productDetails The product details to be displyed in buybox.\r\n * @returns {React.ReactElement} The node representing markup for unit of measure component.\r\n */\r\nexport function getBuyboxProductUnitOfMeasure(\r\n props: IBuyboxExtentedProps, productDetails?: IProductDetails): React.ReactElement | undefined {\r\n\r\n const {\r\n typeName\r\n } = props;\r\n const className = _getClassNamePrefix(typeName);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\r\n if (props.context.app.config && props.context.app.config.unitOfMeasureDisplayType === 'none') {\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- For quicview scenario result can be undefined.\r\n const product = props.data.product?.result ? props.data.product.result : productDetails?.product;\r\n if (!product || !product.DefaultUnitOfMeasure) {\r\n props.telemetry.warning('Missing defult unit of measureor theproduct');\r\n return undefined;\r\n }\r\n\r\n return (\r\n
\r\n \r\n {product.DefaultUnitOfMeasure}\r\n \r\n
\r\n );\r\n}\r\n\r\nlet telemetryContent: ITelemetryContent;\r\n\r\nexport function getBuyboxAddToCart(props: IBuyboxExtentedProps, state: IBuyboxState, callbacks: IBuyboxCallbacks,\r\n defaultMinimumKeyInPrice: number, defaultMaximumKeyInPrice: number, productDetails?: IProductDetails): IBuyboxAddToCartViewProps {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n config: { minimumKeyInPrice, maximumKeyInPrice }\r\n } = props;\r\n\r\n const product = props.data.product?.result ? props.data.product?.result : productDetails?.product!;\r\n const cart = props.data.cart?.result ? props.data.cart?.result : productDetails?.cart!;\r\n const productAvailableQuantity = props.data.productAvailableQuantity?.result ? props.data.productAvailableQuantity?.result : productDetails?.productAvailableQuantity!;\r\n\r\n const {\r\n quantity,\r\n errorState: {\r\n configureErrors,\r\n quantityError,\r\n customAmountError,\r\n otherError,\r\n errorHost\r\n },\r\n selectedProduct,\r\n isUpdatingDimension,\r\n isUpdatingDeliveryOptions,\r\n isServiceItem,\r\n keyInPriceAmount\r\n } = state;\r\n\r\n const productAvailability = state.productAvailableQuantity ? state.productAvailableQuantity.ProductAvailableQuantity : (productAvailableQuantity && productAvailableQuantity.length > 0 ? productAvailableQuantity[0].ProductAvailableQuantity : undefined);\r\n\r\n const onAddToCartFailed = (result: IAddToCartFailureResult) => {\r\n let quantityErrorForState: string | undefined;\r\n let customAmountErrorForState: string | undefined;\r\n let otherErrorForState: string | undefined = getGenericError(result, cart, resources, context, product, productAvailability, undefined);\r\n\r\n if (result.failureReason === 'OUTOFSTOCK') {\r\n quantityErrorForState = result.failureReason === 'OUTOFSTOCK' ? getQuantityError(result.stockLeft, resources) : undefined;\r\n } else if (result.failureReason === 'CARTACTIONFAILED' &&\r\n result.cartActionResult &&\r\n (result.cartActionResult.substatus === 'MAXQUANTITY' || result.cartActionResult.substatus === 'QUANTITYLIMITS')) {\r\n quantityErrorForState = getGenericError(result, cart, resources, context, product, productAvailability, undefined);\r\n otherErrorForState = undefined; // Prevent error duplication in otherError and quantityError\r\n }\r\n\r\n if (result.failureReason === 'INVALIDCUSTOMAMOUNT') {\r\n if (keyInPriceAmount === undefined || keyInPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice)) {\r\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(minimumKeyInPrice || defaultMinimumKeyInPrice);\r\n customAmountErrorForState = resources.invalidSmallCustomAmountText.replace('{minAmount}', formatedAmountLimit);\r\n } else if (keyInPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice)) {\r\n const formatedAmountLimit = props.context.cultureFormatter.formatCurrency(maximumKeyInPrice || defaultMaximumKeyInPrice);\r\n customAmountErrorForState = resources.invalidLargeCustomAmountText.replace('{maxAmount}', formatedAmountLimit);\r\n }\r\n }\r\n\r\n callbacks.updateErrorState({\r\n errorHost: 'ADDTOCART',\r\n quantityError: quantityErrorForState,\r\n configureErrors: result.failureReason === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {},\r\n customAmountError: customAmountErrorForState,\r\n otherError: otherErrorForState\r\n });\r\n };\r\n\r\n const dialogStrings: IAddToCartResources = {\r\n goToCartText: resources.buyBoxGoToCartText,\r\n continueShoppingText: resources.buyBoxContinueShoppingText,\r\n closeNotificationLabel: resources.closeNotificationLabel,\r\n headerItemOneText: resources.buyBoxSingleItemText,\r\n headerItemFormatText: resources.buyBoxMultiLineItemFormatText,\r\n headerMessageText: resources.buyBoxHeaderMessageText,\r\n freePriceText: resources.priceFree,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n addedQuantityText: resources.addedQuantityText\r\n };\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n const isLoading = typeName !== 'quickview' && props.data.productAvailableQuantity.status === 'LOADING';\r\n if (isLoading) {\r\n callbacks.changeUpdatingDimension(false);\r\n }\r\n\r\n const isLoadingDeliveryOptions = typeName !== 'quickview' && props.data.deliveryOptions?.status === 'LOADING';\r\n if (isLoadingDeliveryOptions && callbacks.changeUpdatingDeliveryOptions) {\r\n callbacks.changeUpdatingDeliveryOptions(false);\r\n }\r\n\r\n telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.typeName, props.telemetry);\r\n\r\n // Check if the product delivery mode is electronic\r\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n const deliveryOptions = props.data.deliveryOptions?.result;\r\n const isEmailDelivery = ArrayExtensions.hasElements(deliveryOptions?.DeliveryOptions) && deliveryOptions!.DeliveryOptions[0].Code === emailDeliveryModeCode;\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n const onItemAddedToCart = (result: ICartActionResult) => {\r\n if (typeName === 'quickview') {\r\n callbacks.changeModalOpen(false);\r\n }\r\n };\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__add-to-cart-container`\r\n },\r\n button: product && (\r\n \r\n ),\r\n errorBlock: (\r\n \r\n )\r\n };\r\n}\r\n\r\nexport function getBuyboxProductPrice(props: IBuyboxExtentedProps, state: IBuyboxState): React.ReactElement | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n resources\r\n } = props;\r\n\r\n return state.productPrice && (\r\n \r\n );\r\n}\r\n\r\nexport function getBuyboxProductRating(props: IBuyboxExtentedProps, productDetails?: IProductDetails): React.ReactElement | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n resources\r\n } = props;\r\n\r\n const ratingsSummary = props.data.ratingsSummary?.result ? props.data.ratingsSummary?.result : productDetails?.ratingsSummary!;\r\n\r\n const ratingComponent = ratingsSummary && ratingsSummary.averageRating && (\r\n \r\n ) || undefined;\r\n\r\n return ratingsSummary && ratingComponent && (\r\n ratingComponent\r\n );\r\n}\r\n\r\nfunction generateAddToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IAddToOrderTemplateDialogResources {\r\n return {\r\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\r\n\r\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\r\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\r\n\r\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\r\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\r\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\r\n\r\n selectTemplatesText: resources.selectTemplatesText,\r\n addToTemplateButtonText: resources.addToTemplateButtonText,\r\n lineItemsText: resources.lineItemsText\r\n };\r\n}\r\n\r\nfunction generateOrderTemplateNameDialogResources(resources: IBuyboxCommonResources): IOrderTemplateNameDialogResources {\r\n return {\r\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\r\n orderTemplateTitleLabel: resources.orderTemplateTitle,\r\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\r\n orderTemplateDescription: resources.createOrderTemplateDescription,\r\n\r\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n}\r\n\r\nfunction generateItemAddedToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IItemAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\r\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\r\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\r\n freePriceText: resources.priceFree,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n}\r\n\r\nfunction generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: IBuyboxCommonResources): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\r\n return {\r\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\r\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\r\n updateQuantityButtonText: resources.updateQuantityButtonText,\r\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\r\n };\r\n}\r\n\r\nexport function getBuyboxProductAddToOrderTemplate(props: IBuyboxExtentedProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxAddToOrderTemplateViewProps | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n product: { result: product },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n errorState: {\r\n configureErrors,\r\n quantityError,\r\n customAmountError,\r\n otherError,\r\n errorHost\r\n },\r\n quantity\r\n } = state;\r\n\r\n // If custom amount is selected, add-to-orderTemplate is disabled\r\n if (state.isCustomPriceSelected) {\r\n return undefined;\r\n }\r\n const className = _getClassNamePrefix(typeName);\r\n const onAddToOrderTemplateFailed = (result: IOrderTemplateActionErrorResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'ORDER_TEMPLATE',\r\n configureErrors: result.status === 'MISSING_DIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n };\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__add-to-order-template-container`\r\n },\r\n button: product && orderTemplates && (\r\n \r\n ),\r\n errorBlock: (\r\n \r\n )\r\n };\r\n}\r\n\r\nexport function getBuyboxProductAddToWishlist(props: IBuyboxExtentedProps, state: IBuyboxState, callbacks: IBuyboxCallbacks, productDetails?: IProductDetails): IBuyboxAddToWishlistViewProps | undefined {\r\n const {\r\n id,\r\n typeName,\r\n context,\r\n data: {\r\n wishlists: { result: wishlists }\r\n },\r\n resources\r\n } = props;\r\n\r\n const product = props.data.product?.result ? props.data.product?.result : productDetails?.product!;\r\n\r\n const\r\n {\r\n errorState: {\r\n configureErrors,\r\n quantityError,\r\n customAmountError,\r\n otherError,\r\n errorHost\r\n },\r\n selectedProduct\r\n } = state;\r\n\r\n // If custom amount is selected, add-to-wishlist is disabled\r\n if (state.isCustomPriceSelected) {\r\n return undefined;\r\n }\r\n\r\n const onAddToWishlistFailed = (result: IWishlistActionErrorResult) => {\r\n callbacks.updateErrorState({\r\n errorHost: 'WISHLIST',\r\n configureErrors: result.status === 'MISSINGDIMENSION' ? getConfigureErrors(result.missingDimensions, resources, product?.IsGiftCard) : {}\r\n });\r\n };\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__add-to-wishlist-container`\r\n },\r\n button: product && (\r\n \r\n ),\r\n errorBlock: (\r\n \r\n )\r\n };\r\n}\r\n\r\nexport function getBuyboxProductQuantity(props: IBuyboxExtentedProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxProductQuantityViewProps {\r\n const {\r\n resources,\r\n typeName\r\n } = props;\r\n\r\n const\r\n {\r\n quantity,\r\n max,\r\n errorState: {\r\n quantityError\r\n }\r\n } = state;\r\n\r\n const onChange = (newValue: number) => {\r\n if (callbacks.updateQuantity) {\r\n callbacks.updateQuantity(newValue);\r\n }\r\n };\r\n const className = _getClassNamePrefix(typeName);\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__quantity`\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: `${className}__product-quantity-label`,\r\n htmlFor: `${className}__product-quantity-input`\r\n },\r\n heading: (\r\n
\r\n {resources.productQuantityHeading}\r\n
\r\n ),\r\n errors: quantityError && (\r\n \r\n \r\n ),\r\n input: (\r\n \r\n )\r\n };\r\n}\r\n\r\nexport function getBuyboxShopSimilarButton(props: IBuyboxExtentedProps, buttonType: ShopSimiliarButtonType): IBuyboxShopSimilarLookViewProps {\r\n const {\r\n resources,\r\n context,\r\n data: {\r\n product: { result: product }\r\n },\r\n typeName\r\n } = props;\r\n\r\n const className = _getClassNamePrefix(typeName);\r\n const navigationUrl = (shopSimiliarButtonType: ShopSimiliarButtonType) => () => {\r\n const searchURL = getUrlSync('search', context && context.actionContext);\r\n const separator = searchURL!.includes('?') ? '&' : '?';\r\n document.location.href = `${searchURL}${separator}productId=${product && product.RecordId}&recommendation=${shopSimiliarButtonType}`;\r\n };\r\n const telemetryText = buttonType === ShopSimiliarButtonType.Looks ? TelemetryConstant.ShopSimliarLooks : TelemetryConstant.ShopSimliarDescription;\r\n const payLoad = getPayloadObject('click', telemetryContent, telemetryText);\r\n const attribute = getTelemetryAttributes(telemetryContent, payLoad);\r\n const text = buttonType === ShopSimiliarButtonType.Looks ? resources.shopSimilarLooksText : resources.shopSimilarDescriptionText;\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__shopsimilar${buttonType}`\r\n },\r\n input: (\r\n \r\n {text}\r\n \r\n )\r\n };\r\n}\r\n\r\nexport function getBuyboxKeyInPrice(props: IBuyboxExtentedProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): IBuyboxKeyInPriceViewProps {\r\n const {\r\n config,\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n errorState: { }\r\n } = state;\r\n\r\n const className = _getClassNamePrefix(props.typeName);\r\n const onChange = (e: React.ChangeEvent) => {\r\n const value = e.currentTarget.value;\r\n callbacks.updateKeyInPrice(value.length > 0 ? Number(value) : Number.parseFloat(value));\r\n };\r\n\r\n return {\r\n ContainerProps: {\r\n className: `${className}__key_in_price`\r\n },\r\n LabelContainerProps: {\r\n tag: 'label',\r\n className: `${className}__key_in_price-label`,\r\n htmlFor: `${className}__key_in_price`\r\n },\r\n heading: (\r\n
\r\n {resources.buyboxKeyInPriceLabelHeading}\r\n
\r\n ),\r\n input: (\r\n \r\n )\r\n };\r\n\r\n}\r\n\r\nexport const BuyboxErrorBlock: React.FC = ({ showError, configureErrors, quantityError, customAmountError, otherError, resources }) => {\r\n let errorMessages: (string | undefined)[] = [];\r\n\r\n errorMessages = Object.values(configureErrors).filter(message => message !== undefined);\r\n\r\n if (quantityError) {\r\n errorMessages.push(quantityError);\r\n }\r\n\r\n if (customAmountError) {\r\n errorMessages.push(customAmountError);\r\n }\r\n\r\n if (otherError) {\r\n errorMessages.push(otherError);\r\n }\r\n\r\n return (\r\n 0} color='danger' assertive\r\n aria-label={resources.buyboxErrorMessageHeader} >\r\n \r\n {errorMessages.map((message, index) => {\r\n return (\r\n
\r\n {message}\r\n
\r\n );\r\n })}\r\n \r\n );\r\n};\r\n\r\nexport function getQuantityLimitsMessages(props: IBuyboxExtentedProps, state: IBuyboxState): React.ReactElement | undefined {\r\n const {\r\n resources\r\n } = props;\r\n\r\n const\r\n {\r\n min,\r\n max\r\n } = state;\r\n\r\n if (!_isOrderQuantityLimitsFeatureEnabled(props)) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n \r\n {_renderMaxLabel(max, resources.maxQuantityText)}\r\n {_renderMinLabel(min, resources.minQuantityText)}\r\n \r\n );\r\n}\r\n\r\nexport const RetailDefaultOrderQuantityLimitsFeatureName: string = 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature';\r\n\r\nconst _renderMaxLabel = (max: number | undefined, maxQuantityText: string, typeName?: string): React.ReactElement | undefined => {\r\n const className = _getClassNamePrefix(typeName ? typeName : '');\r\n if (max && max !== 0 && max !== Number.MAX_VALUE) {\r\n return (\r\n

\r\n {maxQuantityText.replace('{max}', max.toString())}\r\n

\r\n );\r\n }\r\n return undefined;\r\n\r\n};\r\n\r\nconst _renderMinLabel = (min: number | undefined, minQuantityText: string, typeName?: string): JSX.Element | undefined => {\r\n const className = _getClassNamePrefix(typeName ? typeName : '');\r\n if (min && min > 1) {\r\n return (\r\n

\r\n {minQuantityText.replace('{min}', min.toString())}\r\n

\r\n );\r\n }\r\n return undefined;\r\n\r\n};\r\n\r\nconst _isOrderQuantityLimitsFeatureEnabled = (props: IBuyboxExtentedProps): boolean | undefined => {\r\n const isFeatureEnabledInHq = props.data.featureState.result\r\n ?.find(featureState => featureState.Name === RetailDefaultOrderQuantityLimitsFeatureName)?.IsEnabled;\r\n if (!isFeatureEnabledInHq) {\r\n return false;\r\n }\r\n const defaultOrderQuantityLimitsFeatureConfig = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n\r\n const customerInfo = props.data.customerInformation.result;\r\n return customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\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 { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { DeliveryOption, FeatureState, ProductDimension } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, DeliveryMode, IProductInventoryInformation, isAggregatedInventory } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Heading, INodeProps, IPopupProps, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { BuyboxErrorBlock } from '../common/buybox-components';\r\nimport { IBuyboxCallbacks, IBuyboxState } from '../common/buyboxInterface';\r\nimport { getConfigureErrors } from '../common/utilities/error-utilities';\r\nimport { IFarmlandsBuyboxData } from '../farmlands-buybox.data';\r\nimport { IFarmlandsBuyboxProps, IFarmlandsBuyboxResources } from '../farmlands-buybox.props.autogenerated';\r\n\r\n/**\r\n * FindinStore failure Interface.\r\n */\r\nexport interface IFindInStoreFailureResult {\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * BuyBoxFindinStore View Props Interface.\r\n */\r\nexport interface IBuyboxFindInStoreViewProps {\r\n storeSelector?: React.ReactNode;\r\n heading?: React.ReactNode;\r\n description?: React.ReactNode;\r\n errors?: React.ReactNode;\r\n button?: React.ReactNode;\r\n productPickupOptionList?: React.ReactNode;\r\n\r\n modal?: React.ReactNode;\r\n\r\n ContainerProps: INodeProps;\r\n\r\n openFindInStoreDialog(): Promise;\r\n}\r\n\r\n/**\r\n * Inventory settings based on the inventory policy for aggregated availability.\r\n */\r\ninterface IInventorySettingsProps {\r\n isSectionDisabled: boolean;\r\n description: string;\r\n buttonText: string;\r\n}\r\n\r\n/**\r\n * The function defines the settings values for a given inventory configuration.\r\n * @param context - The context.\r\n * @param isStockCheck - Flag to enable inventory validation.\r\n * @param productAvailability - The product inventory information.\r\n * @param buyboxResources - The buybox string resources.\r\n * @returns Boolean.\r\n */\r\nfunction getFindInStoreInventorySettings(\r\n context: ICoreContext,\r\n isStockCheck: boolean,\r\n productAvailability: IProductInventoryInformation[] | undefined,\r\n buyboxResources: IFarmlandsBuyboxResources): IInventorySettingsProps {\r\n\r\n // If shouldValidateAggregation is true then is required to check for the product inventory, based on this the messaging will change\r\n // and the find in store button will be enabled or disabled\r\n\r\n let isSectionDisabled: boolean;\r\n let buttonText; let description: string;\r\n\r\n let pickupInventory: IProductInventoryInformation | undefined;\r\n if (productAvailability) {\r\n pickupInventory = productAvailability.find(pickup => pickup.deliveryType === DeliveryMode.pickup);\r\n }\r\n\r\n if (isAggregatedInventory(context.actionContext) && isStockCheck) {\r\n if (!productAvailability || (pickupInventory?.IsProductAvailable)) {\r\n isSectionDisabled = false;\r\n buttonText = buyboxResources.findInStoreLinkText;\r\n description = buyboxResources.findInStoreDescriptionText;\r\n } else {\r\n isSectionDisabled = true;\r\n buttonText = buyboxResources.findInStoreNotAvailableTextButton;\r\n description = buyboxResources.findInStoreNotAvailableDescription;\r\n }\r\n\r\n } else {\r\n isSectionDisabled = false;\r\n buttonText = buyboxResources.findInStoreLinkText;\r\n description = buyboxResources.findInStoreDescriptionText;\r\n }\r\n\r\n return {\r\n isSectionDisabled,\r\n description,\r\n buttonText\r\n };\r\n}\r\n\r\n/**\r\n * Method to check if we have atleast one common delivery code between product and channel.\r\n * @param productdeliveryOptions - Product DeliveryOption List.\r\n * @param storePickUpOptionList - Channel DeliveryOption List.\r\n * @returns Boolean flag.\r\n */\r\nconst matchDeliveryOptions = (productdeliveryOptions: DeliveryOption[] | undefined, storePickUpOptionList: string[] | undefined): boolean => {\r\n const deliveryOption: string[] = [];\r\n productdeliveryOptions?.map(delivery => {\r\n const pickup = (storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code));\r\n if (pickup) {\r\n deliveryOption.push(pickup);\r\n }\r\n return deliveryOption;\r\n });\r\n\r\n return ArrayExtensions.hasElements(deliveryOption);\r\n};\r\n\r\nexport function getBuyboxFindInStore(\r\n props: IFarmlandsBuyboxProps,\r\n // @ts-ignore\r\n state: IBuyboxState,\r\n callbacks: IBuyboxCallbacks): IBuyboxFindInStoreViewProps | undefined {\r\n const {\r\n data,\r\n slots: {\r\n storeSelector\r\n },\r\n resources: {\r\n priceFree,\r\n originalPriceText,\r\n currentPriceText,\r\n findInStoreHeaderText,\r\n buyBoxGoToCartText,\r\n buyBoxContinueShoppingText,\r\n closeNotificationLabel,\r\n buyBoxSingleItemText,\r\n buyBoxMultiLineItemFormatText,\r\n buyBoxHeaderMessageText,\r\n descriptionTextToShowAllPickupOptions\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n }\r\n } = props;\r\n\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const product = data?.product?.result;\r\n const price = data?.productPrice?.result;\r\n const storeSelectorStateManager = data?.storeSelectorStateManager?.result;\r\n const cart = data?.cart?.result;\r\n const deliveryOptions = data?.deliveryOptions?.result;\r\n const productAvailability = data.productAvailableQuantity?.result;\r\n const retailMulitplePickupMFeatureState = data?.featureState?.result\r\n ?.find((featureState: FeatureState) => featureState.Name === multiplePickupStoreSwitchName)?.IsEnabled;\r\n const channelDeliveryOptionConfig = data?.channelDeliveryOptionConfig?.result;\r\n\r\n const\r\n {\r\n errorState: {\r\n configureErrors,\r\n quantityError,\r\n otherError,\r\n errorHost\r\n },\r\n modalOpen,\r\n quantity\r\n } = state;\r\n\r\n const onClick = async () => findInStoreOnClick(props, state, callbacks);\r\n\r\n const { isSectionDisabled, buttonText, description } = getFindInStoreInventorySettings(\r\n props.context,\r\n props.context.app.config.enableStockCheck,\r\n productAvailability,\r\n props.resources);\r\n\r\n if (!product ||\r\n !storeSelectorStateManager ||\r\n !ArrayExtensions.hasElements(storeSelector)) {\r\n return undefined;\r\n }\r\n\r\n if (!deliveryOptions ||\r\n !deliveryOptions.DeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (retailMulitplePickupMFeatureState && channelDeliveryOptionConfig) {\r\n if (!matchDeliveryOptions(deliveryOptions.DeliveryOptions, channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\r\n return undefined;\r\n }\r\n } else if (!PickupDeliveryModeCode || !deliveryOptions.DeliveryOptions.find((option: DeliveryOption) => option.Code === PickupDeliveryModeCode)) {\r\n return undefined;\r\n }\r\n\r\n const dialogStrings = {\r\n goToCartText: buyBoxGoToCartText,\r\n continueShoppingText: buyBoxContinueShoppingText,\r\n closeNotificationLabel,\r\n headerItemOneText: buyBoxSingleItemText,\r\n headerItemFormatText: buyBoxMultiLineItemFormatText,\r\n headerMessageText: buyBoxHeaderMessageText,\r\n freePriceText: priceFree,\r\n originalPriceText,\r\n currentPriceText\r\n };\r\n\r\n const priceComponent = price ? (\r\n ) : '';\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=240&h=240&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=240&h=240&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'ms-buybox',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: props.data.product?.result, price: props.data.productPrice?.result },\r\n dialogStrings,\r\n imageSettings: defaultImageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: quantity,\r\n priceComponent,\r\n navigationUrl: getUrlSync('cart', props.context.actionContext),\r\n modalOpen,\r\n setModalOpen: callbacks.changeModalOpen\r\n };\r\n const renderModalPopup = ;\r\n\r\n return {\r\n ContainerProps: {\r\n className: 'ms-buybox__find-in-store'\r\n },\r\n\r\n storeSelector: storeSelector[0],\r\n\r\n openFindInStoreDialog: onClick,\r\n\r\n heading: (\r\n \r\n ),\r\n\r\n description: (\r\n

\r\n {description}\r\n

\r\n ),\r\n productPickupOptionList: retailMulitplePickupMFeatureState && !isSectionDisabled ? (\r\n <>\r\n

\r\n {descriptionTextToShowAllPickupOptions}\r\n

\r\n
    \r\n {deliveryOptions.DeliveryOptions.map((item: DeliveryOption) => {\r\n return (
  • \r\n {item.Description}\r\n
  • );\r\n })}\r\n
\r\n \r\n ) : null,\r\n errors: (\r\n \r\n ),\r\n\r\n button: (\r\n \r\n {buttonText}\r\n \r\n ),\r\n\r\n modal: renderModalPopup\r\n };\r\n}\r\n\r\nasync function findInStoreOnClick(props: IFarmlandsBuyboxProps, state: IBuyboxState, callbacks: IBuyboxCallbacks): Promise {\r\n const {\r\n data: {\r\n storeSelectorStateManager: { result: storeSelectorStateManager }\r\n },\r\n resources,\r\n modules\r\n } = props;\r\n\r\n const {\r\n selectedProduct\r\n } = state;\r\n\r\n let dataProduct = props.data.product.result;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const retailMulitplePickupMFeatureState = props.data?.featureState?.result\r\n ?.find((featureState: FeatureState) => featureState.Name === multiplePickupStoreSwitchName)?.IsEnabled;\r\n\r\n if (selectedProduct) {\r\n dataProduct = (await selectedProduct) || dataProduct;\r\n }\r\n\r\n if (!dataProduct || !storeSelectorStateManager) {\r\n return;\r\n }\r\n\r\n const product = dataProduct;\r\n\r\n const missingDimensions = product.Dimensions && product.Dimensions.filter((dimension: ProductDimension) => !(dimension.DimensionValue && dimension.DimensionValue.Value));\r\n\r\n let storeSelectorId: string = '';\r\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\r\n storeSelectorId = modules.storeSelector[0].id;\r\n }\r\n\r\n if (missingDimensions && missingDimensions.length > 0) {\r\n if (callbacks.updateErrorState) {\r\n callbacks.updateErrorState(\r\n {\r\n errorHost: 'FINDINSTORE',\r\n // @ts-ignore\r\n configureErrors: getConfigureErrors(missingDimensions, resources)\r\n }\r\n );\r\n }\r\n } else {\r\n storeSelectorStateManager.openDialog({\r\n product,\r\n id: storeSelectorId,\r\n deliveryOptions: retailMulitplePickupMFeatureState ? props.data.deliveryOptions.result : undefined,\r\n onLocationSelected: () => {\r\n return Promise.resolve();\r\n }\r\n }).catch((error: Error) => {\r\n if (props.telemetry) {\r\n props.telemetry.error(error.message);\r\n props.telemetry.debug('Unable to find in store');\r\n }\r\n });\r\n }\r\n}\r\n","import {\r\n getDeliveryOptionsForSelectedVariant,\r\n GetDeliveryOptionsForSelectedVariantInput,\r\n getDimensionsForSelectedVariant,\r\n GetDimensionsForSelectedVariantInput,\r\n getPriceForSelectedVariant,\r\n getProductAvailabilitiesForSelectedVariant,\r\n getSelectedVariant,\r\n IProductInventoryInformation,\r\n PriceForSelectedVariantInput,\r\n ProductAvailabilitiesForSelectedVariantInput,\r\n SelectedVariantInput,\r\n // add import\r\n FinitePromiseQueue, IPromiseQueue, FinitePromiseQueueError\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n ProductDeliveryOptions,\r\n ProductDimensionValue,\r\n ProductPrice,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { IFarmlandsBuyboxProps, IFarmlandsBuyboxResources } from './farmlands-buybox.props.autogenerated';\r\nimport { IFarmlandsBuyboxData } from './farmlands-buybox.data';\r\nimport {\r\n getBuyboxAddToCart,\r\n getBuyBoxInventoryLabel,\r\n getBuyboxProductAddToWishlist,\r\n getBuyboxProductConfigure,\r\n getBuyboxProductDescription,\r\n getBuyboxProductPrice,\r\n getBuyboxProductQuantity,\r\n getBuyboxProductRating,\r\n getBuyboxProductTitle,\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxAddToWishlistViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from './components';\r\nimport { getContactDetailsAsync } from '../../actions/farmlands-get-contact-details-calls.action';\r\nimport {\r\n isShareholder,\r\n isShareholderAccountNotOnHold,\r\n isShareholderAccountNotInactive,\r\n isShareholderAccountInactive,\r\n hasEcommerceAccess\r\n} from '../../common/method/functions';\r\nimport {\r\n getBuyboxFindInStore,\r\n IBuyboxFindInStoreViewProps\r\n} from './components/buybox-find-in-store';\r\nimport {getEstimatedAvailabilityAsync} from \"@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g\";\r\n\r\nexport declare type IBuyboxErrorHost = 'ADDTOCART' | 'FINDINSTORE' | 'WISHLIST';\r\n\r\nexport interface IErrorState {\r\n errorHost?: IBuyboxErrorHost;\r\n\r\n configureErrors: { [configureId: string]: string | undefined };\r\n quantityError?: string;\r\n otherError?: string;\r\n}\r\n\r\nexport interface IBuyboxCallbacks {\r\n updateQuantity(newQuantity: number): void;\r\n updateErrorState(newErrorState: IErrorState): void;\r\n updateSelectedProduct(\r\n selectedProduct: Promise,\r\n newInventory: IProductInventoryInformation | undefined,\r\n newPrice: ProductPrice | undefined,\r\n newDeliveryOptions: ProductDeliveryOptions | undefined\r\n ): void;\r\n getDropdownName(dimensionType: number, resources: IFarmlandsBuyboxResources): string;\r\n dimensionSelectedAsync(selectedDimensionId: number, selectedDimensionValueId: string): Promise;\r\n changeModalOpen(isModalOpen: boolean): void;\r\n changeUpdatingDimension(isUpdatingDimension: boolean): void;\r\n}\r\n\r\nexport interface IBuyboxState {\r\n quantity: number;\r\n errorState: IErrorState;\r\n selectedDimensions: { [id: number]: string | undefined };\r\n selectedProduct?: Promise;\r\n productAvailableQuantity?: IProductInventoryInformation;\r\n productPrice?: ProductPrice;\r\n productDeliveryOptions?: ProductDeliveryOptions;\r\n modalOpen?: boolean;\r\n hasEcomPermission?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isCartEmpty: boolean;\r\n disableAddToCartButton: boolean;\r\n}\r\n\r\nexport interface IBuyboxViewProps extends IFarmlandsBuyboxProps {\r\n state: IBuyboxState;\r\n\r\n ModuleProps: IModuleProps;\r\n ProductInfoContainerProps: INodeProps;\r\n MediaGalleryContainerProps: INodeProps;\r\n\r\n callbacks: IBuyboxCallbacks;\r\n\r\n mediaGallery?: React.ReactNode;\r\n contentBlock?: React.ReactNode;\r\n\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n rating?: React.ReactNode;\r\n price?: React.ReactNode;\r\n addToWishlist?: IBuyboxAddToWishlistViewProps | null;\r\n\r\n addToCart: IBuyboxAddToCartViewProps | null;\r\n findInStore?: IBuyboxFindInStoreViewProps;\r\n quantity?: IBuyboxProductQuantityViewProps;\r\n configure?: IBuyboxProductConfigureViewProps;\r\n inventoryLabel?: React.ReactNode;\r\n\r\n deliveryBlock?: any;\r\n clickCollectBlock?: any;\r\n}\r\n\r\n/**\r\n * Buybox Module\r\n */\r\nclass Buybox extends React.PureComponent, IBuyboxState> {\r\n /**\r\n * A queue of tasks of processing the changes in the dimensions.\r\n * Limit to two processes:\r\n * 1 - for the current process, which is under execution at the moment.\r\n * 2 - next process, which will process the latest version of data.\r\n * @remark Enqueueing new promises will discard the previous ones (except the one which is under processing).\r\n */\r\n private dimensionUpdateQueue: IPromiseQueue = new FinitePromiseQueue(2);\r\n private dimensions: { [id: number]: string } = {};\r\n\r\n\r\n private buyboxCallbacks: IBuyboxCallbacks = {\r\n updateQuantity: (newQuantity: number): void => {\r\n const errorState = { ...this.state.errorState };\r\n errorState.quantityError = undefined;\r\n errorState.otherError = undefined;\r\n\r\n this.setState({ quantity: newQuantity, errorState: errorState });\r\n },\r\n updateErrorState: (newErrorState: IErrorState): void => {\r\n this.setState({ errorState: newErrorState });\r\n },\r\n updateSelectedProduct: (\r\n newSelectedProduct: Promise,\r\n newInventory: IProductInventoryInformation | undefined,\r\n newPrice: ProductPrice | undefined,\r\n newDeliveryOptions: ProductDeliveryOptions | undefined\r\n ): void => {\r\n this.setState({\r\n selectedProduct: newSelectedProduct,\r\n productAvailableQuantity: newInventory,\r\n productPrice: newPrice,\r\n productDeliveryOptions: newDeliveryOptions\r\n });\r\n },\r\n\r\n // Update this callback to use queue\r\n dimensionSelectedAsync: (selectedDimensionId: number, selectedDimensionValueId: string): Promise => {\r\n const newSelectedDimensions: { [id: number]: string | undefined } = { ...this.state.selectedDimensions };\r\n newSelectedDimensions[selectedDimensionId] = selectedDimensionValueId;\r\n this.setState({ selectedDimensions: newSelectedDimensions });\r\n\r\n this.dimensions[selectedDimensionId] = selectedDimensionValueId;\r\n return this.dimensionUpdateQueue.enqueue(() => {\r\n return this._updateDimensions();\r\n }).catch((reason) => {\r\n // Ignore discarded processes.\r\n if (reason !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\r\n throw reason;\r\n }\r\n });\r\n },\r\n getDropdownName: (dimensionType: number, resources: IFarmlandsBuyboxResources): string => {\r\n return this._getDropdownName(dimensionType, resources);\r\n },\r\n changeModalOpen: (isModalOpen: boolean): void => {\r\n this.setState({ modalOpen: isModalOpen });\r\n },\r\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\r\n this.setState({ isUpdatingDimension: isUpdatingDimension });\r\n }\r\n };\r\n\r\n constructor(props: IFarmlandsBuyboxProps, state: IBuyboxState) {\r\n super(props);\r\n this.state = {\r\n errorState: {\r\n configureErrors: {}\r\n },\r\n quantity: 1,\r\n selectedProduct: undefined,\r\n selectedDimensions: {},\r\n productPrice: undefined,\r\n productDeliveryOptions: undefined,\r\n hasEcomPermission: false,\r\n\r\n modalOpen: false,\r\n isUpdatingDimension: false,\r\n isCartEmpty: false,\r\n disableAddToCartButton: false\r\n };\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const cartLine = (await this.props.data.cart).cart.CartLines;\r\n // check if the logged-in user has ecomm purchase rights\r\n if (this.props.context.request.user.token) {\r\n const userContactDetails = await getContactDetailsAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n JSON.parse(atob(this.props.context.request.user.token.split('.')[1])).oid\r\n );\r\n if (hasEcommerceAccess(userContactDetails)) {\r\n this.setState({\r\n hasEcomPermission: true\r\n });\r\n }\r\n } else {\r\n this.setState({ hasEcomPermission: true });\r\n }\r\n if (cartLine && cartLine.length > 0) {\r\n this.setState({ isCartEmpty: true });\r\n }\r\n\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n slots: { mediaGallery, contentBlock },\r\n data: {\r\n cart: { result: cart },\r\n product: { result: product }\r\n },\r\n config: {\r\n className = '',\r\n deliveryAvaliableIcon,\r\n clickCollectAvaliableIcon\r\n }\r\n } = this.props;\r\n if (!product) {\r\n this.props.context.telemetry.error('Product content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n this._checkAddToCartDisable(this.props);\r\n\r\n const hideAddToCartButton = cart?.cart.ExtensionProperties\r\n ? isShareholder(cart?.cart) &&\r\n (!isShareholderAccountNotOnHold(cart.cart.ExtensionProperties) ||\r\n (!isShareholderAccountNotInactive(cart.cart.ExtensionProperties) &&\r\n !isShareholderAccountInactive(cart.cart.ExtensionProperties)))\r\n : true;\r\n\r\n const viewProps: IBuyboxViewProps = {\r\n ...(this.props as IFarmlandsBuyboxProps),\r\n state: this.state,\r\n mediaGallery: mediaGallery && mediaGallery.length > 0 ? mediaGallery[0] : undefined,\r\n contentBlock: contentBlock && contentBlock.length > 0 ? contentBlock[0] : undefined,\r\n ModuleProps: {\r\n moduleProps: this.props,\r\n className: classnames('ms-buybox', className)\r\n },\r\n ProductInfoContainerProps: {\r\n className: 'ms-buybox__content'\r\n },\r\n MediaGalleryContainerProps: {\r\n className: 'ms-buybox__media-gallery'\r\n },\r\n callbacks: this.buyboxCallbacks,\r\n title: getBuyboxProductTitle(this.props),\r\n description: getBuyboxProductDescription(this.props),\r\n configure: getBuyboxProductConfigure(this.props, this.state, this.buyboxCallbacks),\r\n // @ts-ignore\r\n findInStore: getBuyboxFindInStore(this.props, this.state, this.buyboxCallbacks),\r\n price: getBuyboxProductPrice(this.props),\r\n addToCart:\r\n this.state.hasEcomPermission && !hideAddToCartButton\r\n ? getBuyboxAddToCart(this.props, this.state, this.buyboxCallbacks)\r\n : null,\r\n addToWishlist:\r\n this.state.hasEcomPermission && !hideAddToCartButton\r\n ? getBuyboxProductAddToWishlist(this.props, this.state, this.buyboxCallbacks)\r\n : null,\r\n rating: !this.props.context.app.config.hideRating && getBuyboxProductRating(this.props),\r\n quantity: getBuyboxProductQuantity(this.props, this.state, this.buyboxCallbacks),\r\n inventoryLabel: getBuyBoxInventoryLabel(this.props),\r\n deliveryBlock: deliveryAvaliableIcon,\r\n clickCollectBlock: clickCollectAvaliableIcon\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n // Update _dimensionSelected to _updateDimensions\r\n // tslint:disable-next-line:max-func-body-length\r\n private _updateDimensions = async (): Promise => {\r\n const {\r\n data: {\r\n product: { result: product },\r\n productDimensions: { result: productDimensions }\r\n },\r\n context: {\r\n actionContext,\r\n request: {\r\n apiSettings: { channelId }\r\n }\r\n }\r\n } = this.props;\r\n // const { selectedDimensions } = this.state;\r\n\r\n if (!product || !productDimensions) {\r\n return;\r\n }\r\n\r\n const dimensionsToUpdate: { [id: number]: string } = { ...this.dimensions };\r\n this.setState({ isUpdatingDimension: true });\r\n\r\n // // Step 1: Update state to indicate which dimensions are selected\r\n // const newSelectedDimensions: { [id: number]: string | undefined } = { ...selectedDimensions };\r\n // newSelectedDimensions[selectedDimensionId] = selectedDimensionValueId;\r\n // this.setState({ selectedDimensions: newSelectedDimensions });\r\n\r\n // Step 2: Clear any errors indicating the dimension wasn't selected\r\n // if (this.state.errorState.otherError) {\r\n // const clearOtherErrorState = {...this.state.errorState};\r\n // clearOtherErrorState.otherError = undefined;\r\n // this.setState({errorState: clearOtherErrorState});\r\n // }\r\n\r\n for (const key of Object.keys(dimensionsToUpdate)) {\r\n if (this.state.errorState.configureErrors[key]) {\r\n const errorState = { ...this.state.errorState };\r\n errorState.configureErrors[key] = undefined;\r\n\r\n this.setState({ errorState: errorState });\r\n }\r\n }\r\n\r\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\r\n // over the information in data\r\n const mappedDimensions = productDimensions\r\n .map((dimension) => {\r\n return {\r\n DimensionTypeValue: dimension.DimensionTypeValue,\r\n DimensionValue: this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) || dimension.DimensionValue,\r\n ExtensionProperties: dimension.ExtensionProperties\r\n };\r\n })\r\n .filter((dimension) => {\r\n return dimension && dimension.DimensionValue;\r\n });\r\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\r\n // so that places like add to cart can await it\r\n const selectedProduct = new Promise(async (resolve, reject) => {\r\n const newProduct = await getSelectedVariant(\r\n new SelectedVariantInput(\r\n product.MasterProductId ? product.MasterProductId : product.RecordId,\r\n channelId,\r\n mappedDimensions\r\n ),\r\n actionContext\r\n );\r\n if (newProduct) {\r\n await getDimensionsForSelectedVariant(\r\n new GetDimensionsForSelectedVariantInput(\r\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\r\n channelId,\r\n mappedDimensions\r\n ),\r\n actionContext\r\n );\r\n }\r\n\r\n resolve(newProduct);\r\n });\r\n this.setState({ selectedProduct: selectedProduct });\r\n const variantProduct = await selectedProduct;\r\n\r\n if (variantProduct) {\r\n // Step 5. Use these dimensions hydrate the inventory. Wrap this in a promise\r\n // so that places like add to cart can await it\r\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(\r\n new ProductAvailabilitiesForSelectedVariantInput(variantProduct.RecordId, channelId),\r\n actionContext\r\n );\r\n\r\n if (newAvailableQuantity && newAvailableQuantity.length) {\r\n this.setState({ productAvailableQuantity: newAvailableQuantity[0] });\r\n } else {\r\n this.setState({ productAvailableQuantity: undefined });\r\n }\r\n\r\n // Step 6. Use these dimensions hydrate the product price.\r\n const newPrice = await getPriceForSelectedVariant(\r\n new PriceForSelectedVariantInput(variantProduct.RecordId, channelId),\r\n actionContext\r\n );\r\n\r\n if (newPrice) {\r\n this.setState({ productPrice: newPrice });\r\n }\r\n\r\n // Step 7. Use these dimensions hydrate the product delivery options.\r\n const newDeliveryOptions = await getDeliveryOptionsForSelectedVariant(\r\n new GetDeliveryOptionsForSelectedVariantInput(variantProduct.RecordId, channelId),\r\n actionContext\r\n );\r\n\r\n if (newDeliveryOptions) {\r\n this.setState({ productDeliveryOptions: newDeliveryOptions });\r\n }\r\n }\r\n };\r\n\r\n private _checkAddToCartDisable = async (props: any) => {\r\n //Custom code for work item #176444\r\n\r\n const {\r\n data: {\r\n product: { result: product }\r\n }\r\n } = props;\r\n\r\n const searchCriteria = {\r\n DefaultWarehouseOnly: false,\r\n FilterByChannelFulfillmentGroup: true,\r\n ProductIds: [product.RecordId]\r\n }\r\n\r\n let physicalAvailableQuantity;\r\n let isBackorderAllowedProp;\r\n let isBackorderAllowed;\r\n\r\n const resp = await getEstimatedAvailabilityAsync({ callerContext: this.props.context.actionContext }, searchCriteria);\r\n\r\n physicalAvailableQuantity = resp.AggregatedProductInventoryAvailabilities![0].PhysicalAvailableQuantity;\r\n isBackorderAllowedProp = resp.AggregatedProductInventoryAvailabilities![0].ExtensionProperties?.find(item => item.Key === 'IsBackOrderAllowed');\r\n isBackorderAllowed = isBackorderAllowedProp?.Value?.BooleanValue;\r\n\r\n // Check if API returned value is null and set to 0 if true\r\n const physicalAvailableQuantityNullCheck = !physicalAvailableQuantity ? 0 : physicalAvailableQuantity;\r\n const finalCheck = physicalAvailableQuantityNullCheck! <= 0 && !isBackorderAllowed;\r\n\r\n this.setState({ disableAddToCartButton: finalCheck });\r\n }\r\n\r\n private _updateDimensionValue = (\r\n productDimensionFull: ProductDimensionFull,\r\n newValueId: string | undefined\r\n ): ProductDimensionValue | undefined => {\r\n if (newValueId && productDimensionFull.DimensionValues) {\r\n return productDimensionFull.DimensionValues.find((dimension) => dimension.RecordId === +newValueId);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n private _getDropdownName = (dimensionType: number, resources: IFarmlandsBuyboxResources): string => {\r\n switch (dimensionType) {\r\n case 1: // ProductDimensionType.Color\r\n return resources.productDimensionTypeColor;\r\n case 2: // ProductDimensionType.Configuration\r\n return resources.productDimensionTypeConfiguration;\r\n case 3: // ProductDimensionType.Size\r\n return resources.productDimensionTypeSize;\r\n case 4: // ProductDimensionType.Style\r\n return resources.productDimensionTypeStyle;\r\n default:\r\n return '';\r\n }\r\n };\r\n}\r\n\r\nexport default Buybox;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IBuyboxCallbacks, IBuyboxState, IBuyboxViewProps } from './farmlands-buybox';\r\nimport {\r\n IBuyboxAddToCartViewProps,\r\n IBuyboxAddToWishlistViewProps,\r\n IBuyboxProductConfigureDropdownViewProps,\r\n IBuyboxProductConfigureViewProps,\r\n IBuyboxProductQuantityViewProps\r\n} from './components';\r\nimport Quantity from '../../themes/farmlandstheme/utilities/quantity/Quantity';\r\nimport { IBuyboxProps } from '../../themes/farmlandstheme/definition-extensions/buybox.ext.props.autogenerated';\r\nimport { IFarmlandsBuyboxData } from './farmlands-buybox.data';\r\nimport { IFarmlandsCartData } from '../farmlands-cart/farmlands-cart.data';\r\nimport { IFarmlandsCartProps, IFarmlandsCartResources } from '../farmlands-cart/farmlands-cart.props.autogenerated';\r\nimport { getExtensionProperty } from '../../common/method/functions';\r\nimport { getDeliveryOptionsAsync } from '../../actions/farmlands-get-delivery-options-calls.action';\r\nimport { IBuyboxFindInStoreViewProps } from './components/buybox-find-in-store';\r\n\r\n\r\ntype DeviceType = 'Mobile';\r\ninterface IDeliveryMethods {\r\n delivery: boolean;\r\n clickCollect: boolean;\r\n}\r\n\r\nconst BuyboxView: React.FC> = (props) => {\r\n const {\r\n ModuleProps,\r\n MediaGalleryContainerProps,\r\n ProductInfoContainerProps,\r\n addToCart,\r\n addToWishlist,\r\n configure,\r\n findInStore,\r\n quantity,\r\n price,\r\n title,\r\n inventoryLabel,\r\n callbacks,\r\n state,\r\n resources,\r\n data,\r\n deliveryBlock,\r\n clickCollectBlock\r\n } = props;\r\n\r\n const shortDescProp = getExtensionProperty(data.product.result?.ExtensionProperties!, 'OnlineShortDescription');\r\n\r\n const isMobile = props.context.request &&\r\n props.context.request.device &&\r\n (props.context.request.device.Type as DeviceType) === 'Mobile';\r\n\r\n const [deliveryMethods, setDeliveryMethods] = useState(undefined);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n const salesPriceInclGST = getExtensionProperty(\r\n props.data.productPrice.result?.ExtensionProperties!, 'ItemPriceWithGST'\r\n ).Value.DecimalValue;\r\n const recordId = data.product.result?.RecordId;\r\n\r\n const response = await getDeliveryOptionsAsync({\r\n context: { callerContext: props.context.actionContext, queryResultSettings: {} },\r\n recordId,\r\n salesPriceInclGST\r\n });\r\n\r\n const { DeliveryOptions } = response;\r\n\r\n setDeliveryMethods({\r\n delivery: hasDeliveryType(DeliveryOptions, 'Delivery'),\r\n clickCollect: hasDeliveryType(DeliveryOptions, 'Pickup')\r\n });\r\n }\r\n\r\n fetchData();\r\n }, [data.product.result?.RecordId]);\r\n\r\n return (\r\n \r\n {props.mediaGallery}\r\n \r\n {title}\r\n
SKU: {props.data.productPrice.result?.ItemId}
\r\n \r\n {shortDescProp &&

{shortDescProp.Value.StringValue}

}\r\n
{props.contentBlock}
\r\n {/* {rating} */}\r\n {price}\r\n {/* {description} */}\r\n
\r\n
\r\n {configure && _renderConfigure(configure)}\r\n {quantity && _renderQuantity(quantity, callbacks, props, state, resources)}\r\n
\r\n {inventoryLabel}\r\n
\r\n {addToCart && _renderAddToCart(addToCart)}\r\n {addToWishlist && _renderAddToWishlist(addToWishlist)}\r\n
\r\n {\r\n deliveryMethods !== undefined && (\r\n <>\r\n
\r\n \r\n \r\n )\r\n }\r\n
\r\n
\r\n );\r\n};\r\n\r\nconst DeliveryMethods = (props: any): JSX.Element => {\r\n const {\r\n deliveryBlock,\r\n clickCollectBlock,\r\n deliveryMethods,\r\n findInStore,\r\n isMobile\r\n } = props.data;\r\n\r\n return (\r\n
\r\n

Delivery methods

\r\n
\r\n
\r\n {\r\n deliveryBlock && (\r\n \r\n )\r\n }\r\n

Delivery {isMobile &&
}{!deliveryMethods.delivery && 'un'}available

\r\n
\r\n
\r\n {\r\n clickCollectBlock && (\r\n \r\n )\r\n }\r\n

Click & Collect {isMobile &&
}{!deliveryMethods.clickCollect && 'un'}available

\r\n
\r\n {findInStore && deliveryMethods.clickCollect && _renderFindInStore(findInStore)}\r\n
\r\n
\r\n );\r\n}\r\n\r\nconst hasDeliveryType = (deliveryOptions: any, type: string): boolean => {\r\n const options = deliveryOptions.filter((option: any) => option.DeliveryType === type);\r\n return options.length > 0;\r\n}\r\n\r\nconst _renderAddToCart = (addToCart: IBuyboxAddToCartViewProps): JSX.Element => {\r\n const { ContainerProps, button } = addToCart;\r\n\r\n return {button};\r\n};\r\n\r\nconst _renderAddToWishlist = (addToWishlist: IBuyboxAddToWishlistViewProps): JSX.Element => {\r\n const { ContainerProps, button } = addToWishlist;\r\n\r\n return {button};\r\n};\r\n\r\nconst _renderConfigure = (configure: IBuyboxProductConfigureViewProps): JSX.Element => {\r\n const { ContainerProps, dropdowns } = configure;\r\n\r\n return {dropdowns.map(_renderConfigureDropdown)};\r\n};\r\n\r\nconst _renderConfigureDropdown = (dropdown: IBuyboxProductConfigureDropdownViewProps): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, errors, select, sizeGuideLink } = dropdown;\r\n\r\n return (\r\n \r\n {heading}\r\n {select}\r\n {errors}\r\n {sizeGuideLink}\r\n \r\n );\r\n};\r\n\r\nconst _renderFindInStore = (findInStore: IBuyboxFindInStoreViewProps): JSX.Element => {\r\n const {\r\n ContainerProps,\r\n storeSelector,\r\n heading,\r\n description,\r\n button,\r\n modal,\r\n productPickupOptionList\r\n } = findInStore;\r\n\r\n return (\r\n \r\n {storeSelector}\r\n {heading}\r\n {productPickupOptionList}\r\n {description}\r\n {button}\r\n {modal}\r\n \r\n );\r\n};\r\n\r\nconst _renderQuantity = (\r\n quantityComponent: IBuyboxProductQuantityViewProps,\r\n callbacks: IBuyboxCallbacks,\r\n props: IBuyboxProps | IFarmlandsCartProps,\r\n state: IBuyboxState,\r\n extentionResources: IFarmlandsCartResources\r\n): JSX.Element => {\r\n const { ContainerProps, LabelContainerProps, heading, errors } = quantityComponent;\r\n\r\n const {\r\n resources,\r\n context: {\r\n app: {\r\n config: { maxQuantityForCartLineItem }\r\n }\r\n }\r\n } = props;\r\n\r\n const { quantity } = state;\r\n\r\n const onChange = (newValue: number) => {\r\n if (callbacks.updateQuantity) {\r\n callbacks.updateQuantity(newValue);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {heading}\r\n {errors}\r\n \r\n\r\n \r\n \r\n );\r\n};\r\n\r\nexport default BuyboxView;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartLineItemComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n OrgUnitLocation,\r\n ProductAvailableQuantity,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IDeliveryOptions } from '../../../actions/farmlands-get-delivery-options-calls.action';\r\nimport { filterDeliveryOptionsForProductId } from '../../../helpers/cart-validation-helpers';\r\n\r\nexport interface IFarmlandsInventoryAvaliabilityMessages {\r\n clickCollectText?: string;\r\n deliveryText?: string;\r\n outOfStockText?: string;\r\n noBackOrder?: string;\r\n clickCollectOutOfStock?: string;\r\n deliveryOutOfStock?: string;\r\n}\r\nexport interface IFarmlandsCartlineResourceString {\r\n discountStringText: string;\r\n sizeString: string;\r\n colorString: string;\r\n configString: string;\r\n styleString: string;\r\n amountString?: string;\r\n quantityDisplayString: string;\r\n inputQuantityAriaLabel: string;\r\n decrementButtonAriaLabel?: string;\r\n incrementButtonAriaLabel?: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n shippingChargesText: string;\r\n inventoryAvaliabilityMessages: IFarmlandsInventoryAvaliabilityMessages;\r\n}\r\n\r\nexport interface IFlyoutCartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: IFarmlandsCartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n deliveryOptions: IDeliveryOptions[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n validationErrorRemoveItemText: string;\r\n maxCartlineQuantity: number;\r\n\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\nexport interface IFlyoutCartLineItemViewProps {\r\n cartline: React.ReactNode;\r\n remove: React.ReactNode;\r\n storeLocation: React.ReactNode;\r\n hasError: boolean;\r\n\r\n data: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getProduct = (productId: number | undefined, products: SimpleProduct[]): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find((product) => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n outOfStockThreshold: number,\r\n maxCartlineQuantity: number,\r\n isStockCheckEnabled: boolean,\r\n productAvailability?: ProductAvailableQuantity\r\n) => {\r\n if (isStockCheckEnabled) {\r\n if (\r\n !productAvailability ||\r\n !productAvailability.AvailableQuantity ||\r\n productAvailability.AvailableQuantity <= 0 ||\r\n productAvailability.AvailableQuantity <= outOfStockThreshold\r\n ) {\r\n return 0;\r\n }\r\n return productAvailability.AvailableQuantity - outOfStockThreshold;\r\n }\r\n\r\n return maxCartlineQuantity;\r\n};\r\n\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: IFlyoutCartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: ProductAvailableQuantity,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions\r\n): IFlyoutCartLineItemViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n validationErrorRemoveItemText,\r\n deliveryOptions\r\n } = props;\r\n\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.outOfStockThreshold,\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability\r\n );\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => {\r\n removeItemClickHandler(cartline);\r\n };\r\n\r\n return {\r\n data: {\r\n product: product,\r\n cartline: cartline\r\n },\r\n hasError: props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\r\n cartline: (\r\n \r\n {{\r\n validationErrorRemoveButton: (\r\n \r\n {validationErrorRemoveItemText}\r\n \r\n ),\r\n deliveryOptions: filterDeliveryOptionsForProductId(deliveryOptions!, product.ItemId!)\r\n }}\r\n \r\n ),\r\n remove: (\r\n \r\n ),\r\n storeLocation: _renderStoreLocation(cartline, props)\r\n };\r\n};\r\n\r\nconst _renderStoreLocation = (\r\n cartLine: CartLine | null | undefined,\r\n props: IFlyoutCartLineItemsProps\r\n): JSX.Element | null => {\r\n if (cartLine && cartLine.FulfillmentStoreId) {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\r\n\r\n if (orgUnitName) {\r\n return (\r\n
\r\n {orgUnitName}\r\n
\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find((orgUnitLocation) => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n } else {\r\n return fulfillmentStoreId;\r\n }\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: IFlyoutCartLineItemsProps\r\n): IFlyoutCartLineItemViewProps[] | null => {\r\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(\r\n _assembleNode(\r\n cartline,\r\n product,\r\n props,\r\n index,\r\n foundProductAvailability?.ProductAvailableQuantity,\r\n foundProductDeliveryOption\r\n )\r\n );\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return _assembleCartlines(cartlines, products, props);\r\n};\r\n","import { ActiveCartProductsInput, getActiveCartProductsAction, getAvailabilitiesForCartLineItems, getDeliveryOptionsForCartLineItems, IProductInventoryInformation, ProductAvailabilitiesForCartLineItems, ProductDeliveryOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { getCartState } from '@msdyn365-commerce/global-state';\r\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * IMiniCartData entity interface.\r\n */\r\nexport interface IMiniCartData {\r\n products?: SimpleProduct[];\r\n productAvailabilites?: IProductInventoryInformation[];\r\n deliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\nexport const createInput = () => {\r\n return new ActiveCartProductsInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a mini cart data\r\n */\r\nexport async function getMiniCartData(ctx: IActionContext): Promise {\r\n const miniCartData: IMiniCartData = {};\r\n\r\n const cartState = await getCartState(ctx);\r\n const cart = cartState.cart;\r\n\r\n // If there are cart lines, make call to get products\r\n if (cart && cart.CartLines && cart.CartLines.length) {\r\n await getActiveCartProductsAction(\r\n new ActiveCartProductsInput(),\r\n ctx\r\n )\r\n .then(products => {\r\n if (products) {\r\n miniCartData.products = products;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with following product information - products');\r\n });\r\n\r\n await getAvailabilitiesForCartLineItems(\r\n new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings),\r\n ctx\r\n )\r\n .then(availableQuantity => {\r\n if (availableQuantity) {\r\n miniCartData.productAvailabilites = availableQuantity;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with following product information - availableQuantity');\r\n });\r\n\r\n await getDeliveryOptionsForCartLineItems(\r\n new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings),\r\n ctx\r\n )\r\n .then(deliveryOptions => {\r\n if (deliveryOptions) {\r\n miniCartData.deliveryOptions = deliveryOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with following product information - deliveryOptions');\r\n });\r\n }\r\n\r\n return miniCartData;\r\n}","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Button, INodeProps, UncontrolledTooltip } from '@msdyn365-commerce-modules/utilities';\r\nimport { CartIconComponent } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IImageSettings, RichText, RichTextComponent } from '@msdyn365-commerce/core';\r\nimport { CartLine, CommerceProperty, OrgUnitLocation } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { reaction, when } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { IFarmlandsCartIconData } from './farmlands-cart-icon.data';\r\nimport { IFarmlandsCartIconProps, IFarmlandsCartIconResources } from './farmlands-cart-icon.props.autogenerated';\r\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\r\nimport { hasCartLineValidationErrors, retrieveDeliveryOptionsForCartItems } from '../../helpers/cart-validation-helpers';\r\nimport {\r\n isShareholder,\r\n isShareholderAccountNotInactive,\r\n isShareholderAccountNotOnHold,\r\n hasEcommerceAccess\r\n} from '../../common/method/functions';\r\nimport { IDeliveryOptions } from '../../actions/farmlands-get-delivery-options-calls.action';\r\nimport { getContactDetailsAsync } from '../../actions/farmlands-get-contact-details-calls.action';\r\nimport { inventoryStocks } from '../farmlands-cart/inventoryStore';\r\nimport { getEstimatedProductWarehouseAvailabilityAsync } from '../../actions/farmlands-get-estimated-product-warehouse-availability.action';\r\nexport interface IMiniCartState {\r\n miniCartData: IMiniCartData;\r\n deliveryOptions: IDeliveryOptions[];\r\n orgUnitLocations?: OrgUnitLocation[];\r\n isShareholderUser: boolean;\r\n isAccountNotInactive: boolean;\r\n isAccountNotOnHold: boolean;\r\n hasValidationErrors: boolean;\r\n hasEcomPermission: boolean;\r\n}\r\n\r\nexport interface ICartIconViewProps extends IFarmlandsCartIconProps {\r\n className: string;\r\n cartIcon: React.ReactNode;\r\n\r\n FlyoutContainer?: INodeProps;\r\n\r\n CartlinesWrapper: INodeProps;\r\n miniCartIcon: INodeProps;\r\n miniCartItemWrapper: INodeProps;\r\n cartlines?: IFlyoutCartLineItemViewProps[];\r\n flyoutTitle: React.ReactNode;\r\n totalPrice: React.ReactNode;\r\n\r\n checkoutButtons?: React.ReactNode;\r\n goToCartButton?: React.ReactNode;\r\n waitingComponent?: React.ReactNode;\r\n\r\n isCartLoading: boolean;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass CartIcon extends React.Component, IMiniCartState> {\r\n constructor(props: IFarmlandsCartIconProps) {\r\n super(props);\r\n this.state = {\r\n miniCartData: {},\r\n deliveryOptions: [],\r\n isShareholderUser: false,\r\n isAccountNotInactive: false,\r\n isAccountNotOnHold: false,\r\n hasValidationErrors: false,\r\n hasEcomPermission: true\r\n };\r\n }\r\n\r\n public componentDidMount(): void {\r\n const context = this.props.context.actionContext;\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n }\r\n } = this.props;\r\n\r\n const populateMiniCartData = async () => {\r\n const cartlines = cart?.cart.CartLines ?? [];\r\n\r\n if (cartlines?.length){\r\n const firstCartline = cartlines[0];\r\n const isClickCollect: boolean = firstCartline.FulfillmentStoreId ? true : false;\r\n const cartLink = getUrlSync('cart', this.props.context.actionContext) || '';\r\n const isCartPage: boolean = cartLink === this.props.context.request.url.requestUrl.pathname;\r\n\r\n // cart module on cart page calls the API so we do not need to fetch the data again\r\n if (!isCartPage && isClickCollect){\r\n await getEstimatedProductWarehouseAvailabilityAsync({\r\n context: { callerContext: this.props.context.actionContext },\r\n cartID: cart?.cart.Id\r\n })\r\n .then((response) => {\r\n inventoryStocks.lineItems = response.InventoryStockAvailabilities;\r\n inventoryStocks.isClickCollect = isClickCollect;\r\n })\r\n }\r\n }\r\n\r\n this.setState({\r\n miniCartData: await getMiniCartData(context)\r\n });\r\n\r\n await retrieveDeliveryOptionsForCartItems(context, this.state.miniCartData.products!).then((response) => {\r\n this.setState({\r\n deliveryOptions: response\r\n });\r\n });\r\n this.setState({\r\n hasValidationErrors:\r\n cart?.cart.CartLines && this.state.deliveryOptions.length > 0\r\n ? hasCartLineValidationErrors(cart.cart.CartLines, this.state.deliveryOptions)\r\n : false\r\n });\r\n };\r\n\r\n // Initial call for data.\r\n populateMiniCartData().catch();\r\n\r\n // Reaction for subsequent changes for cartlines.\r\n reaction(() => this.props.data.cart.result?.cart.CartLines, populateMiniCartData);\r\n\r\n this.setState({\r\n orgUnitLocations: this.props.data.orgUnitLocations.result\r\n });\r\n\r\n when(\r\n () => cart!.status === 'READY',\r\n async () => {\r\n // check if the logged-in user has ecomm purchase rights\r\n if (this.props.context.request.user.token) {\r\n const userContactDetails = await getContactDetailsAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n JSON.parse(atob(this.props.context.request.user.token.split('.')[1])).oid\r\n );\r\n if (!hasEcommerceAccess(userContactDetails)) {\r\n this.setState({\r\n hasEcomPermission: false\r\n });\r\n }\r\n }\r\n\r\n this.setState({\r\n isShareholderUser: isShareholder(cart?.cart!) || false,\r\n isAccountNotInactive: isShareholderAccountNotInactive(cart?.cart.ExtensionProperties!),\r\n isAccountNotOnHold: isShareholderAccountNotOnHold(cart?.cart.ExtensionProperties!)\r\n });\r\n\r\n }\r\n );\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n data: {\r\n cart: { result: cart }\r\n },\r\n config: {\r\n enableHoverCart,\r\n onHoldMessage,\r\n suspendedMessage,\r\n ecomPermissionMessage\r\n },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n context,\r\n resources\r\n } = this.props;\r\n\r\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\r\n const cartLines = this._getCartLines();\r\n const hasErrors = cartLines ? cartLines.some((cartline) => cartline.hasError) : false;\r\n const backorderError = cart ? this._checkBackorderErrors(cart.cart.CartLines) : false;\r\n const includeFlyout = this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\r\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', cart?.totalItemsInCart.toString() || '0');\r\n const flyoutTitle = resources.flyoutTitle;\r\n const price =\r\n cart?.cart.ExtensionProperties?.find((prop: CommerceProperty) => prop.Key === 'TotalSalesLinesIncGst')?.Value?.DecimalValue ||\r\n undefined;\r\n const priceString = price\r\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\r\n : '';\r\n const disableCheckout = backorderError || hasErrors || this.state.hasValidationErrors || cart?.totalItemsInCart! === 0;\r\n const inventoryAvaliabilityLineItems = inventoryStocks.lineItems.slice();\r\n\r\n // hotfix: render issue when user hover over cart immediately when inventoryStocks is not ready.\r\n if (\r\n inventoryStocks.isClickCollect &&\r\n (cartLines && cartLines.length !== 0 && inventoryAvaliabilityLineItems?.length !== 0) &&\r\n !(cartLines?.length >= inventoryAvaliabilityLineItems?.length)\r\n ){\r\n return null;\r\n }\r\n\r\n const viewProps = {\r\n ...this.props,\r\n cartIcon: cart && (\r\n \r\n ),\r\n cartlines: cartLines,\r\n FlyoutContainer: includeFlyout\r\n ? {\r\n tag: UncontrolledTooltip,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__flyout-container',\r\n trigger: 'hover focus',\r\n displayMode: 'FLYOUT',\r\n target: id\r\n }\r\n : undefined,\r\n CartlinesWrapper: {\r\n className: 'ms-cart-icon__cart-lines'\r\n },\r\n miniCartIcon: {\r\n className: classnames('ms-cart-icon')\r\n },\r\n miniCartItemWrapper: {\r\n className: classnames('msc-cart-lines-item')\r\n },\r\n checkoutButtons: this._getCheckoutButtons(\r\n isAuthenticated,\r\n this.state.isShareholderUser,\r\n disableCheckout,\r\n signInUrl!,\r\n resources,\r\n onHoldMessage || '',\r\n suspendedMessage || '',\r\n ecomPermissionMessage || ''\r\n ),\r\n goToCartButton: (\r\n \r\n ),\r\n flyoutTitle: {flyoutTitle},\r\n totalPrice:
{priceString}
\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _getCheckoutButtons(\r\n isAuthenticated: boolean,\r\n isShareholderUser: boolean,\r\n disableCheckoutButton: boolean,\r\n signInUrl: string,\r\n resources: IFarmlandsCartIconResources,\r\n onHoldMessage: RichText,\r\n suspendedMessage: RichText,\r\n ecomPermissionMessage: RichText\r\n ): React.ReactNode {\r\n const checkoutURL = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const checkoutAsShareholderURL = getUrlSync('checkout-shareholder-only', this.props.context.actionContext) || '';\r\n const signInURL = this._getSignInURL(signInUrl || '');\r\n const { isAccountNotInactive, isAccountNotOnHold, hasEcomPermission } = this.state;\r\n\r\n return (\r\n <>\r\n {isAuthenticated && isShareholderUser && (\r\n <>\r\n \r\n {resources.checkoutWithAccountButtonTitle}\r\n \r\n {!isAccountNotOnHold && }\r\n {!isAccountNotInactive && }\r\n {!hasEcomPermission && }\r\n \r\n )}\r\n {isAuthenticated && (\r\n \r\n {resources.checkoutWithCardButtonTitle}\r\n \r\n )}\r\n {!isAuthenticated && (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n )}\r\n {!isAuthenticated && (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n private _getSignInURL(signInUrl: string): string {\r\n if (MsDyn365.isBrowser) {\r\n return `${signInUrl}${signInUrl.indexOf('?') === -1 ? '?' : '&'}ru=${window.location.origin}/cart`;\r\n }\r\n return '';\r\n }\r\n\r\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config: config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\r\n ? FlyoutCartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n products: this.state.miniCartData.products,\r\n deliveryOptions: this.state.deliveryOptions,\r\n productAvailabilites: this.state.miniCartData.productAvailabilites,\r\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\r\n imageSettings: imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: this.props.context.app.config.maxQuantityForCartLineItem,\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: '', // not used\r\n discountStringText: '', // not used\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: '',\r\n inventoryAvaliabilityMessages: {\r\n clickCollectText: config.clickCollectText,\r\n deliveryText: config.deliveryText,\r\n outOfStockText: config.outOfStockText,\r\n noBackOrder: config.noBackOrder,\r\n clickCollectOutOfStock: config.clickCollectOutOfStock,\r\n deliveryOutOfStock: config.deliveryOutOfStock\r\n }\r\n },\r\n telemetry: telemetry,\r\n removeButtonText: resources.removeCartButtonText,\r\n outOfStockText: '', // not used\r\n outOfRangeOneText: '', // not used\r\n outOfRangeFormatText: '', // not used\r\n validationErrorRemoveItemText: resources.validationErrorRemoveItemText,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.state.orgUnitLocations,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode\r\n })\r\n : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return (\r\n imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n }\r\n );\r\n };\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input).catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n private _checkBackorderErrors = (cart: any) => {\r\n const { lineItems } = inventoryStocks;\r\n const currentInventoryStocks = lineItems.filter(p1 => cart.some((p2: any) => p1['ProductId'] === p2['ProductId']))\r\n return !!currentInventoryStocks.some((item) => item['PhysicalAvailableInventoryLevelCode'] === 'OOS' && !item['IsBackOrderAllowed']);\r\n };\r\n}\r\n\r\nexport default CartIcon;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ICartIconViewProps } from './farmlands-cart-icon';\r\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\n\r\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\r\n if (!cartLines) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n \r\n {cartLine.cartline}\r\n \r\n );\r\n });\r\n};\r\n\r\nconst CartIconView: React.FC = (props: ICartIconViewProps) => (\r\n \r\n \r\n {props.cartIcon}\r\n {props.FlyoutContainer && (\r\n \r\n {props.flyoutTitle}\r\n {_renderCartlines(props.cartlines, props)}\r\n {props.totalPrice}\r\n {/*\r\n HOTFIX: 174950 - further investigation required to why some product do not reach validation check\r\n {props.checkoutButtons}\r\n */}\r\n {props.goToCartButton}\r\n \r\n )}\r\n \r\n);\r\n\r\nexport default CartIconView;\r\n","import { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\n\r\n// Note: BOPIS stands for \"Buy Online, Pick-up In Store\".\r\nexport interface IPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n}\r\n\r\nexport interface IPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n}\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = (orgUnitLocation: OrgUnitLocation, cartState: ICartState | undefined, cartline: CartLine) => {\r\n if (!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState.updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState } = props;\r\n\r\n if (isBopisSelected) {\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager.openDialog({\r\n product,\r\n alreadySelectedLocation: {\r\n OrgUnitNumber: cartline.FulfillmentStoreId\r\n },\r\n onLocationSelected: (orgUnitLocation) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline);\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n } else {\r\n if (!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState.clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch(error => {\r\n return;\r\n });\r\n }\r\n };\r\n\r\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || !(orgUnitLocations.length > 0)) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n } else {\r\n return fulfillmentStoreId;\r\n }\r\n };\r\n\r\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText: string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined): JSX.Element => {\r\n\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = cartLine.FulfillmentStoreId ? true : false;\r\n\r\n const toggleBOPIS = (isBopisSelected: boolean) => { return () => _toggleBOPIS(isBopisSelected); };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {\r\n cartLine.FulfillmentStoreId ? (\r\n
\r\n {orgUnitName}\r\n \r\n
\r\n ) : null\r\n }\r\n \r\n );\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!props.deliveryOptions ||\r\n !props.deliveryOptions.DeliveryOptions ||\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(props.cartline, props.shipitText, props.pickUpInStoreText, props.changeStoreText, props.orgUnitLocations),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: props.cartline.FulfillmentStoreId ? true : false,\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToWishlistComponent,\r\n CartLineItemComponent,\r\n ICartlineResourceString,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n CommerceList,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IDeliveryOptions } from '../../../actions/farmlands-get-delivery-options-calls.action';\r\nimport { filterDeliveryOptionsForProductId } from '../../../helpers/cart-validation-helpers';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from './farmlands-cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n deliveryOptions: IDeliveryOptions[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n validationErrorRemoveItemText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n cartLineDeliveryMethodsText: any;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n addToWishlist: React.ReactNode | undefined;\r\n error?: string;\r\n data?: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getProduct = (productId: number | undefined, products: SimpleProduct[]): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find((product) => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxCartlineQuantity: number,\r\n isStockCheckEnabled: boolean,\r\n productAvailability?: IProductInventoryInformation\r\n) => {\r\n if (isStockCheckEnabled) {\r\n if (\r\n !productAvailability ||\r\n !productAvailability.ProductAvailableQuantity ||\r\n !productAvailability.IsProductAvailable ||\r\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\r\n ) {\r\n return 0;\r\n }\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity >= maxCartlineQuantity\r\n ? maxCartlineQuantity\r\n : productAvailability.ProductAvailableQuantity.AvailableQuantity;\r\n }\r\n\r\n return maxCartlineQuantity;\r\n};\r\n\r\nconst _getErrorMessage = (\r\n maxQuantity: number,\r\n currentQuantity: number,\r\n props: ICartLineItemsProps\r\n): string | undefined => {\r\n if (maxQuantity <= 0) {\r\n return props.outOfStockText;\r\n } else if (maxQuantity < currentQuantity) {\r\n if (maxQuantity === 1) {\r\n return props.outOfRangeOneText;\r\n } else {\r\n return props.outOfRangeFormatText.replace('{numLeft}', maxQuantity.toString());\r\n }\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions\r\n): ICartlinesViewProps => {\r\n const {\r\n addToWishlistButtonText,\r\n context,\r\n defaultWishlistName,\r\n gridSettings,\r\n id,\r\n imageSettings,\r\n moveToWishlistSuccessHandler,\r\n removeButtonText,\r\n removeFromWishlistButtonText,\r\n removeItemClickHandler,\r\n resources,\r\n typeName,\r\n validationErrorRemoveItemText,\r\n wishlists,\r\n deliveryOptions,\r\n cartLineDeliveryMethodsText\r\n } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist =\r\n wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability\r\n );\r\n const errorMessage =\r\n props.includeErrors && props.isStockCheckEnabled\r\n ? _getErrorMessage(maxQuantity, cartline.Quantity!, props)\r\n : undefined;\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => {\r\n removeItemClickHandler(cartline);\r\n };\r\n const onProductRemoveClickHandler = (event: React.MouseEvent) => {\r\n let productObj = {\r\n productInfo: {\r\n productName: cartline.Description,\r\n productId: cartline.ProductId,\r\n sku: product.ItemId\r\n }\r\n };\r\n (Window as any).digitalData.product = [productObj];\r\n window.dispatchEvent(new CustomEvent('RemoveFromCart'));\r\n onRemoveClickHandler(event);\r\n }\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability\r\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\r\n : undefined;\r\n\r\n const removeButtonElement = (\r\n \r\n );\r\n\r\n const validationErrorRemoveButtonElement = (\r\n \r\n {validationErrorRemoveItemText}\r\n \r\n );\r\n\r\n return {\r\n data: {\r\n product: product,\r\n cartline: cartline\r\n },\r\n error: errorMessage,\r\n cartline: (\r\n <>\r\n \r\n {{\r\n removeButton: removeButtonElement,\r\n validationErrorRemoveButton: validationErrorRemoveButtonElement,\r\n deliveryOptions: filterDeliveryOptionsForProductId(deliveryOptions!, product.ItemId!)\r\n }}\r\n \r\n
\r\n \r\n
\r\n \r\n ),\r\n pickUpInStore: PickUpInStore({\r\n cartState: props.cartState,\r\n cartline: cartline,\r\n product: product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: foundProductDeliveryOptions,\r\n pickupDeliveryModeCode: props.pickupDeliveryModeCode\r\n }),\r\n addToWishlist: isAuthenticated ? (\r\n \r\n ) : undefined\r\n };\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Products content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n const product = _getProduct(cartline.ProductId, products);\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(\r\n _assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption)\r\n );\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return _assembleCartlines(cartlines, products, props);\r\n};\r\n","import { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport {\r\n CartLine,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct,\r\n ProductInventoryAvailability\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport React, { useEffect } from 'react';\r\nimport {\r\n updateCartLinesAsync,\r\n updateDeliverySpecificationAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { getEstimatedProductWarehouseAvailabilityAsync } from '../../../actions/farmlands-get-estimated-product-warehouse-availability.action';\r\nimport { inventoryStocks } from '../inventoryStore';\r\n\r\n// Note: BOPIS stands for \"Buy Online, Pick-up In Store\".\r\nexport interface IDeliveryMethodsProps {\r\n context: ICoreContext<{\r\n [x: string]: any;\r\n }>;\r\n cartState: ICartState;\r\n products: SimpleProduct[] | undefined;\r\n shipItText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n showSpinner(showSpinner: boolean): void;\r\n data: any;\r\n config: any;\r\n}\r\n\r\n/**\r\n * Component for delivery options radio inputs at top of Order Summary in cart page.\r\n * Also handles much of the logic regarding pick-up in store functionality.\r\n */\r\n// @ts-ignore\r\n@observer\r\nexport const DeliveryMethods: React.FC = (props: IDeliveryMethodsProps): JSX.Element => {\r\n const {\r\n context,\r\n cartState,\r\n products,\r\n shipItText,\r\n pickUpInStoreText,\r\n changeStoreText,\r\n storeSelectorStateManager,\r\n orgUnitLocations,\r\n showSpinner\r\n } = props;\r\n const cartlines = cartState.cart.CartLines ?? [];\r\n const firstCartline = cartlines[0]; // Using first product for retrieving search results, as all stores should be returned regardless of the product.\r\n\r\n // const numberOfPickupLocationsSelected = (cartLines: CartLine[]) => {\r\n // return cartLines.filter((cartline) => {\r\n // return cartline.FulfillmentStoreId !== '';\r\n // }).length;\r\n // };\r\n\r\n const updateCartLinePickupLocations = async (orgUnitLocation: OrgUnitLocation | undefined, onlyUpdateNonPickup: boolean = false) => {\r\n if (orgUnitLocation === undefined) {\r\n return;\r\n }\r\n\r\n for (const cartline of cartlines) {\r\n if ((onlyUpdateNonPickup && cartline.FulfillmentStoreId === '') || !onlyUpdateNonPickup) {\r\n await cartState.updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation })\r\n .catch((error: Error) => {\r\n console.error('updateCartLinePickupLocations', error.message);\r\n return;\r\n });\r\n }\r\n }\r\n };\r\n\r\n // @ts-ignore\r\n // React.useEffect(async() => {\r\n // const numberOfPickUpInStoreItems = numberOfPickupLocationsSelected(cartlines);\r\n\r\n // // Update pick-up locations if some (but not all) products have a pick up location already.\r\n // if (numberOfPickUpInStoreItems > 0 && numberOfPickUpInStoreItems < cartlines.length) {\r\n // showSpinner(true);\r\n // await props.data.cart.result.refreshCart({});\r\n // await _callUpdateDeliverySpecification(true, _getOrgUnit(firstCartline.FulfillmentStoreId, orgUnitLocations));\r\n // await updateCartLinePickupLocations(_getOrgUnit(firstCartline.FulfillmentStoreId, orgUnitLocations), true)\r\n // .then(() => {\r\n // showSpinner(false);\r\n // })\r\n // .catch((error) => {\r\n // return;\r\n // });\r\n // }\r\n // }, []);\r\n\r\n useEffect(async() => {\r\n await setDeliveryMode();\r\n }, []);\r\n\r\n const setDeliveryMode = async () => {\r\n showSpinner(true);\r\n\r\n inventoryStocks.lineItems = [];\r\n inventoryStocks.isClickCollect = false;\r\n\r\n for (const cartline of cartlines) {\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n await cartState\r\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\r\n .then((result) => {\r\n if (result.status === 'SUCCESS') {\r\n // do something\r\n }\r\n })\r\n .catch((error: Error) => {\r\n console.error('clearCartLinePickupLocation', error.message)\r\n return;\r\n });\r\n }\r\n showSpinner(false);\r\n await _callUpdateDeliverySpecification(!!storeSelectorStateManager, undefined);\r\n //await setProductAttributes();\r\n getProductWarehouseAvailability(false);\r\n }\r\n\r\n const _getProduct = (productId: number | undefined): SimpleProduct | undefined => {\r\n if (productId !== undefined && products) {\r\n return products.find((product) => {\r\n return productId === product.RecordId;\r\n });\r\n }\r\n return undefined;\r\n };\r\n\r\n const _onLocationChangedCallback = async (orgUnitLocation: OrgUnitLocation) => {\r\n if (!cartState) {\r\n return Promise.resolve();\r\n }\r\n\r\n await updateCartLinePickupLocations(orgUnitLocation);\r\n await _callUpdateDeliverySpecification(!!!storeSelectorStateManager, orgUnitLocation);\r\n await getProductWarehouseAvailability(true);\r\n };\r\n\r\n const _callUpdateDeliverySpecification = async (isDelivery: boolean, orgUnitLocation?: OrgUnitLocation) => {\r\n const { deliveryModeIdDeliveryValue, deliveryModeIdPickupValue } = context.app.config;\r\n // Creating call to custom updateDeliverySpecification API to retain delivery method after changing quantity.\r\n const addressObject = {\r\n City: orgUnitLocation?.City || '',\r\n Name: orgUnitLocation?.OrgUnitName || '',\r\n Street: orgUnitLocation?.Street || '',\r\n ThreeLetterISORegionName: 'NZL',\r\n TwoLetterISORegionName: 'NZ',\r\n ZipCode: orgUnitLocation?.Zip || '',\r\n BuildingCompliment: '',\r\n County: orgUnitLocation?.Country || '',\r\n CountyName: orgUnitLocation?.CountyName || '',\r\n DistrictName: '',\r\n FullAddress: orgUnitLocation?.Address || '',\r\n Postbox: orgUnitLocation?.Postbox || '',\r\n RecordId: 0,\r\n State: '',\r\n StateName: '',\r\n StreetNumber: orgUnitLocation?.StreetNumber || ''\r\n };\r\n\r\n const updateCartDeliverySpecificationDeliveryInput = {\r\n DeliveryModeId: deliveryModeIdDeliveryValue,\r\n DeliveryPreferenceTypeValue: 1,\r\n DeliveryAddress: addressObject\r\n };\r\n\r\n const updateCartDeliverySpecificationPickupInput = {\r\n DeliveryModeId: deliveryModeIdPickupValue,\r\n DeliveryPreferenceTypeValue: 2,\r\n DeliveryAddress: addressObject,\r\n PickUpStoreId: orgUnitLocation?.OrgUnitNumber\r\n };\r\n\r\n const cookieCartId = context.actionContext.requestContext.cookies?.getCartCookie().substring(2);\r\n await updateDeliverySpecificationAsync(\r\n { callerContext: context.actionContext },\r\n cookieCartId,\r\n isDelivery ? updateCartDeliverySpecificationDeliveryInput : updateCartDeliverySpecificationPickupInput\r\n )\r\n .catch((error: Error) => {\r\n console.error('_callUpdateDeliverySpecification:', error.message);\r\n })\r\n };\r\n\r\n const _toggleBOPIS = async (isBopisSelected: boolean) => {\r\n if (isBopisSelected) {\r\n // If pick up in store option is picked, attempt to open store selector dialog...\r\n const product = _getProduct(firstCartline.ProductId);\r\n\r\n // Abort opening dialog if stateManager not present\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n\r\n // Opening the store selector dialog requires a SINGLE product and not a list of products.\r\n // Need to find way to account for multiple products to search across in the store selector.\r\n storeSelectorStateManager\r\n .openDialog({\r\n product,\r\n alreadySelectedLocation: {\r\n OrgUnitNumber: firstCartline.FulfillmentStoreId\r\n },\r\n onLocationSelected: (orgUnitLocation) => {\r\n return _onLocationChangedCallback(orgUnitLocation);\r\n }\r\n })\r\n .catch((error) => {\r\n return;\r\n });\r\n } else {\r\n // Else, remove the location from the cart line.\r\n // This ideally should remove the location from all items.\r\n if (!cartState) {\r\n return;\r\n }\r\n\r\n await setDeliveryMode();\r\n }\r\n };\r\n\r\n const _getOrgUnit = (fulfillmentStoreId: string | undefined, locations: OrgUnitLocation[] | undefined) => {\r\n\r\n console.info('_getOrgUnit Method');\r\n console.info('_getOrgUnit Method fulfillmentStoreId', fulfillmentStoreId);\r\n console.log('_getOrgUnit Method OrgUnitLocation', locations);\r\n \r\n if (!locations || !fulfillmentStoreId || !(locations.length > 0)) {\r\n return undefined;\r\n }\r\n\r\n const foundLocation = locations.find((orgUnitLocation) => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n console.info('FulfillmentStoreId:', firstCartline.FulfillmentStoreId);\r\n console.info('orgUnitLocations:', orgUnitLocations);\r\n console.info('orgUnitLocations:', orgUnitLocations?.length);\r\n\r\n const orgUnit = _getOrgUnit(firstCartline.FulfillmentStoreId, orgUnitLocations);\r\n\r\n console.log('orgUnit:', orgUnit);\r\n\r\n\r\n const bopisSelected = firstCartline.FulfillmentStoreId ? true : false;\r\n const toggleBOPIS = (isBopisSelected: boolean) => {\r\n return () => _toggleBOPIS(isBopisSelected);\r\n };\r\n\r\n const getProductWarehouseAvailability = async (isClickCollect: boolean) => {\r\n const {\r\n context,\r\n cartState\r\n } = props;\r\n\r\n await getEstimatedProductWarehouseAvailabilityAsync({\r\n context: { callerContext: context.actionContext },\r\n cartID: cartState.cart.Id\r\n })\r\n .then(async(response) => {\r\n inventoryStocks.lineItems = response.InventoryStockAvailabilities;\r\n inventoryStocks.isClickCollect = isClickCollect;\r\n\r\n await setProductAttributes();\r\n })\r\n .catch((error: Error) => {\r\n console.error('getProductWarehouseAvailability', error.message);\r\n });\r\n }\r\n\r\n const setProductAttributes = async () => {\r\n const {\r\n lineItems,\r\n isClickCollect\r\n } = inventoryStocks;\r\n const {\r\n cartLineOutOfStock,\r\n inventoryAvailabilityLevel,\r\n inventoryAvailabilityMessage,\r\n inventoryOrderOutOfStockFieldName,\r\n inventoryOrderOutOfStockMessage\r\n } = props.config;\r\n const cartlines = cartState.cart.CartLines ?? [];\r\n let newCartLine: Array = [];\r\n let newCartAttributes: Array = [{\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: inventoryOrderOutOfStockFieldName || 'inventoryOrderOutOfStockFieldName',\r\n TextValue: ''\r\n }];\r\n\r\n if (isClickCollect) {\r\n const hasOutOfStockProduct: boolean = lineItems.find((item: ProductInventoryAvailability) => item.PhysicalAvailableInventoryLevelCode === 'OOS') || false;\r\n if (hasOutOfStockProduct) {\r\n newCartAttributes = [\r\n {\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: inventoryOrderOutOfStockFieldName || 'inventoryOrderOutOfStockFieldName',\r\n TextValue: inventoryOrderOutOfStockMessage || 'N/A'\r\n }\r\n ];\r\n }\r\n cartlines.forEach((element: CartLine, index: number): void => {\r\n newCartLine.push({\r\n ...element,\r\n AttributeValues: [\r\n {\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: inventoryAvailabilityLevel || 'InventoryAvailabilityLevel',\r\n // @ts-ignore\r\n TextValue: isClickCollect ? lineItems[index]?.PhysicalAvailableInventoryLevelLabel : ''\r\n },\r\n {\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: inventoryAvailabilityMessage || 'InventoryAvailabilityMessage',\r\n // @ts-ignore\r\n TextValue: isClickCollect && lineItems[index]?.PhysicalAvailableInventoryLevelCode === 'OOS' ? cartLineOutOfStock : ''\r\n },\r\n ]\r\n })\r\n });\r\n }\r\n else {\r\n cartlines.forEach((element: CartLine): void => {\r\n newCartLine.push({\r\n ...element,\r\n AttributeValues: []\r\n })\r\n });\r\n }\r\n\r\n await props.data.cart.result.refreshCart({});\r\n await _updateCart(newCartAttributes);\r\n await _updateCartLines(newCartLine);\r\n }\r\n\r\n const _updateCart = async (newCartAttributes: any) => {\r\n await props.data.cart.result?.updateCart({\r\n newCartObject: {\r\n ...props.data.cart.result?.cart,\r\n AttributeValues: newCartAttributes\r\n }\r\n }).catch((error: Error) => {\r\n console.error('_updateCart', error.message);\r\n });\r\n }\r\n\r\n const _updateCartLines = async (cartLines: any) => {\r\n const cookieCartId = context.actionContext.requestContext.cookies?.getCartCookie().substring(2)\r\n await updateCartLinesAsync(\r\n { callerContext: props.context.actionContext },\r\n cookieCartId,\r\n cartLines,\r\n props.data.cart.result?.cart?.Version!,\r\n ).catch((error: Error) => {\r\n console.error('_updateCartLines', error.message);\r\n });\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n private renderFooder = (): JSX.Element | null => {\r\n const { isVisted, isReady, isSubmitting, isCancelAllowed, hasControlGroup, onCancel, onSubmit, resource } = this.props;\r\n const { saveBtnLabel, 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 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 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\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 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 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 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 * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/ //\r\nimport { IModuleStateManager } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { Heading } from '@msdyn365-commerce-modules/data-types';\r\nimport get from 'lodash/get';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport GuidedCard from '../components/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}\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.Component {\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 { isReady, isPending, isUpdating, isDisabled, isCancelAllowed, onEdit, onCancel, onSubmit, hasModuleState, hasInitialized } =\r\n state || ({} as IModuleStateManager);\r\n return (\r\n\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 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 getStep = (id: string): number => {\r\n return this.getEnabledModules().indexOf(id);\r\n };\r\n\r\n private getId = (item: React.ReactNode): string => {\r\n return get(item, 'props.id') || '';\r\n };\r\n\r\n private getHeading = (item: React.ReactNode): Heading => {\r\n return get(item, 'props.config.heading') || '';\r\n };\r\n\r\n private 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 isActive = (step: number): boolean => {\r\n return step === this.state.currentStep;\r\n };\r\n\r\n private isVisted = (step: number): boolean => {\r\n return step > -1 && step < this.state.currentStep;\r\n };\r\n\r\n private 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 * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/ //\r\nimport { Button } 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 placeOrderText: string;\r\n registerForBulkEmails(): any;\r\n placeOrder(): Promise;\r\n}\r\n\r\nconst CheckoutPlaceOrderButton: React.FC = ({\r\n placeOrderText,\r\n canPlaceOrder,\r\n registerForBulkEmails,\r\n placeOrder\r\n}) => {\r\n const [isBusy, setIsBusy] = useState(false);\r\n const onPlaceOrder = async () => {\r\n if (isBusy || !canPlaceOrder) {\r\n return;\r\n }\r\n setIsBusy(true);\r\n await registerForBulkEmails();\r\n await placeOrder();\r\n setIsBusy(false);\r\n };\r\n return (\r\n \r\n {placeOrderText}\r\n \r\n );\r\n};\r\n\r\nexport default CheckoutPlaceOrderButton;\r\n","import { 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 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.d';\r\nimport { SHAREHOLDER_KEY_VALUE } from '../../farmlands-checkout-shareholder-payment/farmlands-checkout-shareholder-payment';\r\n\r\nexport const OPERATIONS = {\r\n PayCard: 201,\r\n PayGiftCertificate: 214,\r\n PayLoyalty: 207\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-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\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-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\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 = findTenderIdTypeByOperationId(tenderTypes, OPERATIONS.PayCard);\r\n const cardTenderLine: CartTenderLine = {\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\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 // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\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 // @ts-ignore\r\n // tslint:disable-next-line:prefer-type-cast\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// tslint:disable-next-line:max-func-body-length\r\nexport default async (ctx: IActionContext): 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 || !checkoutState || !channelConfiguration) {\r\n throw new Error('Fail to placeOrder');\r\n }\r\n\r\n const { giftCardExtends, tokenizedPaymentCard, cardPrefix, guestCheckoutEmail, billingAddress, loyaltyAmount } = checkoutState;\r\n const { Currency } = channelConfiguration;\r\n\r\n let amountDue = cartState.cart.AmountDue || 0;\r\n let cartTenderLines: CartTenderLine[] = [];\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) {\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 ? parseInt(giftCardExtend.ExpirationDate?.split('/')[1], 10)\r\n : undefined;\r\n const giftCardExpirationMonth = giftCardExtend.ExpirationDate\r\n ? 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 if (cartState.cart.ExtensionProperties?.find((prop) => prop.Key === SHAREHOLDER_KEY_VALUE)) {\r\n getTenderLinePromises.push({\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.CartTenderLine',\r\n // @ts-ignore\r\n 'Amount@odata.type': '#Decimal',\r\n TenderLineId: '',\r\n Currency: Currency,\r\n TenderTypeId: '4',\r\n Amount: amountDue,\r\n IsPolicyBypassed: false,\r\n CustomerId: cartState.cart.CustomerId\r\n });\r\n amountDue = 0;\r\n }\r\n\r\n // Pay the rest by credit card\r\n if (amountDue > 0) {\r\n if (!tokenizedPaymentCard) {\r\n throw new Error('Fail to placeOrder: no token found');\r\n }\r\n const creditCardTenderLinePromise = getCreditCardTenderLine(\r\n ctx,\r\n tokenizedPaymentCard,\r\n cardPrefix,\r\n amountDue,\r\n Currency,\r\n billingAddress\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 await Promise.all(getTenderLinePromises)\r\n .then((result: any) => (cartTenderLines = result))\r\n .catch((error) => {\r\n throw error;\r\n });\r\n\r\n if (!cartTenderLines || !cartTenderLines.length) {\r\n throw new Error('Fail to placeOrder: fail to get cart tender lines');\r\n }\r\n }\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 // @ts-ignore fields tokenizedPaymentCard and receiptNumberSequence are optional\r\n undefined,\r\n undefined,\r\n cartTenderLines || null,\r\n cartState.cart.Version\r\n // @ts-ignore\r\n ).catch((error) => {\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","import { 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 (e) {\r\n throw e;\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 (e) {\r\n throw e;\r\n }\r\n}\r\n\r\nexport default emptyActiveCart;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/ //\r\nimport { IModuleStateManager, IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\r\nimport { getAvailabilitiesForCartLineItems, ProductAvailabilitiesForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Heading, IModuleProps, INodeProps, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport { AsyncResultStatus, getUrlSync } from '@msdyn365-commerce/core';\r\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { AttributeValueBase } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport get from 'lodash/get';\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\nimport { IFarmlandsCheckoutData } from './farmlands-checkout.data';\r\nimport { IFarmlandsCheckoutProps } from './farmlands-checkout.props.autogenerated';\r\nimport AlertComponent from './components/alert';\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\nimport { getContactDetailsAsync } from '../../actions/farmlands-get-contact-details-calls.action';\r\nimport { registerContactForBulkEmailsAsync } from '../../actions/farmlands-register-contact-for-bulk-emails-calls.action';\r\nimport {\r\n hasEcommerceAccess,\r\n isShareholderAccountDisabled,\r\n isShareholderAccountNotInactive,\r\n isShareholderAccountNotOnHold,\r\n isShareholder,\r\n isGuest,\r\n isCasual\r\n} from '../../common/method/functions';\r\nimport { SHAREHOLDER_KEY_VALUE } from '../farmlands-checkout-shareholder-payment/farmlands-checkout-shareholder-payment';\r\nimport { CHECKOUT_ADDRESS_FLAG } from '../../helpers/esam-validation-helpers';\r\nexport * from './components/get-line-items';\r\nexport * from './components/get-order-summary';\r\n\r\ntype DeviceType = 'Mobile';\r\n\r\ninterface ICheckoutState {\r\n errorMessage: string;\r\n isBulkEmailChecked?: boolean;\r\n orderNote: string;\r\n hasEcomPermission: boolean;\r\n loaded: boolean;\r\n}\r\n\r\nexport interface ICheckoutViewProps extends IFarmlandsCheckoutProps {\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\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\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 lineItems?: ILineItems;\r\n placeOrderButton?: React.ReactNode;\r\n keepShoppingButton?: React.ReactNode;\r\n orderConfirmation?: React.ReactNode;\r\n}\r\n\r\nexport interface ISalesOrderAttribute extends AttributeValueBase {\r\n TextValue?: string;\r\n TextValueTranslations?: [];\r\n}\r\n\r\nexport interface ICheckoutModuleProps extends IFarmlandsCheckoutProps, IModuleStateProps {}\r\n\r\n/**\r\n *\r\n * CheckoutContainer component\r\n * @extends {React.Component}\r\n */\r\n// @ts-ignore\r\n@withModuleState\r\n@observer\r\nclass Checkout extends React.Component {\r\n @computed get cartStatus(): AsyncResultStatus {\r\n return get(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 = get(this.props, 'data.checkout.result.checkoutCart.cart');\r\n\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 = get(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 get(this.props, 'context.request.params.isEditor');\r\n }\r\n\r\n @computed get canPlaceOrder(): boolean {\r\n return this.props.moduleState.isReady && this.state.errorMessage === '';\r\n }\r\n\r\n @computed get canAccessCheckout(): boolean {\r\n const shareholderData = this.props.data.checkout.result?.checkoutCart.cart.ExtensionProperties!;\r\n if (shareholderData) {\r\n return !isShareholderAccountDisabled(shareholderData) && isShareholderAccountNotOnHold(shareholderData);\r\n }\r\n return true;\r\n }\r\n\r\n @computed get canAccessShareholderCheckout(): boolean {\r\n const cartExtensionProps = this.props.data.checkout.result?.checkoutCart.cart.ExtensionProperties || [];\r\n if (this.props.data.checkout.result?.checkoutCart) {\r\n return !(\r\n (!isShareholderAccountNotInactive(cartExtensionProps) || !isShareholderAccountNotOnHold(cartExtensionProps)) &&\r\n this.props.context.request.url.requestUrl.pathname === '/checkout-shareholder-only'\r\n );\r\n }\r\n\r\n // Return true if cart state hasn't been populated yet but checkout status (cartStatus) is still loading / succeeding.\r\n return this.cartStatus === 'SUCCESS' || this.cartStatus === 'LOADING';\r\n }\r\n\r\n @computed public get displayName(): Readonly {\r\n const customer = this.props.data.accountInformation?.result;\r\n return customer ? customer.FirstName || customer.Name : undefined;\r\n }\r\n\r\n @computed public get accountNumber(): Readonly {\r\n return this.props.data.accountInformation.result?.AccountNumber;\r\n }\r\n\r\n public state: ICheckoutState = {\r\n errorMessage: '',\r\n isBulkEmailChecked: undefined,\r\n orderNote: '',\r\n hasEcomPermission: true,\r\n loaded: false\r\n };\r\n\r\n public async componentDidMount(): Promise {\r\n const {\r\n resources: { genericErrorMessage }\r\n } = this.props;\r\n const sessionUserOrderNote = sessionStorage.getItem('order_note');\r\n const cartObj = (await this.props.data.checkout).checkoutCart.cart;\r\n const deliveryMethod = cartObj.DeliveryMode;\r\n\r\n if (isShareholder(cartObj)) {\r\n (Window as any).digitalData.transaction.profile.profileInfo.customerType = 'shareholder';\r\n } else if (isCasual(cartObj)) {\r\n (Window as any).digitalData.transaction.profile.profileInfo.customerType = 'casual';\r\n } else if (isGuest(cartObj)) {\r\n (Window as any).digitalData.transaction.profile.profileInfo.customerType = 'guest';\r\n }\r\n\r\n // Delivery method for analytics\r\n if (deliveryMethod === this.props.app.config.deliveryModeIdDeliveryValue) {\r\n (Window as any).digitalData.transaction.profile.deliveryMethod = 'ship';\r\n } else if (deliveryMethod === this.props.app.config.deliveryModeIdPickupValue) {\r\n (Window as any).digitalData.transaction.profile.deliveryMethod = 'pick-up';\r\n if (cartObj.CartLines) {\r\n (Window as any).digitalData.transaction.profile.fulfillmentStoreId = cartObj.CartLines[0].FulfillmentStoreId;\r\n }\r\n }\r\n if (cartObj.CartLines && cartObj.CartLines.length > 0) {\r\n cartObj.CartLines.forEach((product) => {\r\n let productObj = {\r\n productInfo: {\r\n productName: product.Description,\r\n productId: product.ProductId,\r\n sku: product.ItemId,\r\n unitPrice: product.TotalAmount && product.Quantity ? product.TotalAmount / product.Quantity : 0,\r\n price: product.TotalAmount,\r\n quantity: product.Quantity\r\n }\r\n };\r\n (Window as any).digitalData.product.push(productObj);\r\n (Window as any).digitalData.transaction.profile.item.push(productObj);\r\n });\r\n }\r\n\r\n if (sessionUserOrderNote) {\r\n const userOrderNote = JSON.parse(sessionUserOrderNote);\r\n this.setState({ orderNote: userOrderNote.orderNote });\r\n }\r\n\r\n // @ts-ignore: Compiler not reconizing condition check for function params\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 // @ts-ignore: Compiler not reconizing condition check for function params\r\n when(\r\n () => {\r\n return this.isEmptyCart;\r\n },\r\n () => {\r\n const editCartLink = getUrlSync('cart', this.props.context.actionContext) || '';\r\n if (window && editCartLink) {\r\n // Redirect to cart page if cart is empty\r\n window.location.assign(editCartLink);\r\n } else {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.context.telemetry.error('Cart is empty, but no editCartLink found');\r\n }\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 // check bulk email opt in status for logged in users\r\n if (this.props.context.request.user.token) {\r\n const userContactDetails = await getContactDetailsAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n JSON.parse(atob(this.props.context.request.user.token.split('.')[1])).oid\r\n );\r\n const isOptedInBulkEmails = userContactDetails?.SendBulkEmails;\r\n\r\n if (isOptedInBulkEmails !== 'Allowed') {\r\n this.setState({\r\n isBulkEmailChecked: false\r\n });\r\n }\r\n\r\n if (!hasEcommerceAccess(userContactDetails)) {\r\n this.setState({\r\n hasEcomPermission: false\r\n });\r\n }\r\n }\r\n\r\n when(\r\n () => {\r\n return !this.canAccessShareholderCheckout || !this.canAccessCheckout || !this.state.hasEcomPermission;\r\n },\r\n () => {\r\n const editCartLink = getUrlSync('cart', this.props.context.actionContext) || '';\r\n if (window && editCartLink) {\r\n window.location.assign(editCartLink);\r\n } else {\r\n this.props.context.telemetry.error('Cart is empty, but no editCartLink found');\r\n }\r\n }\r\n );\r\n }\r\n\r\n // tslint:disable-next-line:max-func-body-length\r\n public render(): JSX.Element {\r\n const {\r\n moduleState,\r\n config: { className, checkoutHeading, disableGuidedCheckoutFlow, bulkEmailMessage },\r\n resources\r\n } = this.props;\r\n const { errorMessage } = this.state;\r\n const { placeOrderText, cookieConsentRequiredMessage, genericErrorMessage } = resources;\r\n const checkoutClass = classnames('ms-checkout', className);\r\n const checkoutInformation = this.getSlotItems('checkoutInformation');\r\n const orderNoteMaxCharacter = 200;\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 editCartLink = getUrlSync('cart', this.props.context.actionContext) || '';\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: this.props.data.checkout && this.props.data.checkout.result !== undefined && this.props.data.checkout.result.salesOrder !== undefined,\r\n cartStatus: this.cartStatus,\r\n isMobile,\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 title: checkoutHeading && \r\n };\r\n\r\n if (isConsentGiven === false) {\r\n viewProps = {\r\n ...viewProps,\r\n alert: \r\n };\r\n } else if (!this.cartStatus || this.cartStatus === 'LOADING' || this.isEmptyCart) {\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 if (!this.canAccessShareholderCheckout || !this.canAccessCheckout || !this.state.hasEcomPermission) {\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 ) : undefined,\r\n orderSummary: getOrderSummary(this.props, this.displayName, this.accountNumber),\r\n lineItems: getLineItems(this.props),\r\n placeOrderButton: (\r\n <>\r\n Order notes (optional)\r\n \r\n
\r\n {orderNoteMaxCharacter - this.state.orderNote.length}/{orderNoteMaxCharacter}\r\n
\r\n {this.state.isBulkEmailChecked !== undefined && (\r\n
\r\n {/* tslint:disable-next-line: react-a11y-role-has-required-aria-props */}\r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n )\r\n };\r\n }\r\n if (!this.state.loaded && this.props.data.products.result?.length) {\r\n window.dispatchEvent(new CustomEvent('CheckoutView'));\r\n this.state.loaded = true;\r\n }\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _registerForBulkEmails = async (): Promise => {\r\n if (this.state.isBulkEmailChecked) {\r\n return registerContactForBulkEmailsAsync(\r\n { callerContext: this.props.context.actionContext, queryResultSettings: {} },\r\n JSON.parse(atob(this.props.context.request.user.token.split('.')[1])).oid\r\n );\r\n }\r\n return;\r\n };\r\n\r\n private _updateAttributeArray = async (input: any): Promise => {\r\n if (this.props.data.checkout.result) {\r\n const cart = this.props.data.checkout.result?.checkoutCart.cart;\r\n const cartProperties = [];\r\n if (cart?.ExtensionProperties?.find((prop) => prop.Key === SHAREHOLDER_KEY_VALUE)) {\r\n cartProperties.push({\r\n Key: SHAREHOLDER_KEY_VALUE,\r\n Value: {\r\n BooleanValue: true\r\n }\r\n });\r\n }\r\n await this.props.data.checkout.result?.checkoutCart.updateAttributeValues({ newAttributeValues: input });\r\n\r\n if (cartProperties.length > 0) {\r\n this.props.data.checkout.result?.checkoutCart.cart.ExtensionProperties!.push({\r\n Key: SHAREHOLDER_KEY_VALUE,\r\n Value: {\r\n BooleanValue: true\r\n }\r\n });\r\n }\r\n }\r\n };\r\n private handleOrderNoteBlur = (): void => {\r\n const sessionOrderNote = {\r\n orderNote: this.state.orderNote\r\n };\r\n sessionStorage.setItem('order_note', JSON.stringify(sessionOrderNote));\r\n };\r\n\r\n private orderNoteUpdate = (): void => {\r\n const cart = this.props.data.checkout.result?.checkoutCart.cart;\r\n const cartAttributeArray = cart?.AttributeValues || [];\r\n const salesOrderAttribute: ISalesOrderAttribute = cartAttributeArray?.find((obj) => obj.Name === 'Special instruction') || {};\r\n if (salesOrderAttribute && salesOrderAttribute.TextValue) {\r\n salesOrderAttribute.TextValue = this.state.orderNote;\r\n } else {\r\n const attributeObj = {\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: 'Special instruction',\r\n ExtensionProperties: [],\r\n TextValue: this.state.orderNote,\r\n TextValueTranslations: []\r\n };\r\n attributeObj.Name = 'Special instruction';\r\n cartAttributeArray?.push(attributeObj);\r\n }\r\n if (this.props.data.checkout.result?.checkoutCart.cart.ShippingAddress?.ExtensionProperties) {\r\n const checkoutAddressFlag = this.props.data.checkout.result?.checkoutCart.cart.ShippingAddress?.ExtensionProperties?.find(\r\n (obj) => obj.Key === CHECKOUT_ADDRESS_FLAG\r\n );\r\n if (checkoutAddressFlag) {\r\n const attributeObj = {\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: 'CheckoutAddressFlag',\r\n ExtensionProperties: [],\r\n TextValue: checkoutAddressFlag.Value?.StringValue,\r\n TextValueTranslations: []\r\n };\r\n attributeObj.Name = 'CheckoutAddressFlag';\r\n cartAttributeArray?.push(attributeObj);\r\n }\r\n }\r\n };\r\n\r\n private retrieveSessionStoreAttribute = (sessionStorageValueKey: string, attributeName: string): void => {\r\n const sessionStorageValue = sessionStorage.getItem(sessionStorageValueKey);\r\n const cart = this.props.data.checkout.result?.checkoutCart.cart;\r\n const cartAttributeArray = cart?.AttributeValues || [];\r\n\r\n const salesOrderAttribute: ISalesOrderAttribute = cartAttributeArray?.find((obj) => obj.Name === attributeName) || {};\r\n\r\n // If no session storage value exists, abort function.\r\n if (!sessionStorageValue) {\r\n return;\r\n }\r\n\r\n if (salesOrderAttribute && salesOrderAttribute.TextValue) {\r\n // Update attribute if it exists.\r\n salesOrderAttribute.TextValue = sessionStorageValue;\r\n } else {\r\n // Else create new attribute.\r\n const attributeObj = {\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: attributeName,\r\n ExtensionProperties: [],\r\n TextValue: sessionStorageValue,\r\n TextValueTranslations: []\r\n };\r\n cartAttributeArray?.push(attributeObj);\r\n }\r\n\r\n // Clear sessionStorage value once finished.\r\n window.sessionStorage.removeItem(sessionStorageValueKey);\r\n };\r\n\r\n private handleOrderNoteChange = (e: any): void => {\r\n this.setState({ orderNote: e.target.value });\r\n };\r\n\r\n private handleBulkEmailChange = (): void => {\r\n this.setState({ isBulkEmailChecked: !this.state.isBulkEmailChecked });\r\n };\r\n\r\n private getSlotItems = (key: string): React.ReactNode[] | undefined => {\r\n const { slots } = this.props;\r\n return slots && slots[key] && slots[key].length ? slots[key] : undefined;\r\n };\r\n\r\n private onPlaceOrder = async (): Promise => {\r\n const {\r\n resources: { checkoutOutOfStockErrorMessage, genericErrorMessage },\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 }\r\n } = this.props;\r\n if (enableStockCheck && (await this.isOverMaxQuantity((await checkout).checkoutCart.cart))) {\r\n this.setState({\r\n errorMessage: checkoutOutOfStockErrorMessage\r\n });\r\n this.props.context.telemetry.error(checkoutOutOfStockErrorMessage);\r\n } else {\r\n window.sessionStorage.removeItem('selectedDeliveryMethod');\r\n\r\n // Add additional attribute values to the final cart data through the following function calls\r\n this.orderNoteUpdate();\r\n this.retrieveSessionStoreAttribute('phone', 'Phone Number');\r\n this.retrieveSessionStoreAttribute('customerName', 'Customer Name');\r\n\r\n const hasOrderConfirmation = orderConfirmation && orderConfirmation.length > 0;\r\n\r\n // Update attribute array if any of the following attributes exist.\r\n const cartAttributeArray = this.props.data.checkout.result?.checkoutCart.cart.AttributeValues;\r\n const salesOrderAttribute = cartAttributeArray?.find((obj) => obj.Name === 'Special instruction');\r\n const checkoutAddressAttribute = cartAttributeArray?.find((obj) => obj.Name === 'CheckoutAddressFlag');\r\n const phoneAttribute = cartAttributeArray?.find((obj) => obj.Name === 'Phone Number');\r\n const customerNameAttribute = cartAttributeArray?.find((obj) => obj.Name === 'Customer Name');\r\n const inventoryAvaailabilityMessage = cartAttributeArray?.find((obj) => obj.Name!.includes('Inventory availability '));\r\n\r\n if (\r\n salesOrderAttribute ||\r\n checkoutAddressAttribute ||\r\n phoneAttribute ||\r\n customerNameAttribute ||\r\n inventoryAvaailabilityMessage\r\n ) {\r\n await this._updateAttributeArray([\r\n salesOrderAttribute,\r\n checkoutAddressAttribute,\r\n phoneAttribute,\r\n customerNameAttribute,\r\n inventoryAvaailabilityMessage\r\n ]);\r\n }\r\n\r\n // tslint:disable-next-line: no-floating-promises\r\n this.populateDataLayer();\r\n\r\n await placeOrder(actionContext, this.props.data.checkout.result, this.props.data.products.result, !hasOrderConfirmation).catch(\r\n (error) => {\r\n this.setState({\r\n errorMessage: genericErrorMessage\r\n });\r\n this.props.telemetry.exception(error);\r\n }\r\n );\r\n }\r\n };\r\n\r\n // return true if any product in the cart is over its max quantity\r\n private isOverMaxQuantity = async (cart: Cart): Promise => {\r\n let isOverMaxQuantity = false;\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 if (productInventoryInformation && productInventoryInformation.length > 0) {\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 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 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 populateDataLayer = async () => {\r\n const cart = await get(this.props, 'data.checkout.result.checkoutCart.cart');\r\n if (!cart) {\r\n return;\r\n }\r\n const cartInfo = cart.CartLines;\r\n const cartObj = { transactionTotal: '', totalItems: undefined, transactionProducts: [{}] };\r\n const itemArr: Object[] = [];\r\n cartObj.transactionTotal = cart.AmountDue;\r\n cartObj.totalItems = cart.TotalItems;\r\n for (let i = 0; i < cartInfo.length; i++) {\r\n itemArr.push({\r\n name: cartInfo[i].Description,\r\n sku: cartInfo[i].ItemId,\r\n price: cartInfo[i].Price,\r\n quantity: cartInfo[i].Quantity,\r\n netPrice: cartInfo[i].NetPrice\r\n });\r\n }\r\n cartObj.transactionProducts = itemArr;\r\n sessionStorage.setItem('cart_gtm', JSON.stringify(cartObj));\r\n };\r\n}\r\nexport default Checkout;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { getUrlSync, IActionContext } from '@msdyn365-commerce/core';\r\nimport { ICheckoutState } from '@msdyn365-commerce/global-state';\r\nimport { SalesOrder, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport checkout from './farmlands-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) => {\r\n let salesOrder: SalesOrder;\r\n\r\n // Proceed checkout\r\n try {\r\n salesOrder = await checkout(ctx);\r\n let tenderLines = salesOrder.TenderLines;\r\n let chargeLines = salesOrder.ChargeLines;\r\n\r\n // Shipping cost for analytics\r\n if (chargeLines && chargeLines.length > 0) {\r\n if (chargeLines[0].TaxAmount && chargeLines[0].CalculatedAmount) {\r\n let deliveryCost = chargeLines[0].CalculatedAmount + chargeLines[0].TaxAmount;\r\n (Window as any).digitalData.transaction.profile.total.shippingCost = deliveryCost;\r\n }\r\n }\r\n\r\n // Payment type for analytics\r\n if (tenderLines && tenderLines.length > 0) {\r\n if (tenderLines[0].TenderTypeId === '4') {\r\n (Window as any).digitalData.transaction.profile.paymentMethod = 'account';\r\n }\r\n else if (tenderLines[0].TenderTypeId === '13') {\r\n (Window as any).digitalData.transaction.profile.paymentMethod = 'credit card';\r\n }\r\n }\r\n (Window as any).digitalData.transaction.transactionId = salesOrder.ChannelReferenceId;\r\n\r\n } catch (error) {\r\n throw error;\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 throw error;\r\n }\r\n\r\n if (redirect) {\r\n // Redirec to the order confirmation page\r\n const orderConfirmationUrl = getUrlSync('orderConfirmation', ctx) || '';\r\n if (!orderConfirmationUrl) {\r\n throw new Error('Error: No orderConfirmationUrl');\r\n }\r\n\r\n const separator = orderConfirmationUrl.includes('?') ? '&' : '?';\r\n const url = `${orderConfirmationUrl}${separator}transactionId=${salesOrder.Id}`;\r\n sessionStorage.setItem('transactionData', JSON.stringify((Window as any).digitalData.transaction));\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 throw new Error('Error: Updating error state failed');\r\n }\r\n } else {\r\n throw new Error('Error: No checkout state');\r\n }\r\n }\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ICheckoutViewProps, ILineItem, ILineItemDeliveryGroup, ILineItems, IOrderSummary, IPickUpAtStore } from './farmlands-checkout';\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 LineItemComponent: React.FC = ({ LineItem, item, pickUpAtStore }) => (\r\n \r\n {item}\r\n {pickUpAtStore && }\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 LineItemsComponent: React.FC = ({ LineItems, Header, heading, editLink, itemsForPickup, itemsForShip }) => (\r\n \r\n \r\n {heading}\r\n {editLink}\r\n \r\n {itemsForPickup && }\r\n {itemsForShip && }\r\n \r\n);\r\n\r\nconst OrderSummaryComponent: React.FC = ({ heading, account, lines }) => (\r\n
\r\n {heading}\r\n {account}\r\n
\r\n {lines && (\r\n <>\r\n {lines.subtotal}\r\n {lines.shipping}\r\n {lines.loyalty}\r\n {lines.giftCard}\r\n {lines.orderTotal}\r\n {lines.tax}\r\n {lines.totalDiscounts}\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 bodyProps,\r\n mainProps,\r\n mainControlProps,\r\n sideProps,\r\n orderConfirmation,\r\n loading,\r\n alert,\r\n title,\r\n guidedForm,\r\n orderSummary,\r\n lineItems,\r\n placeOrderButton,\r\n keepShoppingButton,\r\n editCartLink\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n Back to cart\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 \r\n {placeOrderButton}\r\n {keepShoppingButton}\r\n \r\n \r\n \r\n {orderSummary && }\r\n {lineItems && }\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\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IFarmlandsProductCollection containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum layout {\r\n carousel = 'carousel',\r\n grid = 'grid'\r\n}\r\n\r\nexport interface IFarmlandsProductCollectionConfig 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 className?: string;\r\n enableAffiliationBasedPricing?: boolean;\r\n}\r\n\r\nexport interface IFarmlandsProductCollectionResources {\r\n priceFree: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n originalPriceText: string;\r\n currentPriceText: 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 IFarmlandsProductCollectionProps extends Msdyn365.IModule {\r\n resources: IFarmlandsProductCollectionResources;\r\n config: IFarmlandsProductCollectionConfig;\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\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 { ProductComponent } from '@msdyn365-commerce/components';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult, ProjectionDomain } from '@msdyn365-commerce/retail-proxy';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport {\r\n AffiliationLoyaltyTier,\r\n CommerceProperty,\r\n CustomerAffiliation\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport { IFarmlandsProductCollectionProps, layout } from './farmlands-product-collection.props.autogenerated';\r\nexport interface IProductCollectionViewProps extends IFarmlandsProductCollectionProps<{}> {\r\n heading?: React.ReactNode;\r\n ProductCollectionContainer: IModuleProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n GridComponentProps: INodeProps;\r\n products: IProductComponentViewProps[];\r\n isCarousel: boolean;\r\n productPrices?: ProductPrice[];\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}\r\n/**\r\n * ProductCollection component\r\n */\r\nclass ProductCollection extends React.PureComponent, IProductComponentState> {\r\n private telemetryContent: ITelemetryContent;\r\n private productPrices: ProductPrice[];\r\n constructor(props: IFarmlandsProductCollectionProps<{}>) {\r\n super(props);\r\n this.productPrices = [];\r\n this.state = {\r\n products: this.props.config.productCollection && 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 public componentDidMount(): void {\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // tslint:disable-next-line:no-floating-promises\r\n this._getActivePrice();\r\n }\r\n }\r\n public render(): JSX.Element | null {\r\n const { heading, className } = this.props.config;\r\n const { resources } = this.props;\r\n const products = this.state.products;\r\n const isCarousel = this.props.config.layout === layout.carousel;\r\n const headingComponent = heading && (\r\n \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: resources.flipperPrevious,\r\n flipperNextLabel: 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 isCarousel: isCarousel,\r\n products:\r\n products &&\r\n products.length > 0 &&\r\n products.map((item: ProductSearchResult, index: number) => this._getProduct(item, index)),\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\r\n }\r\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) =>\r\n (this.props.config.heading!.text = event.target.value);\r\n\r\n private _getProduct = (product: ProductSearchResult, index: number): 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 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: (\r\n \r\n )\r\n };\r\n };\r\n private _getActivePrice = async (): Promise => {\r\n let products = this.state.products || [];\r\n const productRecIds = products && products.length > 0 ? 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 affliations: AffiliationLoyaltyTier[] = [];\r\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\r\n\r\n if (customer && customer.CustomerAffiliations) {\r\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\r\n const aff: AffiliationLoyaltyTier = {\r\n AffiliationId: affliation.RetailAffiliationId,\r\n CustomerId: customer.AccountNumber\r\n };\r\n affliations.push(aff);\r\n });\r\n }\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 const priceIncGST = activePrice.ExtensionProperties?.find(\r\n (prop: CommerceProperty) => prop.Key === 'BasePriceWithGST'\r\n )?.Value?.DecimalValue;\r\n const specialPriceIncGST = activePrice.ExtensionProperties?.find(\r\n (prop: CommerceProperty) => prop.Key === 'ItemPriceWithGST'\r\n )?.Value?.DecimalValue;\r\n prod.ExtensionProperties?.forEach((property) => {\r\n if (property.Key === 'BasePriceWithGST' && property.Value?.DecimalValue) {\r\n property.Value.DecimalValue = priceIncGST;\r\n }\r\n if (property.Key === 'ItemPriceWithGST' && property.Value?.DecimalValue) {\r\n property.Value.DecimalValue = specialPriceIncGST;\r\n }\r\n });\r\n }\r\n return prod;\r\n });\r\n this.setState({\r\n products: 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 Product Collection]Error executing action`\r\n );\r\n throw new Error('[get Affiliation based price on Product Collection]Error executing action');\r\n });\r\n };\r\n}\r\n\r\nexport default ProductCollection;\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './farmlands-product-collection';\r\n\r\nconst ProductCollectionView: React.FC = props => {\r\n const { heading, ProductCollectionContainer, products, SingleSlideCarouselComponentProps, GridComponentProps, isCarousel } = props;\r\n if (products) {\r\n return (\r\n \r\n {heading}\r\n {\r\n isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)\r\n }\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 (\r\n \r\n {items && items.map(_renderProduct)}\r\n \r\n );\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return (\r\n \r\n {items && items.map(_renderProduct)}\r\n \r\n );\r\n};\r\n\r\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\r\n const { ProductContainer, productComponent } = product;\r\n\r\n return (\r\n \r\n {productComponent}\r\n \r\n );\r\n};\r\n\r\nexport default ProductCollectionView;","/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\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 }) => ( {text} );","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IFarmlandsSearchResultContainerResources } from '../farmlands-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IFarmlandsSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\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}) => {\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 * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent ,onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image} from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport { IFarmlandsSearchResultContainerResources } from '../farmlands-search-result-container.props.autogenerated';\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: IFarmlandsSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\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}) => {\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\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(imageSettings, context.request.gridSettings, product.PrimaryImageUrl, product.Name, fallbackImage)}\r\n
\r\n
\r\n
\r\n

{resources.featureSimilarLooksTitle}

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n\r\n};\r\n\r\nfunction renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, altText?: string, fallbackImage?: string,): 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: gridSettings,\r\n imageSettings: imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\nreturn

{title}

;\r\n}","/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\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","/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => ( {separator} );","/**\r\n * AttributeDataType enum type.\r\n */\r\nexport enum AttributeDataType {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Currency member.\r\n */\r\n Currency = 1,\r\n /**\r\n * The DateTime member.\r\n */\r\n DateTime = 2,\r\n /**\r\n * The Decimal member.\r\n */\r\n Decimal = 3,\r\n /**\r\n * The Integer member.\r\n */\r\n Integer = 4,\r\n /**\r\n * The Text member.\r\n */\r\n Text = 5,\r\n /**\r\n * The TrueFalse member.\r\n */\r\n TrueFalse = 6,\r\n /**\r\n * The Video member.\r\n */\r\n Video = 40,\r\n /**\r\n * The Image member.\r\n */\r\n Image = 41\r\n}\r\n\r\n/**\r\n * RefinerType enum type.\r\n */\r\nexport enum RefinerType {\r\n /**\r\n * The SingleSelect member.\r\n */\r\n SingleSelect = 0,\r\n /**\r\n * The MultiSelect member.\r\n */\r\n MultiSelect = 1,\r\n /**\r\n * The FreeText member.\r\n */\r\n FreeText = 2\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n */\r\n None = 0,\r\n /**\r\n * The Attribute member.\r\n */\r\n Attribute = 1,\r\n /**\r\n * The Category member.\r\n */\r\n Category = 2,\r\n /**\r\n * The Price member.\r\n */\r\n Price = 3,\r\n /**\r\n * The Rating member.\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * DisplayTemplate enum type.\r\n */\r\nexport enum DisplayTemplate {\r\n /**\r\n * The List member.\r\n */\r\n List = 0,\r\n /**\r\n * The Slider member.\r\n */\r\n Slider = 1,\r\n /**\r\n * The SliderWithBars member.\r\n */\r\n SliderWithBars = 2,\r\n /**\r\n * The Range member.\r\n */\r\n Range = 3,\r\n /**\r\n * The TextBox member.\r\n */\r\n TextBox = 4\r\n}\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as Constants from '../types/CommerceTypes';\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 const 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 const 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 const 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 * 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 * 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 * 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 * 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 */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === Constants.AttributeDataType.Currency ||\r\n dataTypeValue === Constants.AttributeDataType.Decimal ||\r\n dataTypeValue === Constants.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 */\r\nexport function isMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriterion: ProductRefinerValue\r\n): 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 === Constants.AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === Constants.AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === Constants.RefinerType.SingleSelect\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (\r\n child.RefinerRecordId === next.RefinerRecordId &&\r\n child.LeftValueBoundString === next.LeftValueBoundString\r\n ) {\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: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/* tslint:disable: no-duplicate-imports */\r\nimport { 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\nimport { formatPrice } from './utilities';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\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 gstRate: number;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: 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}\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 _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private minInput: React.RefObject;\r\n private maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n // return this.props.productRefinerValue.UnitText || '';\r\n // TODO: temporary hard coded currencyCode\r\n return 'NZD' || '';\r\n }\r\n\r\n 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 && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n const initialMax =\r\n (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\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 };\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 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(\r\n '{0}',\r\n parentProductRefinerHierarchy.KeyName || ''\r\n );\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 {\r\n isDisabled,\r\n productRefinerValue,\r\n parentProductRefinerHierarchy,\r\n selectedRefinementCriterion,\r\n gstRate\r\n } = this.props;\r\n const gstPercentage = gstRate / 100 + 1;\r\n // convert to GST inclusive prices as the API returns GST exclusive prices\r\n const min = (Number(productRefinerValue.LeftValueBoundString) * gstPercentage).toFixed(2);\r\n const max = (Number(productRefinerValue.RightValueBoundString) * gstPercentage).toFixed(2);\r\n const selectedMin =\r\n (selectedRefinementCriterion &&\r\n (Number(selectedRefinementCriterion.LeftValueBoundString) * gstPercentage).toFixed(2)) ||\r\n min.toString() ||\r\n '0';\r\n const selectedMax =\r\n (selectedRefinementCriterion &&\r\n (Number(selectedRefinementCriterion.RightValueBoundString) * gstPercentage).toFixed(2)) ||\r\n max.toString();\r\n const sliderId = `slider_${parentProductRefinerHierarchy.RecordId}_${productRefinerValue.RefinerRecordId}`;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n const minPrice = this._formatPrice(min.toString());\r\n const maxPrice = this._formatPrice(max.toString());\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\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: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n } else {\r\n this._focus('Min');\r\n }\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: parentProductRefinerHierarchy,\r\n productRefinerValue: 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 const locale = this.props.refineItemCommonProps.locale;\r\n const result = formatPrice(amount, this.currencyCode, locale, this.props.refineItemCommonProps.telemetry);\r\n\r\n if (amount !== undefined && !this._formattedPriceReverseLookup.has(result)) {\r\n this._formattedPriceReverseLookup.set(result, amount);\r\n }\r\n\r\n return result;\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 // tslint:disable-next-line:no-any\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: parentProductRefinerHierarchy,\r\n productRefinerValue: 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 // tslint:disable-next-line\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: parentProductRefinerHierarchy,\r\n productRefinerValue: 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 // tslint:disable-next-line\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","/* tslint:disable: no-duplicate-imports */\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n IPayLoad,\r\n ITelemetryContent\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport * as Constants from '../types/CommerceTypes';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\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 /** 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 anchorType: React.RefObject;\r\n private 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 // tslint:disable-next-line:max-func-body-length\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 === Constants.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 === Constants.ProductRefinerSource.Rating) {\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 = 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 = 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 } else {\r\n return undefined;\r\n }\r\n } else {\r\n this.payLoad.contentAction.etext =\r\n productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n return (\r\n
  • \r\n \r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString ||\r\n productRefinerValue.LeftValueBoundString}\r\n {/* TODO: MS bug - #2107010060000356 filed. Below temporarilly removes the number count.*/}\r\n {/* {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`} */}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const {\r\n urlBuilder,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n const analyticsEvent = {\r\n eventName: \"CategoryFilter\",\r\n eventAction: \"CategoryFilter\",\r\n timeStamp: new Date(),\r\n location: document.location.href,\r\n attribute: {\r\n isToggledOn: false,\r\n category: productRefinerValue.LeftValueBoundString\r\n }\r\n }\r\n if (selectedRefinementCriterion) {\r\n analyticsEvent.attribute.isToggledOn = false;\r\n }\r\n else {\r\n analyticsEvent.attribute.isToggledOn = true;\r\n }\r\n (Window as any).digitalData.event.push(analyticsEvent);\r\n window.dispatchEvent(new CustomEvent('CategoryFilter'));\r\n\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: 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","/* tslint:disable: no-duplicate-imports */\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport classnames from 'classnames';\r\nimport { get } from 'lodash';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\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.Component {\r\n private closeButtonGlyph: string = 'msi-close-btn';\r\n private 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, gstPercentage } = 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 const gstRate = gstPercentage / 100 + 1;\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 let rangeIncGST;\r\n // find the numbers in the price range string and replace with GST inclusive amounts\r\n if (item.value.DataTypeValue === 1) {\r\n const priceRange = item.key.match(/\\b\\d[\\d,.]*\\b/g);\r\n const priceRangeIncGST = priceRange?.map((price) =>\r\n this._numberWithCommas((Number(price.replace(/,/g, '')) * gstRate).toFixed(2))\r\n );\r\n rangeIncGST = this._replaceCumulative(item.key, priceRange, priceRangeIncGST);\r\n }\r\n return (\r\n
    • \r\n \r\n {rangeIncGST || 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 _replaceCumulative(str: string, find: any, replace: any): string {\r\n for (let i = 0; i < find.length; i++) {\r\n str = str.replace(new RegExp(find[i], 'g'), replace[i]);\r\n }\r\n return str;\r\n }\r\n private _numberWithCommas(x: string): string {\r\n return x.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\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) =>\r\n isMatchingRefinementCriterion(value, productRefinerValue)\r\n )\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(\r\n '{0}',\r\n this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText)\r\n )\r\n .replace(\r\n '{1}',\r\n this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText)\r\n );\r\n } else {\r\n refinerValueName =\r\n 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 const priceAmount = (amount && Number(amount)) || 0;\r\n const locale = get(this.props, 'context.request.locale', 'en-US');\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: currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (e) {\r\n result = `${priceAmount} ${currency}`;\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${e}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.indexOf('choice-summary__clear-all') > -1;\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n const analyticsEvent = {\r\n eventName: \"CategoryFilter\",\r\n eventAction: \"CategoryFilter\",\r\n timeStamp: new Date(),\r\n location: document.location.href,\r\n attribute: {\r\n isToggledOn: false,\r\n category: this._getSelectedRefinerChoice(target)?.LeftValueBoundString,\r\n }\r\n };\r\n (Window as any).digitalData.event.push(analyticsEvent);\r\n window.dispatchEvent(new CustomEvent('CategoryFilter'));\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll: 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.innerText && itemClicked.innerText.trim()) === selected.key\r\n );\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\n/* tslint:disable: no-duplicate-imports */\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 * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as Constants from '../types/CommerceTypes';\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { findMatchingRefinementCriterion, isRangeType, ProductRefinerSource } 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 /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n gstRate: number;\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 // 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 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 // Commented out the below sort by rating logic as it is not required for initial release.\r\n if (\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating &&\r\n this.props.context.app.config.hideRating\r\n ) {\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 === Constants.RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === Constants.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 === Constants.DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === Constants.DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === Constants.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 gstRate\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 (\r\n
      {listItems}
    \r\n );\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","/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\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 * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IFarmlandsSearchResultContainer contentModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n zero = 'zero',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IFarmlandsSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n gstRate: number;\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n className?: string;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n}\r\n\r\nexport interface IFarmlandsSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: 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 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}\r\n\r\nexport interface IFarmlandsSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IFarmlandsSearchResultContainerResources;\r\n config: IFarmlandsSearchResultContainerConfig;\r\n}\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { ArrayExtensions, getCustomer, GetCustomerInput } 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 { CategoryHierarchy as CategoryHierarchyData, IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\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 {\r\n AffiliationLoyaltyTier,\r\n CommerceProperty,\r\n CustomerAffiliation\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\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\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n parseQueryParam,\r\n sortOptions\r\n} from './actions';\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 { IFarmlandsSearchResultContainerData } from './farmlands-search-result-container.data';\r\nimport { expandRefinersCount, IFarmlandsSearchResultContainerProps } from './farmlands-search-result-container.props.autogenerated';\r\n\r\nexport interface ISearchResultContainerViewProps extends IFarmlandsSearchResultContainerProps {\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}\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 IFarmlandsSearchResultContainerProps,\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 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 // Commented out the below sort by rating logic as it is not required for initial release.\r\n // { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n ];\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n private _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private _modalToggleRef: React.RefObject;\r\n private _sortAndFilterContainerRef: React.RefObject;\r\n private expandrefinerCount: number | undefined = 0;\r\n private telemetryContent: ITelemetryContent;\r\n private productPrices: ProductPrice[];\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: IFarmlandsSearchResultContainerProps, 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 };\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 // 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 this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes === true\r\n ? true\r\n : false,\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 // tslint:disable-next-line:no-floating-promises\r\n this._getActivePrice();\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 // tslint:disable-next-line:no-floating-promises\r\n this._getActivePrice();\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, allowBackNavigation } = 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 const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = (\r\n \r\n );\r\n\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 \r\n \r\n arrow_drop_down\r\n \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 _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 affliations: AffiliationLoyaltyTier[] = [];\r\n const customerInput = new GetCustomerInput(this.props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, this.props.context.actionContext);\r\n\r\n if (customer && customer.CustomerAffiliations) {\r\n customer.CustomerAffiliations.forEach((affliation: CustomerAffiliation) => {\r\n const aff: AffiliationLoyaltyTier = {\r\n AffiliationId: affliation.RetailAffiliationId,\r\n CustomerId: customer.AccountNumber\r\n };\r\n affliations.push(aff);\r\n });\r\n }\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 const priceIncGST = activePrice.ExtensionProperties?.find(\r\n (prop: CommerceProperty) => prop.Key === 'BasePriceWithGST'\r\n )?.Value?.DecimalValue;\r\n const specialPriceIncGST = activePrice.ExtensionProperties?.find(\r\n (prop: CommerceProperty) => prop.Key === 'ItemPriceWithGST'\r\n )?.Value?.DecimalValue;\r\n prod.ExtensionProperties?.forEach((property) => {\r\n if (property.Key === 'BasePriceWithGST' && property.Value?.DecimalValue) {\r\n property.Value.DecimalValue = priceIncGST;\r\n }\r\n if (property.Key === 'ItemPriceWithGST' && property.Value?.DecimalValue) {\r\n property.Value.DecimalValue = specialPriceIncGST;\r\n }\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 private _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 _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 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' },\r\n title: {\r\n titlePrefix: titlePrefix,\r\n titleText: titleText,\r\n titleCount: titleCount\r\n }\r\n };\r\n };\r\n private _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 _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\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={this.sortByDropdownOptions}\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 _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 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={\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'>{previousText}</span>\r\n </div>\r\n }\r\n nextText={\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{nextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n }\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private _getRefineMenu = (): IRefineMenuViewProps => {\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 data.refiners.result &&\r\n data.refiners.result.filter((refiner) => {\r\n return refiner.Values.length > 0;\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 validRefiners.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 ? true : false}\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 gstRate={config.gstRate}\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 _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry, config } = 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-ignore: 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 gstPercentage={config.gstRate}\r\n />\r\n );\r\n };\r\n\r\n private _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 _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 _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 _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 const { gstRate } = this.props.config;\r\n const gstPercentage = gstRate / 100 + 1;\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 const priceFilter = updatedRefinementCriteria.find((props) => props.DataTypeValue === 1);\r\n // remove GST from the price filter as API call takes GST exclusive prices to filter the items\r\n if (priceFilter) {\r\n priceFilter.LeftValueBoundString = (Number(priceFilter.LeftValueBoundString) / gstPercentage).toFixed(2).toString();\r\n priceFilter.RightValueBoundString = (Number(priceFilter.RightValueBoundString) / gstPercentage).toFixed(2).toString();\r\n const indexOfItemInArray = updatedRefinementCriteria.findIndex((criteria) => criteria.DataTypeValue === 1);\r\n\r\n if (indexOfItemInArray > -1) {\r\n updatedRefinementCriteria[indexOfItemInArray] = priceFilter;\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 _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 } else {\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\r\n private _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 _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 } else {\r\n return 'xl';\r\n }\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 _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.zero:\r\n this.expandrefinerCount = 0;\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","/* tslint:disable: no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport { ICategoryHierarchyViewProps, IRefineMenuViewProps, ISearchResultContainerViewProps, ISortByViewProps, ITitleViewProps } from './farmlands-search-result-container';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const { SearchResultContainer, products, pagination, ProductsContainer, ProductSectionContainer, choiceSummary, isMobile, modalToggle, searchResultModal, TitleViewProps,\r\n refineMenu, categoryHierarchy, sortByOptions, CategoryNavContainer, RefineAndProductSectionContainer, errorMessage, FeatureSearchContainer, similarLookProduct } = props;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && renderRefiner(refineMenu)}\r\n <Node {...ProductSectionContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {sortByOptions && renderSort(sortByOptions)}\r\n <Node {...FeatureSearchContainer}>\r\n {similarLookProduct}\r\n </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 );\r\n\r\n};\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {}, modalProps.modalHeader, createModalBody(modalProps, refineMenu, sortByDropDown), modalProps.modalFooter);\r\n};\r\n\r\nconst createModalBody = (props: ISearchResultModalViewProps, refineMenu: IRefineMenuViewProps, sortByDropDown: ISortByViewProps): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown), 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 <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>\r\n {submenu}\r\n </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): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return (\r\n <Node {...SortingContainer}>\r\n {sortByDropDown}\r\n </Node>\r\n );\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, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n <h5 className=\"ms-search-result__collection-title-count--product-section\">\r\n {title.titleCount}\r\n </h5>\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n {title.titleCount}\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;","/* tslint:disable: no-duplicate-imports */\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType, createObservableDataAction, IAction, IActionContext, IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { SearchSuggestion, SearchSuggestionCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getSearchSuggestionsAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\n\r\n// @ts-ignore\r\nexport const enum SuggestionType {\r\n Category = 'ScopedCategory',\r\n Keyword = 'Keyword',\r\n Product = 'Product',\r\n None = 'None'\r\n}\r\n\r\n/**\r\n * Input class for auto suggest search input\r\n */\r\nexport class AutoSuggestInput implements IActionInput {\r\n public searchQuery?: string;\r\n public topResultsCount?: number;\r\n public suggestionType?: string;\r\n public hitPrefix?: string;\r\n public hitSuffix?: string;\r\n\r\n constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\r\n this.searchQuery = searchText;\r\n this.topResultsCount = top;\r\n this.suggestionType = suggestionType;\r\n this.hitPrefix = hitPrefix;\r\n this.hitSuffix = hitSuffix;\r\n }\r\n\r\n public getCacheKey = () => `AutoSuggestSearchSuggestions`;\r\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\r\n public dataCacheType = (): CacheType => 'none';\r\n}\r\n\r\nconst createInput = (inputData: ICreateActionContext) => {\r\n return new AutoSuggestInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a auto-suggest suggestions\r\n */\r\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise<Autosuggestions | null> {\r\n // If no input is provided fail out\r\n if (!input || !input.searchQuery) {\r\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\r\n }\r\n\r\n const autosuggest: Autosuggestions = {};\r\n\r\n const autoSuggestPromises = [\r\n _getAutoSuggest(input, autosuggest, ctx),\r\n ];\r\n return Promise.all(autoSuggestPromises).then(() => {\r\n return autosuggest;\r\n });\r\n}\r\n\r\nasync function _getAutoSuggest(\r\n input: AutoSuggestInput,\r\n autosuggest: Autosuggestions,\r\n ctx: IActionContext\r\n): Promise<void> {\r\n const searchCriteria: SearchSuggestionCriteria = {\r\n ProductSearchCriteria: {\r\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n },\r\n HitPrefix: input.hitPrefix,\r\n HitSuffix: input.hitSuffix,\r\n SuggestionType: input.suggestionType\r\n };\r\n\r\n const searchSuggestions = await getSearchSuggestionsAsync(\r\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\r\n searchCriteria\r\n );\r\n\r\n if (searchSuggestions && searchSuggestions.length > 0) {\r\n // Generate image url\r\n searchSuggestions.map(\r\n (item: SearchSuggestion) =>\r\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\r\n );\r\n\r\n autosuggest.AllSearchResults = searchSuggestions;\r\n } else {\r\n ctx.telemetry.error(`[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`);\r\n }\r\n}\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\r\n action: <IAction<Autosuggestions>>getSearchSuggestionsAction,\r\n input: createInput\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { CommerceProperty, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n NodeTag\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { IFarmlandsSearchData } from '../farmlands-search.data';\r\nimport { IFarmlandsSearchProps } from '../farmlands-search.props.autogenerated';\r\n\r\nexport interface ISearchProductSuggestProps {\r\n searchProductSuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IFarmlandsSearchProps<IFarmlandsSearchData>;\r\n searchText: string;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetry: ITelemetry;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchProductViewProps {\r\n // title: React.ReactNode;\r\n items: ISearchProductItemViewProps[];\r\n}\r\n\r\nexport interface ISearchProductItemViewProps {\r\n text: React.ReactNode;\r\n thumbnail: React.ReactNode;\r\n price: React.ReactNode;\r\n LiProduct: INodeProps;\r\n AProduct: INodeProps;\r\n id: string | undefined;\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\nlet telemetryContent: ITelemetryContent | undefined;\r\n\r\n/**\r\n *\r\n * ProductSuggestionsComponent\r\n */\r\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\r\n const {\r\n suggestions,\r\n hitSuffix,\r\n hitPrefix,\r\n autoSuggestProps: {\r\n context: { actionContext }\r\n // resources: { productSuggestionHeading }\r\n },\r\n moduleType,\r\n moduleId\r\n } = props;\r\n const reactNodes: ISearchProductItemViewProps[] = [];\r\n telemetryContent = props.telemetryContent;\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n suggestions.map((item) => {\r\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\r\n });\r\n\r\n // const titleNode = _renderTitle(productSuggestionHeading);\r\n\r\n return { items: reactNodes };\r\n};\r\n\r\n// const _renderTitle = (productSuggestionHeading: string) => {\r\n// const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\r\n\r\n// return <li className='msc-autoSuggest__productResults-title'>{productAutoSuggestionHeading}</li>;\r\n// };\r\n\r\nconst _assembleNode = (\r\n item: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext,\r\n props: ISearchProductSuggestProps,\r\n moduleType: string,\r\n moduleId: string\r\n): ISearchProductItemViewProps => {\r\n const altText =\r\n item.Value &&\r\n item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n const adjustedPriceIncGST = item.ExtensionProperties?.find(\r\n (prop: CommerceProperty) => prop.Key === 'AdjustedPriceIncGST'\r\n )?.Value?.DecimalValue;\r\n\r\n return {\r\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\r\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\r\n price:\r\n item.Id &&\r\n adjustedPriceIncGST &&\r\n _renderPrice(adjustedPriceIncGST, adjustedPriceIncGST, moduleId, moduleType, props),\r\n LiProduct: _getLiWrapper(),\r\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext),\r\n id: item.Id\r\n };\r\n};\r\n\r\nconst _getLiWrapper = () => {\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'li' as NodeTag\r\n };\r\n};\r\n\r\nconst _getAWrapper = (item: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\r\n const ariaLabel =\r\n item.Value &&\r\n item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n\r\n payLoad.contentAction.recid = item.Id;\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n return {\r\n className: 'msc-autoSuggest__productResults-item',\r\n tag: 'a' as NodeTag,\r\n 'aria-label': ariaLabel,\r\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\r\n ...attribute\r\n };\r\n};\r\n\r\nconst _generateLink = (\r\n suggestion: SearchSuggestion,\r\n hitPrefix: string,\r\n hitSuffix: string,\r\n actionContext: IActionContext\r\n) => {\r\n const formattedLink = (suggestion.Value as string)\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n return suggestion.Value && suggestion.Id\r\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\r\n : '';\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n const formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return (\r\n <span\r\n className='msc-price msc-autoSuggest__productResults-item-text'\r\n dangerouslySetInnerHTML={getRichTextHtml(formattedText)}\r\n />\r\n );\r\n};\r\n\r\nconst _renderPrice = (\r\n adjustedPrice: number,\r\n basePrice: number,\r\n moduleId: string,\r\n moduleType: string,\r\n props: ISearchProductSuggestProps\r\n): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: { context }\r\n } = props;\r\n\r\n return (\r\n <PriceComponent\r\n id={moduleId}\r\n typeName={moduleType}\r\n context={context}\r\n data={{\r\n price: {\r\n CustomerContextualPrice: adjustedPrice,\r\n BasePrice: basePrice\r\n }\r\n }}\r\n className='msc-autoSuggest__productResults-item-price'\r\n />\r\n );\r\n};\r\n\r\nconst _renderThumbnail = (\r\n suggestion: SearchSuggestion,\r\n altText: string,\r\n props: ISearchProductSuggestProps\r\n): JSX.Element | null => {\r\n const {\r\n autoSuggestProps: {\r\n context: {\r\n request: { gridSettings }\r\n },\r\n config: { imageSettings }\r\n }\r\n } = props;\r\n\r\n if (!suggestion || !suggestion.ImageUrl) {\r\n props.telemetry.error('Search suggestion content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=40&h=40&m=6`, w: 0, h: 0 },\r\n xl: { q: `w=40&h=40&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n return (\r\n <Image\r\n altText={altText}\r\n className='msc-autoSuggest__productResults-item-img'\r\n src={suggestion.ImageUrl}\r\n gridSettings={gridSettings!}\r\n imageSettings={imageSettings ? imageSettings : defaultImageSettings}\r\n loadFailureBehavior='hide'\r\n />\r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\nimport { getRichTextHtml } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { IFarmlandsSearchData } from '../farmlands-search.data';\r\nimport { IFarmlandsSearchProps } from '../farmlands-search.props.autogenerated';\r\n\r\nexport interface ISearchCategorySuggestProps {\r\n searchCategorySuggestClass: string;\r\n searchPageURL: string;\r\n searchQsp: string | undefined;\r\n hitPrefix: string;\r\n hitSuffix: string;\r\n autoSuggestProps: IFarmlandsSearchProps<IFarmlandsSearchData>;\r\n searchText: string;\r\n searchRefiners: ProductRefiner[] | undefined;\r\n suggestions: SearchSuggestion[] | undefined;\r\n telemetryContent?: ITelemetryContent;\r\n}\r\n\r\nexport interface ISearchCategoryViewProps {\r\n title: React.ReactNode;\r\n text: React.ReactNode[];\r\n}\r\n\r\nlet payLoad: IPayLoad;\r\n\r\n/**\r\n *\r\n * CategorySuggestionsComponent\r\n */\r\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\r\n const {\r\n suggestions,\r\n searchText,\r\n autoSuggestProps: {\r\n resources: { categorySuggestionHeading }\r\n }\r\n } = props;\r\n\r\n if (!suggestions) {\r\n return undefined;\r\n }\r\n\r\n const reactNodes: React.ReactNode[] = [];\r\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\r\n\r\n suggestions.map(item => {\r\n reactNodes.push(_assembleNode(item, props));\r\n });\r\n\r\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\r\n\r\n return { title: titleNode, text: reactNodes };\r\n};\r\n\r\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\r\n const categoryAutoSuggestionHeading = categorySuggestionHeading\r\n ? format(categorySuggestionHeading, searchText)\r\n : `Search \"${searchText}\" in categories`;\r\n\r\n return <li className='msc-autoSuggest__categoryResults-title'>{categoryAutoSuggestionHeading}</li>;\r\n};\r\n\r\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\r\n const { searchText, hitPrefix, hitSuffix } = props;\r\n\r\n const splitValue = item.Value && item.Value.split('|').pop();\r\n const ariaLabel = splitValue\r\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\r\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\r\n payLoad.contentAction.etext = item.Value;\r\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n return (\r\n <li className='msc-autoSuggest__categoryResults-item' key={item.Id}>\r\n <a aria-label={ariaLabel} href={_generateLink(item, searchText, props)} {...attribute}>\r\n {_generateLink(item, searchText, props) && _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix)}\r\n </a>\r\n </li>\r\n );\r\n};\r\n\r\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\r\n};\r\n\r\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\r\n const { searchPageURL, searchQsp, searchRefiners } = props;\r\n\r\n const route = searchPageURL || '';\r\n const urlPath = `${route}${route.indexOf('?') === -1 ? '?' : '&'}${searchQsp}=${searchText}`;\r\n const categoryRefiners =\r\n searchRefiners &&\r\n searchRefiners.find(refiners => {\r\n return refiners.KeyName === 'Category';\r\n });\r\n const refiner =\r\n categoryRefiners &&\r\n categoryRefiners.Values &&\r\n categoryRefiners.Values.find(item => {\r\n return item.RefinerRecordId === parseInt(id, 10);\r\n });\r\n\r\n const encodedRefiner = refiner && encodeURIComponent(JSON.stringify(compressRefiners([refiner])));\r\n\r\n return encodedRefiner ? `${urlPath}&refiners=${encodedRefiner}` : urlPath;\r\n};\r\n\r\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\r\n let formattedText = suggestion\r\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '<strong>')\r\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '</strong>');\r\n formattedText = formattedText.split('|').pop() || '';\r\n\r\n // tslint:disable:react-no-dangerous-html\r\n return <span dangerouslySetInnerHTML={getRichTextHtml(formattedText)} />;\r\n};\r\n\r\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\r\n// or move this code to a common place\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs\r\n * @param refiners The uncompressed refiners\r\n */\r\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach((refiner) => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach((refinerKey) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchFormProps {\r\n hideSearchLabel: boolean | undefined;\r\n isSearchFormExpanded: boolean | undefined;\r\n disableSubmitSearch: boolean | undefined;\r\n searchTextInput: React.RefObject<HTMLInputElement>;\r\n maxChars: number;\r\n searchQsp: string;\r\n searchPlaceholder: string;\r\n query: string;\r\n ariaLabelCancel: string;\r\n ariaLabelSearch: string;\r\n ariaLabelSubmit: string;\r\n handleCancelSearchChange(): void;\r\n handleInputChange(query: string): void;\r\n}\r\n\r\nexport interface ISearchFormViewProps {\r\n input: React.ReactNode;\r\n submitBtn: React.ReactNode;\r\n cancelBtn: React.ReactNode;\r\n\r\n}\r\n\r\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\r\n const {\r\n searchQsp,\r\n searchPlaceholder,\r\n hideSearchLabel,\r\n isSearchFormExpanded,\r\n searchTextInput,\r\n handleInputChange,\r\n maxChars,\r\n disableSubmitSearch,\r\n handleCancelSearchChange,\r\n query,\r\n ariaLabelCancel,\r\n ariaLabelSearch,\r\n ariaLabelSubmit\r\n } = props;\r\n\r\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\r\n handleInputChange(e.target.value || '');\r\n };\r\n\r\n const inputNode = !hideSearchLabel ? (\r\n <input\r\n className='ms-search__form-control'\r\n type='text'\r\n aria-label={isSearchFormExpanded ? 'Search expanded' : 'Search collapsed'}\r\n name={searchQsp}\r\n placeholder={searchPlaceholder}\r\n ref={searchTextInput}\r\n onChange={onInputChange}\r\n maxLength={maxChars}\r\n value={query}\r\n />\r\n ) : (\r\n <input\r\n className='ms-search__form-control'\r\n type='text'\r\n aria-label={ariaLabelSearch}\r\n name={searchQsp}\r\n placeholder={searchPlaceholder}\r\n ref={searchTextInput}\r\n onChange={onInputChange}\r\n value={query}\r\n />\r\n );\r\n\r\n const submitBtnNode = !disableSubmitSearch && (\r\n <button className='material-icons Header-container-secondary__search-icon' aria-label={ariaLabelSubmit}>search</button>\r\n );\r\n\r\n const cancelBtNoden = (\r\n <Button\r\n className={!disableSubmitSearch ? 'ms-search__form-cancelSearch' : 'ms-search__form-cancelSearchNoSumbit'}\r\n aria-label={ariaLabelCancel}\r\n onClick={handleCancelSearchChange}\r\n type='button'\r\n />\r\n );\r\n\r\n return {input: inputNode, cancelBtn: cancelBtNoden, submitBtn: submitBtnNode};\r\n};","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface ISearchLabelProps {\r\n isSearchFormExpanded: boolean;\r\n searchLabelClass: string;\r\n searchLabelArialLabel: string;\r\n searchtext: string;\r\n searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\r\n hideSearchLabel?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n handleCancelSearchChange(): void;\r\n}\r\n\r\nexport const LabelComponent = (props: ISearchLabelProps) => {\r\n const { searchLabelClass, searchLabelArialLabel, isSearchFormExpanded, searchtext, searchCollapsedLabel, hideSearchLabel, handleCancelSearchChange, telemetryContent} = props;\r\n const payLoad = getPayloadObject('click', telemetryContent, searchtext, '');\r\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\r\n\r\n return (\r\n <div className={searchLabelClass}>\r\n <Button\r\n className='ms-search__icon'\r\n aria-expanded={isSearchFormExpanded}\r\n aria-label={searchLabelArialLabel}\r\n onClick={handleCancelSearchChange}\r\n innerRef={searchCollapsedLabel}\r\n {...attributes}\r\n >\r\n {!hideSearchLabel && <span className='ms-search__icon-text' aria-hidden={true}>{searchtext}</span>}\r\n </Button>\r\n </div>\r\n );\r\n};\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\r\nimport {\r\n getTelemetryObject,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n KeyCodes\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\r\nimport { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { ProductRefiner } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport classnames from 'classnames';\r\nimport { debounce } from 'lodash';\r\nimport * as React from 'react';\r\n\r\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\r\nimport {\r\n CategorySuggestionsComponent,\r\n FormComponent,\r\n ISearchCategoryViewProps,\r\n // ISearchKeywordViewProps,\r\n ISearchProductViewProps,\r\n // KeywordSuggestionsComponent,\r\n LabelComponent,\r\n ProductSuggestionsComponent\r\n} from './components';\r\nimport { IFarmlandsSearchData } from './farmlands-search.data';\r\nimport { IFarmlandsSearchProps, ISuggestionTypeCriterionData } from './farmlands-search.props.autogenerated';\r\n\r\nexport interface ISearchState {\r\n isSearchFormExpanded: boolean;\r\n searchText: string;\r\n searchKeywordSuggestClass: string;\r\n searchProductSuggestClass: string;\r\n searchCategorySuggestClass: string;\r\n suggestions: Autosuggestions | undefined;\r\n searchRefiners?: ProductRefiner[] | undefined;\r\n autoSuggestAriaLabel: string;\r\n isInitialState: boolean;\r\n}\r\n\r\nexport interface ISearchViewProps extends IFarmlandsSearchProps<IFarmlandsSearchData> {\r\n Search: IModuleProps;\r\n AutoSuggestAriaLabel: INodeProps;\r\n AutoSuggestAriaLabelText: string;\r\n searchText: string;\r\n AutoSuggest: INodeProps;\r\n // KeywordSuggest: INodeProps;\r\n ProductSuggest: INodeProps;\r\n CategorySuggest: INodeProps;\r\n SearchForm: INodeProps;\r\n FormWrapper: INodeProps;\r\n // UlKeyword: INodeProps;\r\n UlProduct: INodeProps;\r\n UlCategory: INodeProps;\r\n label: React.ReactNode;\r\n form: React.ReactNode;\r\n // autosuggestKeyword?: ISearchKeywordViewProps;\r\n autosuggestProduct?: ISearchProductViewProps;\r\n autosuggestCategory?: ISearchCategoryViewProps;\r\n callbacks: {\r\n handleCancelSearchChange(): void;\r\n };\r\n isSearchFormExpanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * Search module\r\n * @extends {React.Component<IFarmlandsSearchProps<IFarmlandsSearchData>, ISearchState>}\r\n */\r\nclass Search extends React.Component<IFarmlandsSearchProps<IFarmlandsSearchData>, ISearchState> {\r\n private searchTextInput: React.RefObject<HTMLInputElement>;\r\n private searchCollapsedLabel: React.RefObject<HTMLButtonElement>;\r\n private formReference: React.RefObject<HTMLButtonElement>;\r\n private maxChars: number;\r\n private inputSuggestionType?: ISuggestionTypeCriterionData[];\r\n private topResultsCount?: number;\r\n private hitPrefix: string = '{';\r\n private hitSuffix: string = '}';\r\n private waitTime: number = 500;\r\n private autoSuggestResultScreenReaderDiv: React.RefObject<HTMLDivElement>;\r\n private autoSuggestResultDiv: React.RefObject<HTMLDivElement>;\r\n private searchFormClass: string;\r\n private searchLabelClass: string;\r\n private telemetryContent: ITelemetryContent;\r\n // @ts-ignore\r\n private cancellabelDebounce: debounce;\r\n\r\n constructor(props: IFarmlandsSearchProps<IFarmlandsSearchData>) {\r\n super(props);\r\n this.searchTextInput = React.createRef();\r\n this.searchCollapsedLabel = React.createRef();\r\n this.autoSuggestResultScreenReaderDiv = React.createRef();\r\n this.autoSuggestResultDiv = React.createRef();\r\n this.formReference = React.createRef();\r\n this.state = {\r\n isSearchFormExpanded: false,\r\n searchText: '',\r\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\r\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\r\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: '',\r\n isInitialState: true\r\n };\r\n this.maxChars =\r\n (this.props.context &&\r\n this.props.context.app &&\r\n this.props.context.app.config &&\r\n this.props.context.app.config.searchInputMaxLength) ||\r\n 50;\r\n this.inputSuggestionType = this.props.config && this.props.config.suggestionTypeCriterion;\r\n this.topResultsCount =\r\n this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\r\n this.searchFormClass = 'ms-search__form';\r\n this.searchLabelClass = 'ms-search__label';\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this.productSearchTracking = this.productSearchTracking.bind(this);\r\n this.productSuggestionClick = this.productSuggestionClick.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\r\n window && window.addEventListener('keyup', this._keyup);\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\r\n window && window.removeEventListener('keyup', this._keyup, false);\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n const {\r\n config: { hideSearchLabel }\r\n } = this.props;\r\n const { isSearchFormExpanded, isInitialState } = this.state;\r\n\r\n if (!this.props.context.request.params.isEditor) {\r\n if (!hideSearchLabel && isSearchFormExpanded) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else if (!isInitialState) {\r\n this.searchCollapsedLabel &&\r\n this.searchCollapsedLabel.current &&\r\n this.searchCollapsedLabel.current.focus();\r\n }\r\n }\r\n }\r\n\r\n public productSearchTracking(): void {\r\n const { searchText } = this.state;\r\n (Window as any).digitalData.event.push(\r\n {\r\n eventName: 'Search',\r\n eventAction: 'Search',\r\n timeStamp: new Date(),\r\n location: document.location.href,\r\n attributes: {\r\n searchText: searchText\r\n }\r\n }\r\n );\r\n window.dispatchEvent(new CustomEvent('Search'));\r\n }\r\n public productSuggestionClick(): void {\r\n sessionStorage.setItem('findingMethod', 'internal search');\r\n this.productSearchTracking();\r\n }\r\n\r\n // tslint:disable-next-line: cyclomatic-complexity max-func-body-length\r\n public render(): JSX.Element {\r\n const {\r\n context,\r\n resources: {\r\n searchtext,\r\n searchLabelArialLabel,\r\n cancelBtnAriaLabel,\r\n searchBtnAriaLabel,\r\n submitBtnAriaLabel\r\n },\r\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, className = '' }\r\n } = this.props;\r\n\r\n const {\r\n isSearchFormExpanded,\r\n searchText,\r\n // searchKeywordSuggestClass,\r\n searchProductSuggestClass,\r\n searchCategorySuggestClass,\r\n suggestions,\r\n searchRefiners\r\n } = this.state;\r\n\r\n const searchQsp =\r\n (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\r\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\r\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\r\n const searchPlaceholder =\r\n searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search products';\r\n\r\n // const keywordSuggestions =\r\n // suggestions &&\r\n // suggestions.AllSearchResults &&\r\n // suggestions.AllSearchResults.filter(\r\n // i => i.SuggestionType === SuggestionType.Keyword || i.SuggestionType === SuggestionType.None\r\n // );\r\n const productSuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter((i) => i.SuggestionType === SuggestionType.Product);\r\n const categorySuggestions =\r\n suggestions &&\r\n suggestions.AllSearchResults &&\r\n suggestions.AllSearchResults.filter((i) => i.SuggestionType === SuggestionType.Category);\r\n\r\n const viewProps: ISearchViewProps = {\r\n ...(this.props as IFarmlandsSearchProps<IFarmlandsSearchData>),\r\n\r\n Search: {\r\n moduleProps: this.props,\r\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\r\n },\r\n AutoSuggestAriaLabel: {\r\n tag: 'div',\r\n className: 'msc-autoSuggest__screen-reader',\r\n 'aria-live': 'assertive',\r\n ref: this.autoSuggestResultScreenReaderDiv\r\n },\r\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\r\n searchText: this.state.searchText,\r\n AutoSuggest: {\r\n ref: this.autoSuggestResultDiv,\r\n className: 'ms-search__autoSuggest'\r\n },\r\n // KeywordSuggest: {\r\n // className: searchKeywordSuggestClass\r\n // },\r\n ProductSuggest: {\r\n className: searchProductSuggestClass\r\n },\r\n CategorySuggest: {\r\n className: searchCategorySuggestClass\r\n },\r\n SearchForm: {\r\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\r\n },\r\n FormWrapper: {\r\n tag: 'form',\r\n ref: this.formReference,\r\n className: 'ms-search__searchForm',\r\n 'aria-label': 'Search',\r\n name: 'searchForm',\r\n role: 'Search',\r\n action: searchURL,\r\n autoComplete: 'off',\r\n onSubmit: this._handleSubmit\r\n },\r\n // UlKeyword: {\r\n // tag: 'ul',\r\n // className: classnames('msc-autoSuggest__keywordResults-items', className)\r\n // },\r\n UlProduct: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__productResults-items', className),\r\n onClick: this.productSuggestionClick\r\n },\r\n UlCategory: {\r\n tag: 'ul',\r\n className: classnames('msc-autoSuggest__categoryResults-items', className),\r\n onClick: this.productSearchTracking\r\n },\r\n label: LabelComponent({\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\r\n searchtext: searchtext,\r\n searchLabelArialLabel: searchLabelArialLabel,\r\n searchCollapsedLabel: this.searchCollapsedLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n telemetryContent: this.telemetryContent\r\n }),\r\n form: FormComponent({\r\n ariaLabelCancel: cancelBtnAriaLabel,\r\n ariaLabelSearch: searchBtnAriaLabel,\r\n ariaLabelSubmit: submitBtnAriaLabel,\r\n hideSearchLabel: hideSearchLabel,\r\n searchTextInput: this.searchTextInput,\r\n isSearchFormExpanded: isSearchFormExpanded,\r\n disableSubmitSearch: disableSubmitSearch,\r\n handleInputChange: this._handleInputChange,\r\n handleCancelSearchChange: this._handleCancelSearchChange,\r\n maxChars: this.maxChars,\r\n searchQsp: searchQsp,\r\n searchPlaceholder: searchPlaceholder,\r\n query: searchText\r\n }),\r\n // autosuggestKeyword:\r\n // searchText && searchText.length > 0 && keywordSuggestions && keywordSuggestions.length > 0\r\n // ? KeywordSuggestionsComponent({\r\n // searchKeywordSuggestClass: searchKeywordSuggestClass,\r\n // searchPageURL: searchPageURL,\r\n // searchQsp: searchQsp,\r\n // hitPrefix: this.hitPrefix,\r\n // hitSuffix: this.hitSuffix,\r\n // autoSuggestProps: this.props,\r\n // searchText: searchText,\r\n // suggestions: keywordSuggestions,\r\n // telemetryContent: this.telemetryContent\r\n // })\r\n // : undefined,\r\n autosuggestProduct:\r\n searchText && searchText.length > 0 && productSuggestions && productSuggestions.length > 0\r\n ? ProductSuggestionsComponent({\r\n searchProductSuggestClass: searchProductSuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: productSuggestions,\r\n telemetry: this.props.telemetry,\r\n moduleType: this.props.typeName,\r\n moduleId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n autosuggestCategory:\r\n searchText && searchText.length > 0 && categorySuggestions && categorySuggestions.length > 0\r\n ? CategorySuggestionsComponent({\r\n searchCategorySuggestClass: searchCategorySuggestClass,\r\n searchPageURL: searchPageURL,\r\n searchQsp: searchQsp,\r\n hitPrefix: this.hitPrefix,\r\n hitSuffix: this.hitSuffix,\r\n autoSuggestProps: this.props,\r\n searchText: searchText,\r\n suggestions: categorySuggestions,\r\n searchRefiners: searchRefiners,\r\n telemetryContent: this.telemetryContent\r\n })\r\n : undefined,\r\n callbacks: {\r\n handleCancelSearchChange: this._handleCancelSearchChange\r\n },\r\n isSearchFormExpanded: this.state.isSearchFormExpanded\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private _focusOutTarget = (e: any): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\r\n this._clearAutoSuggestState();\r\n }\r\n };\r\n\r\n private _keyup = (e: KeyboardEvent): void => {\r\n const { suggestions } = this.state;\r\n\r\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\r\n this._clearAutoSuggestState();\r\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n\r\n if (\r\n !(\r\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\r\n (this.autoSuggestResultDiv.current &&\r\n this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\r\n )\r\n ) {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n if (this.state.isSearchFormExpanded) {\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n }\r\n };\r\n\r\n private _clearAutoSuggestState = (): void => {\r\n const {\r\n context: { actionContext },\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\r\n searchState.searchText = '';\r\n searchState.defaultBasicSearchUrl = '';\r\n searchState.searchQueryStringParameter = '';\r\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\r\n this.searchTextInput.current.value = '';\r\n }\r\n\r\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\r\n };\r\n\r\n private _handleInputChange = (query: string): void => {\r\n if (!query || query.length < this.maxChars) {\r\n this.setState({ searchText: query });\r\n }\r\n\r\n if (this.cancellabelDebounce) {\r\n this.cancellabelDebounce.cancel();\r\n }\r\n\r\n const {\r\n telemetry,\r\n context,\r\n data: { searchState }\r\n } = this.props;\r\n\r\n if (context) {\r\n if (query && query.length > 0) {\r\n if (query.length > this.maxChars) {\r\n return;\r\n }\r\n\r\n this.cancellabelDebounce = debounce(() => {\r\n getSearchSuggestionsAction(\r\n new AutoSuggestInput(\r\n query,\r\n this.topResultsCount,\r\n this._getSuggestionType(this.inputSuggestionType),\r\n this.hitPrefix,\r\n this.hitSuffix\r\n ),\r\n context.actionContext\r\n )\r\n .then((results) => {\r\n this._getSearchRefiners(query)\r\n .then((refiners) => {\r\n this.setState({\r\n suggestions: results,\r\n searchRefiners: refiners,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n })\r\n .catch((error) => {\r\n this.setState({\r\n suggestions: results,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(results)\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get refiners results');\r\n });\r\n })\r\n .catch((error) => {\r\n this.setState({\r\n suggestions: undefined,\r\n searchRefiners: undefined,\r\n autoSuggestAriaLabel: this._setAutoSuggestResultCount()\r\n });\r\n telemetry.exception(error);\r\n telemetry.debug('Unable to get auto suggest results');\r\n });\r\n }, this.waitTime);\r\n\r\n setTimeout(() => {\r\n this.cancellabelDebounce();\r\n }, 0);\r\n\r\n searchState.searchText = query;\r\n } else {\r\n this.setState({ suggestions: undefined, searchRefiners: undefined });\r\n searchState.searchText = '';\r\n }\r\n context.actionContext.update(createSearchStateInput(searchState), searchState);\r\n }\r\n };\r\n\r\n private _getSuggestionType = (suggestionTypes?: ISuggestionTypeCriterionData[]): string => {\r\n if (suggestionTypes && suggestionTypes.length > 0) {\r\n const distinctSuggestionTypes: string[] = [];\r\n suggestionTypes &&\r\n suggestionTypes.forEach((suggestionTypeItem, index) => {\r\n suggestionTypeItem.SuggestionType &&\r\n distinctSuggestionTypes.push(\r\n suggestionTypeItem.SuggestionType.charAt(0).toUpperCase() +\r\n suggestionTypeItem.SuggestionType.slice(1)\r\n );\r\n });\r\n return distinctSuggestionTypes.join(',');\r\n }\r\n return 'Keyword, Product, ScopedCategory';\r\n };\r\n\r\n private async _getSearchRefiners(searchText: string): Promise<ProductRefiner[]> {\r\n const { actionContext: ctx } = this.props.context;\r\n return getProductSearchRefinersAsync(\r\n { callerContext: ctx },\r\n {\r\n SearchCondition: searchText,\r\n Context: {\r\n ChannelId: +ctx.requestContext.apiSettings.channelId,\r\n CatalogId: +ctx.requestContext.apiSettings.catalogId\r\n }\r\n }\r\n );\r\n }\r\n\r\n private _handleSubmit = (\r\n e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement> | React.FormEvent<HTMLFormElement>\r\n ): void => {\r\n const {\r\n config: { disableSubmitSearch },\r\n context: {\r\n actionContext,\r\n app: {\r\n config: { searchQueryStringParameter }\r\n }\r\n }\r\n } = this.props;\r\n this.productSearchTracking();\r\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\r\n e.preventDefault();\r\n\r\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\r\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\r\n } else {\r\n const searchQsp = searchQueryStringParameter || 'q';\r\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\r\n document.location.href = searchURL;\r\n }\r\n };\r\n\r\n private _handleCancelSearchChange = (): void => {\r\n const { isSearchFormExpanded, suggestions } = this.state;\r\n\r\n if (!isSearchFormExpanded) {\r\n this.setState({\r\n isSearchFormExpanded: true,\r\n searchText: '',\r\n isInitialState: false\r\n });\r\n } else {\r\n if (suggestions && suggestions.AllSearchResults) {\r\n this._clearAutoSuggestState();\r\n }\r\n\r\n this.setState({ isSearchFormExpanded: false });\r\n }\r\n };\r\n\r\n private _appendQueryParams = (route: string, query: string, qsp: string): string => {\r\n if (route && route.length > 0) {\r\n return query && query.length > 0\r\n ? `${route}${route.indexOf('?') === -1 ? '?' : '&'}${qsp}=${query}`\r\n : route;\r\n }\r\n return '';\r\n };\r\n\r\n private _setAutoSuggestResultCount = (result?: Autosuggestions) => {\r\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\r\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\r\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\r\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\r\n ariaLiveRegion.innerText =\r\n result && result.AllSearchResults && result.AllSearchResults.length > 0\r\n ? suggestResultString\r\n : emptyResultString;\r\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\r\n return ariaLiveRegion.innerText;\r\n } else {\r\n return '';\r\n }\r\n };\r\n}\r\n\r\nexport default Search;\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\n/* tslint:disable: no-duplicate-imports */\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport {\r\n ISearchCategoryViewProps,\r\n ISearchFormViewProps,\r\n // ISearchKeywordViewProps,\r\n ISearchProductViewProps\r\n} from './components';\r\nimport { ISearchViewProps } from './farmlands-search';\r\n\r\nconst SearchView: React.FC<ISearchViewProps> = (props) => {\r\n const {\r\n Search,\r\n AutoSuggestAriaLabel,\r\n AutoSuggestAriaLabelText,\r\n searchText,\r\n AutoSuggest,\r\n // KeywordSuggest,\r\n ProductSuggest,\r\n CategorySuggest,\r\n // UlKeyword,\r\n UlProduct,\r\n UlCategory,\r\n form,\r\n autosuggestCategory,\r\n // autosuggestKeyword,\r\n autosuggestProduct,\r\n SearchForm,\r\n FormWrapper,\r\n label\r\n } = props;\r\n\r\n return (\r\n <Module {...Search}>\r\n {label}\r\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\r\n <Node {...AutoSuggest}>\r\n {searchText && searchText.length > 0 ? (\r\n <Node {...AutoSuggestAriaLabel}>{AutoSuggestAriaLabelText}</Node>\r\n ) : (\r\n ''\r\n )}\r\n {/* {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword)} */}\r\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct)}\r\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory)}\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\r\n return (\r\n <Node {...SearchForm}>\r\n <Node {...FormWrapper}>\r\n {form.submitBtn}\r\n {form.input}\r\n {form.cancelBtn}\r\n </Node>\r\n </Node>\r\n );\r\n};\r\n\r\n// const _renderKeywordSuggestions = (\r\n// KeywordSuggest: INodeProps,\r\n// UlKeyword: INodeProps,\r\n// keywordSuggestions?: ISearchKeywordViewProps\r\n// ) => {\r\n// return (\r\n// keywordSuggestions && (\r\n// <Node {...KeywordSuggest}>\r\n// <Node {...UlKeyword}>\r\n// {keywordSuggestions.text.map((text) => {\r\n// return text;\r\n// })}\r\n// </Node>\r\n// </Node>\r\n// )\r\n// );\r\n// };\r\n\r\nconst _renderProductSuggestions = (\r\n ProductSuggest: INodeProps,\r\n UlProduct: INodeProps,\r\n productSuggestions?: ISearchProductViewProps\r\n) => {\r\n return (\r\n productSuggestions && (\r\n <Node {...ProductSuggest}>\r\n <Node {...UlProduct}>\r\n {/* {productSuggestions.title} */}\r\n {productSuggestions.items.map((item, index) => {\r\n return (\r\n <Node {...item.LiProduct} key={item.id || index}>\r\n <Node {...item.AProduct}>\r\n {item.thumbnail}\r\n {item.text}\r\n {item.price}\r\n </Node>\r\n </Node>\r\n );\r\n })}\r\n </Node>\r\n </Node>\r\n )\r\n );\r\n};\r\n\r\nconst _renderCategorySuggestions = (\r\n CategorySuggest: INodeProps,\r\n UlCategory: INodeProps,\r\n categorySuggestions?: ISearchCategoryViewProps\r\n) => {\r\n return (\r\n categorySuggestions && (\r\n <Node {...CategorySuggest}>\r\n <Node {...UlCategory}>\r\n {categorySuggestions.title}\r\n {categorySuggestions.text.map((text) => {\r\n return text;\r\n })}\r\n </Node>\r\n </Node>\r\n )\r\n );\r\n};\r\n\r\nexport default SearchView;\r\n","import { debounce } from 'lodash';\r\nimport * as React from 'react';\r\nimport { IQuantityProps } from './Quantity.props';\r\n\r\ninterface IQuantityState {\r\n currentInput: number;\r\n}\r\n/**\r\n * Quantity Component - This component is used to add or remove quantity\r\n */\r\n\r\nexport default class Quantity extends React.PureComponent<IQuantityProps, IQuantityState> {\r\n public static defaultProps: Partial<IQuantityProps> = {\r\n min: 1\r\n };\r\n\r\n private inputRef: React.RefObject<HTMLInputElement> = React.createRef<HTMLInputElement>();\r\n\r\n constructor(props: IQuantityProps) {\r\n super(props);\r\n this.state = { currentInput: props.currentCount || 1 };\r\n this._onIncrement = this._onIncrement.bind(this);\r\n this._onDecrement = this._onDecrement.bind(this);\r\n this._handleChange = this._handleChange.bind(this);\r\n }\r\n\r\n public render(): JSX.Element {\r\n const disabled = this.state.currentInput === this.props.min;\r\n const incDisabled = this.state.currentInput === this.props.max;\r\n const currentValue = this.state.currentInput;\r\n\r\n return (\r\n <>\r\n <div className={`quantity ${this.props.quantityClasses}`} id={this.props.id}>\r\n <button\r\n disabled={disabled}\r\n title={disabled ? '' : this.props.decrementButtonAriaLabel}\r\n className={`decrement quantity__controls ${disabled ? 'disabled' : ''}`}\r\n onClick={this._onDecrement}\r\n aria-hidden={true}\r\n tabIndex={-1}\r\n color={'secondary'}\r\n >\r\n <i className='quantity__controls-glyph material-icons'>remove</i>\r\n </button>\r\n <input\r\n type='number'\r\n className='quantity__input'\r\n pattern='[0-9]*'\r\n value={this.state.currentInput}\r\n onChange={this._handleChange}\r\n onBlur={this._validateMin}\r\n aria-live='polite'\r\n aria-label={`${this.props.inputQuantityAriaLabel}`}\r\n role='spinbutton'\r\n aria-valuemin={this.props.min}\r\n aria-valuemax={this.props.max}\r\n aria-valuenow={currentValue}\r\n ref={this.inputRef}\r\n />\r\n <button\r\n disabled={incDisabled}\r\n title={incDisabled ? '' : this.props.incrementButtonAriaLabel}\r\n className={`increment quantity__controls ${incDisabled ? 'disabled' : ''}`}\r\n onClick={this._onIncrement}\r\n aria-hidden={true}\r\n tabIndex={-1}\r\n color={'secondary'}\r\n >\r\n <i className='quantity__controls-glyph material-icons'>add</i>\r\n </button>\r\n </div>\r\n </>\r\n );\r\n }\r\n\r\n private _onIncrement(): void {\r\n let invokeCallback = false;\r\n this.setState((prevState: IQuantityState) => {\r\n if (prevState.currentInput < this.props.max) {\r\n invokeCallback = true;\r\n return { currentInput: prevState.currentInput + 1 };\r\n } else {\r\n invokeCallback = false;\r\n return { currentInput: this.props.max };\r\n }\r\n // tslint:disable-next-line:align\r\n }, () => {\r\n invokeCallback && this.props.onChange && this.props.onChange(this.state.currentInput);\r\n });\r\n }\r\n\r\n private _onDecrement(): void {\r\n let invokeCallback = false;\r\n this.setState((prevState: IQuantityState) => {\r\n if (prevState.currentInput > 1) {\r\n invokeCallback = true;\r\n return { currentInput: prevState.currentInput - 1 };\r\n } else {\r\n invokeCallback = false;\r\n return { currentInput: 1 };\r\n }\r\n // tslint:disable-next-line:align\r\n }, () => { invokeCallback && this.props.onChange && this.props.onChange(this.state.currentInput); });\r\n }\r\n\r\n private _handleChange(e: React.ChangeEvent<HTMLInputElement>): void {\r\n const currentValue = parseInt((e.target.value), 10);\r\n const minValue = this.props.min === undefined ? 1 : this.props.min;\r\n const inputElement = this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\r\n\r\n if (currentValue > this.props.max) {\r\n this.setState({ currentInput: this.props.max },\r\n () => {\r\n debounce(() => {\r\n this.props.onChange && this.props.onChange(this.state.currentInput);\r\n }, 200)();\r\n });\r\n } else {\r\n this.setState({ currentInput: currentValue },\r\n () => {\r\n debounce(() => {\r\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue)) {\r\n this.props.onChange && this.props.onChange(this.state.currentInput);\r\n\r\n if (inputElement) {\r\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\r\n inputElement.setAttribute('value', currentValue.toString());\r\n }\r\n }\r\n }, 200)();\r\n });\r\n }\r\n }\r\n\r\n private _validateMin = (): void => {\r\n const minValue = this.props.min === undefined ? 1 : this.props.min;\r\n if (isNaN(this.state.currentInput) || (this.state.currentInput < minValue)) {\r\n this.setState({ currentInput: minValue }, () => { this.props.onChange && this.props.onChange(this.state.currentInput); });\r\n } else {\r\n this.props.onChange && this.props.onChange(this.state.currentInput);\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\nimport { IComponentProps, IGridSettings, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n CartLine,\r\n ProductWarehouseInventoryAvailability,\r\n SalesLine\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Quantity } from '../../utilities/quantity';\r\nimport { hasDeliveryOnlyError, hasPickupOnlyError, getDeliveryMethodsAllowedProperty } from '../../../../helpers/cart-validation-helpers';\r\nimport { IDeliveryOptions } from '../../../../actions/farmlands-get-delivery-options-calls.action';\r\n// importing OOTB node module - bypass error https://stackoverflow.com/questions/41292559/could-not-find-a-declaration-file-for-module-module-name-path-to-module-nam\r\n// tslint:disable-next-line: no-require-imports\r\nconst { getCheckoutCart } = require('@msdyn365-commerce/global-state/dist/lib/data-actions/get-checkout-cart');\r\nimport { inventoryStocks } from '../../../../modules/farmlands-cart/inventoryStore';\r\nimport { observer } from 'mobx-react'\r\n\r\ntype DeviceType = 'Mobile';\r\n\r\nexport interface IFarmlandsInventoryAvaliabilityMessages {\r\n clickCollectText?: string;\r\n deliveryText?: string;\r\n outOfStockText?: string;\r\n noBackOrder?: string;\r\n clickCollectOutOfStock?: string;\r\n deliveryOutOfStock?: string;\r\n}\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs\r\n */\r\nexport interface ICartlineResourceString {\r\n /** Display string for discount label */\r\n discountStringText: string;\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** Display string for quantity label */\r\n quantityDisplayString: string;\r\n /** Display string for quantity label */\r\n inputQuantityAriaLabel: string;\r\n /** Aria label for the decrement button in quanitity component */\r\n decrementButtonAriaLabel?: string;\r\n /** Aria label for the increment button in quanitity component */\r\n incrementButtonAriaLabel?: string;\r\n /** original text screenreader */\r\n originalPriceText: string;\r\n /** current text screenreader */\r\n currentPriceText: string;\r\n inventoryAvaliabilityMessages: IFarmlandsInventoryAvaliabilityMessages;\r\n}\r\n\r\ninterface ICartLineState {\r\n cartData: any;\r\n}\r\n\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n product: SimpleProduct;\r\n}\r\n\r\nexport type CartLineDisplayMode = 'DEFAULT' | 'COMPACT';\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem\r\n */\r\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\r\n /** The flag to change the quantity component from interactible to static */\r\n disableQuantityInteractivity?: boolean;\r\n /** The primary image url */\r\n primaryImageUrl?: string;\r\n /** The product url */\r\n productUrl?: string;\r\n /** GridSettings for the product image in cartLine */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartLine */\r\n imageSettings: IImageSettings;\r\n /** Boolean flag to indicate if the item is out of stock */\r\n isOutOfStock?: boolean;\r\n /** Flag to make quantity section editable */\r\n isQuantityEditable?: boolean;\r\n /** Max quantity for line item */\r\n maxQuantity?: number;\r\n /** Current quantity for line item */\r\n currentQuantity?: number;\r\n /** Resource string for the component */\r\n resources: ICartlineResourceString;\r\n /** SalesLine flag */\r\n isSalesLine?: boolean;\r\n /** Error message to show in place of quantity */\r\n errorMessage?: string;\r\n errorMessageOutOfStock?: string;\r\n /** Display mode to use */\r\n displayMode?: CartLineDisplayMode;\r\n /** Inventory information label */\r\n inventoryInformationLabel?: string;\r\n /** Inventory information class name */\r\n inventoryLabelClassName?: string;\r\n /** Boolean flag to indicate if cart state status is ready */\r\n isCartStateReady?: boolean;\r\n /** Remove item button text */\r\n removeButtonText?: string;\r\n /** Workaround to pass children elements down to view */\r\n children?: {\r\n removeButton: JSX.Element;\r\n validationErrorRemoveButton: JSX.Element;\r\n deliveryOptions: IDeliveryOptions;\r\n };\r\n /** Quantity onChange callback */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): void;\r\n}\r\n\r\ninterface IDimensionStrings {\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n}\r\n\r\nconst CartLineItemFunctions = {\r\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\r\n if (!Product || !Product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return Product.Dimensions.map((productDimension) => {\r\n if (productDimension.DimensionTypeValue === 1) {\r\n return (\r\n <div key={`${Product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-color'>\r\n {DimensionStrings.colorString}:\r\n <span className='name'>\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 2) {\r\n return (\r\n <div key={`${Product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-configuration'>\r\n {DimensionStrings.configString}:\r\n <span className='name'>\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 3) {\r\n return (\r\n <div key={`${Product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-size'>\r\n {DimensionStrings.sizeString}:\r\n <span className='name'>\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 4) {\r\n return (\r\n <div key={`${Product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-style'>\r\n {DimensionStrings.styleString}:\r\n <span className='name'>\r\n {productDimension.DimensionValue && productDimension.DimensionValue.Value}\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\r\n return null;\r\n }\r\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\r\n return (\r\n <div key={discountLine.OfferId || index} className='msc-cart-line-item-product-discount'>\r\n <span className='msc-cart-line__product-savings-label'>\r\n {discountLine.OfferName ? discountLine.OfferName : ''}:\r\n {` ${props.resources.discountStringText || 'Discount'} `}\r\n </span>\r\n <span className='msc-cart-line__promo-codes'>\r\n {discountLine.DiscountCost && (\r\n <>\r\n <PriceComponent\r\n data={\r\n props.isSalesLine\r\n ? {\r\n price: {\r\n // @ts-ignore\r\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\r\n }\r\n }\r\n : {\r\n price: {\r\n CustomerContextualPrice:\r\n props.data.cartLine.DiscountAmountWithoutTax,\r\n BasePrice: props.data.cartLine.DiscountAmount\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-cart-line__discount-value'\r\n />\r\n </>\r\n )}\r\n </span>\r\n <span>{` (${discountLine.Percentage !== undefined ? discountLine.Percentage : ''}%)`}</span>\r\n </div>\r\n );\r\n });\r\n },\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n if (!props.inventoryInformationLabel) {\r\n return null;\r\n }\r\n const inventoryCssName = props.inventoryLabelClassName\r\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\r\n : 'msc-cart-line__product-inventory-label';\r\n return <span className={inventoryCssName}>{props.inventoryInformationLabel}</span>;\r\n }\r\n};\r\n\r\n@observer\r\n// tslint:disable-next-line: completed-docs\r\nclass CartLineComponent extends React.Component<ICartLineProps, ICartLineState> {\r\n public state: ICartLineState = {\r\n cartData: undefined\r\n };\r\n\r\n constructor(props: ICartLineProps) {\r\n super(props);\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n if (this.props.context.request.user.token) {\r\n const data = await getCheckoutCart({}, this.props.context.actionContext);\r\n this.setState({ cartData: data });\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { children, productUrl, resources } = this.props;\r\n const {\r\n cartLine,\r\n cartLine: {\r\n LineNumber\r\n },\r\n product\r\n } = this.props.data;\r\n const { isClickCollect, lineItems } = inventoryStocks;\r\n\r\n // @ts-ignore\r\n const inventoryLineItem = lineItems.find(item => item.LineNumber === LineNumber);\r\n const deliveryMethodsAllowed = cartLine.ExtensionProperties?.find(item => item.Key === 'DeliveryMethodsAllowed');\r\n const isDeliveryMethodsAllowedDelivery = deliveryMethodsAllowed?.Value?.StringValue?.includes('Delivery');\r\n\r\n const hasError =\r\n children?.validationErrorRemoveButton &&\r\n children?.deliveryOptions &&\r\n (hasDeliveryOnlyError(cartLine, children.deliveryOptions.DeliveryOptions) ||\r\n hasPickupOnlyError(cartLine, children.deliveryOptions.DeliveryOptions)) ||\r\n // @ts-ignore\r\n (lineItems.length > 0 && inventoryLineItem && inventoryLineItem.PhysicalAvailableInventoryLevelCode === 'OOS')// && !inventoryLineItem.IsBackOrderAllowed)\r\n\r\n const destructDimensionStrings = {\r\n sizeString: resources.sizeString,\r\n colorString: resources.colorString,\r\n styleString: resources.styleString,\r\n configString: resources.configString\r\n };\r\n const fallbackImageUrl = getFallbackImageUrl(\r\n product.ItemId,\r\n this.props.context.actionContext.requestContext.apiSettings\r\n );\r\n const productDimensions = CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\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 _generateErrorMessage = (): JSX.Element | null => {\r\n if (this.props.errorMessage) {\r\n return (\r\n <div className='msc-alert__header'>\r\n <span className='msi-exclamation-triangle' />\r\n <span>{this.props.errorMessage}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n const _generateValidationErrorMessage = (isCompact = false) => {\r\n const isDeliveryOnly = hasDeliveryOnlyError(\r\n cartLine,\r\n this.props.children?.deliveryOptions.DeliveryOptions!\r\n );\r\n\r\n const deliveryMethodAllowed = getDeliveryMethodsAllowedProperty(cartLine);\r\n\r\n const {\r\n deliveryText,\r\n clickCollectText,\r\n noBackOrder,\r\n clickCollectOutOfStock,\r\n deliveryOutOfStock\r\n } = this.props.resources.inventoryAvaliabilityMessages || {\r\n clickCollectText: '',\r\n deliveryText: '',\r\n noBackOrder: '',\r\n clickCollectOutOfStock: '',\r\n deliveryOutOfStock: '',\r\n };\r\n\r\n const errorText = isDeliveryOnly ? deliveryText : clickCollectText;\r\n const lineItem: ProductWarehouseInventoryAvailability = lineItems.find((item: CartLine) => item.LineNumber === LineNumber) || {};\r\n const isOOSCC = isClickCollect && lineItem && lineItem.PhysicalAvailableInventoryLevelCode === 'OOS';\r\n const isOOSDel = !isClickCollect && lineItem && lineItem.PhysicalAvailableInventoryLevelCode === 'OOS';\r\n // @ts-ignore\r\n const isBackOrderAllowed = lineItem.IsBackOrderAllowed;\r\n\r\n if (this.props.typeName === 'farmlands-checkout') {\r\n return null;\r\n }\r\n else if (isCompact) {\r\n\r\n if(isClickCollect && deliveryMethodAllowed === 'Delivery'){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {errorText}\r\n </span>\r\n );\r\n }\r\n\r\n if(!isClickCollect && deliveryMethodAllowed === 'Pickup'){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {errorText}\r\n </span>\r\n );\r\n }\r\n\r\n if(isOOSCC && isBackOrderAllowed){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {clickCollectOutOfStock}\r\n </span>\r\n )\r\n }\r\n\r\n if(isOOSDel && isBackOrderAllowed){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {deliveryOutOfStock}\r\n </span>\r\n )\r\n }\r\n\r\n if((isOOSCC || isOOSDel) && !isBackOrderAllowed){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {noBackOrder}\r\n </span>\r\n )\r\n }\r\n\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {errorText}\r\n </span>\r\n );\r\n }\r\n else {\r\n const {\r\n deliveryOnly,\r\n clickCollectOnly,\r\n outOfStockCC,\r\n outOfStockDel,\r\n oosNoBackOrder,\r\n // @ts-ignore\r\n } = this.props.cartLineDeliveryMethodsText;\r\n\r\n const extendedText = isDeliveryOnly\r\n ? (deliveryOnly || `Please select 'Delivery' or `)\r\n : (clickCollectOnly || `Please select 'Click & Collect' or `);\r\n\r\n if(isClickCollect && deliveryMethodAllowed === 'Delivery'){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {extendedText} {this.props.children?.validationErrorRemoveButton}\r\n </span>\r\n );\r\n }\r\n\r\n if(!isClickCollect && deliveryMethodAllowed === 'Pickup'){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {extendedText}\r\n {this.props.children?.validationErrorRemoveButton}\r\n </span>\r\n );\r\n }\r\n\r\n if(isOOSCC && isBackOrderAllowed){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {outOfStockCC}\r\n </span>\r\n )\r\n }\r\n\r\n if(isOOSDel && isBackOrderAllowed){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {outOfStockDel}\r\n </span>\r\n )\r\n }\r\n\r\n if(isOOSCC && !isBackOrderAllowed){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {oosNoBackOrder} {this.props.children?.validationErrorRemoveButton}\r\n </span>\r\n )\r\n }\r\n\r\n if((isOOSDel) && (isBackOrderAllowed == false)){\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {oosNoBackOrder} {this.props.children?.validationErrorRemoveButton}\r\n </span>\r\n )\r\n }\r\n\r\n return (\r\n <span className='msc-cart-line__validation-error-text'>\r\n {extendedText}\r\n {this.props.children?.validationErrorRemoveButton}\r\n </span>\r\n );\r\n }\r\n\r\n };\r\n\r\n const _updateQuantity = (value: number) => {\r\n if (this.props.quantityOnChange) {\r\n this.props.quantityOnChange(cartLine, value);\r\n }\r\n };\r\n\r\n const _generateQuantityAndPrice = (renderPrice: boolean = true): JSX.Element[] | null => {\r\n const nodes = [];\r\n const errorMessage = _generateErrorMessage();\r\n\r\n if (this.props.isOutOfStock) {\r\n if (errorMessage) {\r\n return [errorMessage];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n if (this.props.isQuantityEditable) {\r\n if (errorMessage) {\r\n nodes.push(errorMessage);\r\n }\r\n nodes.push(\r\n <Quantity\r\n quantityClasses='msc-cart-line__quantity-select'\r\n id={`msc-cart-line__quantity_${product.RecordId}`}\r\n max={this.props.maxQuantity || 10}\r\n currentCount={this.props.currentQuantity}\r\n // tslint:disable-next-line: react-this-binding-issue\r\n onChange={_updateQuantity}\r\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\r\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\r\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\r\n key={cartLine.LineId}\r\n />\r\n );\r\n } else {\r\n nodes.push(\r\n <div\r\n className={classNames('msc-cart-line__quantity', {\r\n 'single-quantity': cartLine.Quantity === 1\r\n })}\r\n >\r\n <label className='quantity-label'>{resources.quantityDisplayString}</label>\r\n {errorMessage}\r\n <span className='quantity-value'>{cartLine.Quantity}</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (renderPrice) {\r\n const totalPriceIncGST = cartLine.ExtensionProperties?.find(\r\n (property: any) => property.Key === 'BasePriceWithGST'\r\n )?.Value?.DecimalValue;\r\n\r\n const totalSpecialPriceIncGST =\r\n cartLine.ExtensionProperties?.find((property: any) => property.Key === 'NetAmountIncGST')?.Value\r\n ?.DecimalValue || cartLine.TotalAmount;\r\n\r\n nodes.push(\r\n <div className='msc-cart-line__product-price'>\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: totalSpecialPriceIncGST,\r\n BasePrice: totalPriceIncGST\r\n }\r\n }}\r\n context={this.props.context}\r\n id={this.props.id}\r\n typeName={this.props.typeName}\r\n className='discount-value'\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n // Workaround for sanitizing image urls containing custom options in the image filename (which cause the image load to fail)\r\n const sanitizeImageUrl = (imageUrl: string | undefined): string => {\r\n const url = imageUrl || '';\r\n const split = decodeURIComponent(url).split('^'); // Split on this decoded URI string (only image urls with custom options should have this character)\r\n if (split.length > 1) {\r\n // If one of the image urls with custom options, append the start and end items of the split to get the normal filename\r\n return split[0].trim() + split[split.length - 1].trim();\r\n }\r\n\r\n // Else, return url verbatim.\r\n return url;\r\n };\r\n\r\n if (this.props.displayMode === 'COMPACT') {\r\n return (\r\n <div className={`msc-cart-line msc-cart-line__compact${hasError && this.props.typeName !== 'farmlands-checkout' ? ' msc-cart-line--error' : ''}`}>\r\n {hasError && this.props.typeName !== 'farmlands-checkout' && (\r\n <div className='msc-cart-line__validation-error'>\r\n <div className='msc-cart-line__validation-error-icon material-icons'>error_outline</div>\r\n {_generateValidationErrorMessage(true)}\r\n </div>\r\n )}\r\n <div className='msc-cart-line__content-wrapper'>\r\n <div className='msc-cart-line__product-image'>\r\n <Image\r\n src={sanitizeImageUrl(this.props.primaryImageUrl)}\r\n fallBackSrc={fallbackImageUrl}\r\n altText={product.Name}\r\n gridSettings={this.props.gridSettings}\r\n imageSettings={this.props.imageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n </div>\r\n <div className='msc-cart-line__content'>\r\n <a className='msc-cart-line__product-title' href={productUrl}>\r\n {product.Name}\r\n </a>\r\n <div className='msc-cart-line__product-sku'>{`SKU: ${product.ItemId}`}</div>\r\n <div className='msc-cart-line__product-variants'>\r\n {productDimensions.length > 0 ? <>{productDimensions}</> : ''}\r\n {_generateQuantityAndPrice(false)}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n\r\n return (\r\n <div className={`msc-cart-line${hasError ? ' msc-cart-line--error' : ''}`}>\r\n {hasError && (\r\n <div className='msc-cart-line__validation-error'>\r\n <div className='msc-cart-line__validation-error-icon material-icons'>error_outlinee</div>\r\n {_generateValidationErrorMessage()}\r\n </div>\r\n )}\r\n <div className='msc-cart-line__content-wrapper'>\r\n <div className='msc-cart-line__product-image'>\r\n <Image\r\n src={sanitizeImageUrl(this.props.primaryImageUrl)}\r\n altText={product.Name}\r\n gridSettings={this.props.gridSettings}\r\n imageSettings={this.props.imageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n {\r\n isMobile && inventoryStocks.isClickCollect && (\r\n <div className='mobile-inventory-label-container'>\r\n <StockLabel\r\n inventoryLineItem={inventoryLineItem}\r\n notDeliveryOnly={!isDeliveryMethodsAllowedDelivery}\r\n />\r\n </div>\r\n )\r\n }\r\n </div>\r\n <div className='msc-cart-line__product-details'>\r\n <div className='msc-cart-line__center-content'>\r\n <div className='msc-cart-line__product'>\r\n <a className='msc-cart-line__product-title' href={productUrl}>\r\n {product.Name}\r\n </a>\r\n <span className='msc-cart-line__product-sku'>{`SKU: ${product.ItemId}`}</span>\r\n {productDimensions.length > 0 && (\r\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\r\n )}\r\n </div>\r\n </div>\r\n {\r\n !isMobile && inventoryStocks.isClickCollect && (\r\n <StockLabel\r\n inventoryLineItem={inventoryLineItem}\r\n notDeliveryOnly={!isDeliveryMethodsAllowedDelivery}\r\n />\r\n )\r\n }\r\n <div className='msc-cart-line__end-content'>\r\n <div className='msc-cart-line__quantity-label'>Qty:</div>\r\n <div className='msc-cart-line__quantity-price-wrapper'>{_generateQuantityAndPrice()}</div>\r\n <div className='msc-cart-line__remove-buttom-wrapper'>\r\n {this.props.children?.removeButton}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nconst StockLabel = (props: any): JSX.Element | null => {\r\n const {\r\n PhysicalAvailableInventoryLevelCode,\r\n PhysicalAvailableInventoryLevelLabel\r\n } = props.inventoryLineItem;\r\n\r\n let inventoryClassName: string = '';\r\n let icon: JSX.Element | undefined = undefined;\r\n\r\n switch(PhysicalAvailableInventoryLevelCode) {\r\n case 'AVAIL':\r\n inventoryClassName = 'has-stock';\r\n icon = <Tick />;\r\n break;\r\n case 'LOW':\r\n inventoryClassName = 'low-stock';\r\n icon = <ExclamationMark />;\r\n break;\r\n case 'OOS':\r\n inventoryClassName = 'not-has-stock';\r\n icon = <Cross />;\r\n break;\r\n default:\r\n return null;\r\n }\r\n\r\n // if (!props.notDeliveryOnly) {\r\n // return (\r\n // <p className='not-avaliable'></p>\r\n // )\r\n // }\r\n\r\n return (\r\n <p className={inventoryClassName}>\r\n {icon}\r\n {PhysicalAvailableInventoryLevelLabel}\r\n </p>\r\n )\r\n}\r\n\r\nconst Tick = (): JSX.Element => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" className=\"bi bi-check\" viewBox=\"0 0 16 16\">\r\n <path d=\"M10.97 4.97a.75.75 0 0 1 1.07 1.05l-3.99 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.267.267 0 0 1 .02-.022z\"/>\r\n </svg>\r\n)\r\n\r\nconst Cross = (): JSX.Element => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" className=\"bi bi-x\" viewBox=\"0 0 16 16\">\r\n <path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\"/>\r\n </svg>\r\n)\r\n\r\nconst ExclamationMark = (): JSX.Element => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" className=\"bi bi-exclamation-lg\" viewBox=\"0 0 16 16\">\r\n <path d=\"M7.005 3.1a1 1 0 1 1 1.99 0l-.388 6.35a.61.61 0 0 1-1.214 0L7.005 3.1ZM7 12a1 1 0 1 1 2 0 1 1 0 0 1-2 0Z\"/>\r\n </svg>\r\n)\r\n\r\n// @ts-ignore\r\nexport const CartLineItemComponent: React.FunctionComponent<ICartLineProps> = msdyn365Commerce.createComponentOverride<ICartline>(\r\n 'CartLineItem',\r\n { component: CartLineComponent, ...CartLineItemFunctions }\r\n);\r\n\r\nexport default CartLineItemComponent;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselData } from './carousel.data';\nimport { ICarouselProps } from './carousel.props.autogenerated';\nimport { ICarouselState } from './carousel.state';\n\nexport interface ICarouselViewProps extends ICarouselProps<{}>, ICarouselState {\n closeAnimation: string;\n carouselContainer: IModuleProps;\n telemetryContent: ITelemetryContent;\n next(): void;\n previous(): void;\n onIndicatorsClickHandler(): void;\n handleDismissCarousel(): void;\n handleOnExited(): void;\n handleOnExiting(): void;\n}\n\n/**\n *\n * CarouselModule component.\n * @extends {React.PureComponent<ICarouselProps<ICarouselData>>}\n */\nclass CarouselModule extends React.PureComponent<ICarouselProps<ICarouselData>, ICarouselState> {\n private animating: boolean;\n\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: ICarouselProps<ICarouselData>, state: ICarouselState) {\n super(props);\n this.state = { activeIndex: 0, closeNow: false, dismissCarousel: false };\n this.animating = false;\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public componentDidMount(): void {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n if (this.props.context.request.cookies.get(`CarouselDismiss_${this.props.id}`) === undefined) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'false');\n this.setState({ dismissCarousel: false });\n }\n }\n }\n\n public render(): JSX.Element | null {\n if (this.state.dismissCarousel) {\n return null;\n }\n\n const { className } = this.props.config;\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 ...this.state,\n telemetryContent: this.telemetryContent,\n carouselContainer: {\n moduleProps: this.props,\n className: classnames('ms-carousel', className)\n },\n closeAnimation: this.state.closeNow ? 'close-now' : '',\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n handleDismissCarousel: this._handleDismissCarousel,\n handleOnExited: this._onExited,\n handleOnExiting: this._onExiting\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Function implementation to dismiss the Carousel.\n */\n private readonly _handleDismissCarousel = (): void => {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'true');\n this.setState({ dismissCarousel: true });\n }\n };\n\n /**\n * Function implementation to move to next slide.\n */\n private readonly _next = (): void => {\n const { slots } = this.props;\n const nextIndex = this.state.activeIndex === (slots && slots.content && slots.content.length - 1) ? 0 : this.state.activeIndex + 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n /**\n * Function implementation to move to previous slide.\n */\n private readonly _previous = (): void => {\n const slots = this.props.slots && this.props.slots.content;\n const nextIndex = this.state.activeIndex === 0 ? (slots ? slots.length - 1 : 0) : this.state.activeIndex - 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n private readonly _onExiting = (): void => {\n this.animating = true;\n };\n\n private readonly _onExited = (): void => {\n this.animating = false;\n this.setState({ closeNow: false });\n };\n\n /**\n * Function implementation to move to a given slide.\n * @param newIndex\n */\n private readonly _goToIndex = (newIndex: number): void => {\n if (this.animating) {\n return;\n }\n this.setState({ activeIndex: newIndex });\n };\n}\n\nexport default CarouselModule;\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 { Module } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselViewProps } from './carousel';\n\n/**\n * Returns item slots.\n * @returns Array of item slots.\n * @param props -Props.\n */\nconst retrieveItems = (props: ICarouselViewProps): React.ReactNode[] => {\n let items = [];\n items = props.slots && props.slots.content && props.slots.content.length > 0 ? props.slots.content : [];\n return items;\n};\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\n <Module {...props.carouselContainer} {...props.renderModuleAttributes(props)}>\n <Carousel\n className={classnames(props.closeAnimation)}\n activeIndex={props.activeIndex}\n next={props.next}\n previous={props.previous}\n pause={props.config.pauseOnHover ? 'hover' : false}\n ride={props.config.autoplay ? 'carousel' : undefined}\n autoplay={props.config.autoplay}\n interval={props.config.interval}\n transitionType={props.config.transitionType ? props.config.transitionType : undefined}\n items={retrieveItems(props)}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n keyboard={props.config.keyboard}\n />\n </Module>\n);\n\nexport default CarouselView;\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.\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 * as React from 'react';\n\n/**\n * The payment error.\n */\nexport interface IPaymentError {\n title: string;\n message: string;\n className?: string;\n}\n\n/**\n * The payment error.\n * @param param0 - First param.\n * @param param0.title - Title.\n * @param param0.message - Message.\n * @param param0.className - ClassName.\n * @returns React node.\n */\nexport const ErrorComponent: React.FC<IPaymentError> = ({ title, message, className = 'ms-checkout-payment-instrument' }) => (\n <div className={`${className}__error`} role='alert' aria-live='assertive'>\n <p className={`${className}__error-title`}>{title}</p>\n <p className={`${className}__error-message`}>{message}</p>\n </div>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsDescriptionProps {\n description?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.description\n * @extends {React.FC<ICheckoutDeliveryOptionsDescriptionProps>}\n */\nconst CheckoutDeliveryOptionsDescription: React.FC<ICheckoutDeliveryOptionsDescriptionProps> = ({ description }) => {\n if (!description) {\n return null;\n }\n\n return <span className='ms-checkout-delivery-options__description'>{description}</span>;\n};\n\nexport default CheckoutDeliveryOptionsDescription;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorMessageProps {\n message?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.message\n * @extends {React.FC<ICheckoutDeliveryOptionsErrorMessageProps>}\n */\nconst CheckoutDeliveryOptionsErrorMessage: React.FC<ICheckoutDeliveryOptionsErrorMessageProps> = ({ message }) => {\n if (!message) {\n return null;\n }\n\n return <p className='ms-checkout-delivery-options__error-message'>{message}</p>;\n};\n\nexport default CheckoutDeliveryOptionsErrorMessage;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutDeliveryOptionsErrorTitleProps {\n title?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.title\n * @extends {React.FC<ICheckoutDeliveryOptionsErrorTitleProps>}\n */\nconst CheckoutDeliveryOptionsErrorTitle: React.FC<ICheckoutDeliveryOptionsErrorTitleProps> = ({ title }) => {\n if (!title) {\n return null;\n }\n\n return <p className='ms-checkout-delivery-options__error-title'>{title}</p>;\n};\n\nexport default CheckoutDeliveryOptionsErrorTitle;\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 ICheckoutDeliveryOptionsRadioButtonProps {\n isChecked: boolean;\n value?: string;\n ariaSetSize: number;\n ariaPosInSet: number;\n ariaLabel?: string;\n telemetryContent?: ITelemetryContent;\n onChange(event: React.ChangeEvent<HTMLInputElement>): void;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.isChecked\n * @param root0.value\n * @param root0.ariaSetSize\n * @param root0.ariaPosInSet\n * @param root0.ariaLabel\n * @param root0.telemetryContent\n * @param root0.onChange\n * @extends {React.FC<ICheckoutDeliveryOptionsRadioButtonProps>}\n */\nconst CheckoutDeliveryOptionsRadioButton: React.FC<ICheckoutDeliveryOptionsRadioButtonProps> = ({\n isChecked,\n value,\n ariaSetSize,\n ariaPosInSet,\n ariaLabel,\n telemetryContent,\n onChange\n}) => {\n if (!value) {\n return null;\n }\n\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.DeliveryOptions);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n\n return (\n <input\n className='ms-checkout-delivery-options__input-radio'\n checked={isChecked}\n aria-checked={isChecked}\n type='radio'\n aria-setsize={ariaSetSize}\n aria-posinset={ariaPosInSet}\n aria-label={payLoad.contentAction.etext && ariaLabel ? `${ariaLabel} ${payLoad.contentAction.etext}` : ariaLabel}\n value={value}\n name='deliveryOptions'\n {...attributes}\n onChange={onChange}\n />\n );\n};\n\nexport default CheckoutDeliveryOptionsRadioButton;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ErrorLocation, ICheckoutState } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelDeliveryOptionConfiguration, FilterDeliveryModeOption } from '@msdyn365-commerce/retail-proxy';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Address, CartLine, DeliveryOption } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, Waiting } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport get from 'lodash/get';\nimport { action, computed, observable, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ErrorComponent } from '../../common/error';\nimport { ICheckoutDeliveryOptionsData } from './checkout-delivery-options.data';\nimport {\n filterDeliveryModeOption,\n ICheckoutDeliveryOptionsProps,\n useDefaultDeliveryOption\n} from './checkout-delivery-options.props.autogenerated';\nimport DescriptionComponent from './components/checkout-delivery-options.description';\nimport ErrorMessageComponent from './components/checkout-delivery-options.error-message';\nimport ErrorTitleComponent from './components/checkout-delivery-options.error-title';\nimport RadioButtonComponent from './components/checkout-delivery-options.radio-button';\n\nexport interface ICheckoutDeliveryOptionsModuleProps\n extends ICheckoutDeliveryOptionsProps<ICheckoutDeliveryOptionsData>,\n IModuleStateProps {}\n\nexport interface ICheckoutDeliveryOption {\n DeliveryOption: INodeProps;\n description?: React.ReactNode;\n price?: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionEdit extends ICheckoutDeliveryOption {\n code: string;\n radioButton?: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionsList {\n DeliveryOptionsList: INodeProps;\n list: ICheckoutDeliveryOptionEdit[];\n}\n\nexport interface ICheckoutDeliveryOptionsError {\n Error: INodeProps;\n title: React.ReactNode;\n message: React.ReactNode;\n}\n\nexport interface ICheckoutDeliveryOptionsViewState {\n isLoading: boolean;\n isError: boolean;\n isShowList: boolean;\n isShowSelected: boolean;\n isShowSaveButton: boolean;\n isShowEditButton: boolean;\n isShowCancelButton: boolean;\n}\n\nexport interface ICheckoutDeliveryOptionsViewProps extends ICheckoutDeliveryOptionsProps<{}> {\n CheckoutDeliveryOptions: IModuleProps;\n selectedItemId: string;\n deliveryOptionsData: DeliveryOption[];\n isLoading: boolean;\n errorMessageData: string;\n viewState: ICheckoutDeliveryOptionsViewState;\n deliveryOptions?: ICheckoutDeliveryOptionsList;\n deliveryOptionSelected?: ICheckoutDeliveryOption;\n errorMessage?: ICheckoutDeliveryOptionsError;\n waiting?: React.ReactNode;\n saveButton?: React.ReactNode;\n editButton?: React.ReactNode;\n cancelButton?: React.ReactNode;\n alert?: React.ReactNode;\n onDeliveryOptionChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onSave(): void;\n onEdit(): void;\n onCancel(): void;\n}\n\n/**\n *\n * CheckoutDeliveryOptions component.\n * @extends {React.Component<ICheckoutDeliveryOptionsProps<ICheckoutDeliveryOptionsData>>}\n */\n// @ts-expect-error\n@withModuleState\n@observer\nclass CheckoutDeliveryOptions extends React.Component<ICheckoutDeliveryOptionsModuleProps> {\n @observable private selectedItemId: string = '';\n\n @observable private deliveryOptions: DeliveryOption[] = [];\n\n @observable private isLoading: boolean = false;\n\n @observable private errorMessage?: string;\n\n @computed private get isDataReady(): boolean {\n return (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS';\n }\n\n public get expressPaymentDetailsFromCartPage() {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n const properties =\n this.props.data.cart?.result?.cart?.ExtensionProperties?.find(property => property.Key === 'expressPaymentDetails')?.Value\n ?.StringValue ?? '';\n\n return properties ? JSON.parse(properties) : null;\n }\n\n public get isExpressPaymentAppliedInCartPage(): boolean {\n return this.expressPaymentDetailsFromCartPage?.isExpressCheckoutAppliedInCartPage ?? false;\n }\n\n private cartDeliveryMode?: string;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n private readonly isSelectDefaultOptionEnabled?: boolean;\n\n public constructor(props: ICheckoutDeliveryOptionsModuleProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.isSelectDefaultOptionEnabled =\n this.props.config.useDefaultDeliveryOption && this.props.config.useDefaultDeliveryOption !== useDefaultDeliveryOption.none;\n }\n\n public async componentDidMount(): Promise<void> {\n when(\n () => this.isDataReady,\n async () => {\n await this.init();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.shippingAddress,\n async () => {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n );\n\n reaction(\n () => this.props.data.checkout.result?.isExpressCheckoutApplied,\n async isExpressCheckoutApplied => {\n if (isExpressCheckoutApplied && this.canShip() && !this.isExpressPaymentAppliedInCartPage) {\n await this.loadDeliveryOptions();\n this.props.moduleState.setIsCancellable(false);\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n }\n }\n );\n\n if (this.props.data.checkout.result?.shouldEnableCheckoutErrorDisplayMessaging) {\n reaction(\n () => this.props.data.checkout.result?.checkoutError,\n checkoutError => {\n if (\n checkoutError &&\n checkoutError.errorLocation === ErrorLocation.CheckoutDeliveryOptions &&\n checkoutError.errorMessage\n ) {\n this.setError(checkoutError.errorMessage);\n }\n }\n );\n }\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutDeliveryOptionsModuleProps, nextState: ICheckoutDeliveryOptionsViewState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n if (!this.canShip()) {\n this.props.context.telemetry.error('Checkout delivery options content is empty, module wont render');\n return null;\n }\n\n const {\n moduleState: { isReady, isUpdating, hasError }\n } = this.props;\n const isError = !this.isLoading && hasError;\n const isShowList = !this.isLoading && !hasError && isUpdating && !this.isSelectDefaultOptionEnabled;\n const isShowSelected = !this.isLoading && !hasError && isReady;\n const { errorMessageTitle, deliveryOptionAriaLabel } = this.props.resources;\n\n const viewProps = {\n ...this.props,\n onDeliveryOptionChange: this.onDeliveryOptionChange,\n selectedItemId: this.selectedItemId,\n deliveryOptionsData: this.deliveryOptions,\n isLoading: this.isLoading,\n alert: this.errorMessage && <ErrorComponent {...{ title: errorMessageTitle, message: this.errorMessage }} />,\n errorMessageData: this.errorMessage,\n viewState: {\n isLoading: this.isLoading,\n isError,\n isShowList,\n isShowSelected,\n isShowSaveButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup,\n isShowEditButton: isShowSelected && !this.props.moduleState.hasExternalSubmitGroup,\n isShowCancelButton: isShowList && !this.props.moduleState.hasExternalSubmitGroup && !!this.getSavedDeliveryOption()\n },\n CheckoutDeliveryOptions: {\n moduleProps: this.props,\n className: classname('ms-checkout-delivery-options', this.props.config.className)\n },\n deliveryOptions: {\n DeliveryOptionsList: {\n className: 'ms-checkout-delivery-options__list',\n role: 'list',\n 'aria-label': deliveryOptionAriaLabel\n },\n list: this.getDeliveryOptionList()\n },\n deliveryOptionSelected: this.getDeliveryOptionSelected(),\n errorMessage: this.getErrorMessage(),\n waiting: <Waiting />,\n saveButton: this.getSaveButton(),\n editButton: this.getEditButton(),\n cancelButton: this.getCancelButton(),\n onSave: this.onSave,\n onEdit: this.onEdit,\n onCancel: this.onCancel\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n @action\n private readonly init = async (): Promise<void> => {\n this.props.moduleState.init({\n onEdit: this.isSelectDefaultOptionEnabled ? undefined : this.onEdit,\n onCancel: this.isSelectDefaultOptionEnabled ? undefined : this.onCancel,\n onSubmit: this.isSelectDefaultOptionEnabled ? undefined : this.onSubmit,\n status:\n !(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption) &&\n this.canShip()\n ? 'updating'\n : 'disabled'\n });\n\n this.cartDeliveryMode = this.getSavedDeliveryOption();\n await this.loadDeliveryOptions();\n };\n\n private readonly canShip = (): boolean => {\n const hasInvoice = this.props.data.checkout.result?.checkoutCart.hasInvoiceLine;\n return !hasInvoice && this.getCartLinesForShipping().length > 0;\n };\n\n private readonly isDeliveryModeExists = (deliveryMode: string | undefined): boolean => {\n if (deliveryMode) {\n if (this.deliveryOptions.find(deliveryOption => deliveryOption.Code === deliveryMode)) {\n return true;\n }\n }\n return false;\n };\n\n private readonly getDeliveryOptionSelected = (): ICheckoutDeliveryOption | null => {\n const selectedItem = this.deliveryOptions.find(deliveryOption => deliveryOption.Code === this.selectedItemId);\n if (!selectedItem) {\n this.props.context.telemetry.error('Checkout delivery options content is empty, module wont render');\n return null;\n }\n\n const { id, typeName, context } = this.props;\n const { priceFree } = this.props.resources;\n const price = get(selectedItem, 'ShippingChargeAmount', 0);\n\n return {\n DeliveryOption: { className: 'ms-checkout-delivery-options__option-selected' },\n description: <DescriptionComponent {...{ description: selectedItem.Description }} />,\n price: (\n <PriceComponent\n id={id}\n typeName={typeName}\n context={context}\n className='ms-checkout-delivery-options__price'\n data={{ price: { CustomerContextualPrice: price } }}\n freePriceText={priceFree}\n />\n )\n };\n };\n\n private readonly getErrorMessage = (): ICheckoutDeliveryOptionsError => {\n const { errorMessageTitle } = this.props.resources;\n return {\n // @ts-expect-error\n CheckoutDeliveryOptionsError: { tag: 'span', className: 'ms-address-form__error', role: 'alert', 'aria-live': 'assertive' },\n title: <ErrorTitleComponent {...{ title: errorMessageTitle }} />,\n message: <ErrorMessageComponent {...{ message: this.errorMessage }} />\n };\n };\n\n private readonly getDeliveryOptionList = (): ICheckoutDeliveryOptionEdit[] => {\n const count = this.deliveryOptions.length;\n const { priceFree } = this.props.resources;\n const { id, typeName, context } = this.props;\n\n return this.deliveryOptions.map((deliveryOption: DeliveryOption, index: number) => {\n return {\n DeliveryOption: { className: 'ms-checkout-delivery-options__option', role: 'listitem' },\n code: deliveryOption.Code || '',\n radioButton: (\n <RadioButtonComponent\n {...{\n isChecked: deliveryOption.Code === this.selectedItemId,\n value: deliveryOption.Code,\n ariaSetSize: count,\n ariaPosInSet: index + 1,\n ariaLabel: `${deliveryOption.Description!}`,\n onChange: this.onDeliveryOptionChange,\n telemetryContent: this.telemetryContent\n }}\n />\n ),\n description: (\n <DescriptionComponent\n {...{\n description: deliveryOption.Description\n }}\n />\n ),\n price: (\n <PriceComponent\n id={id}\n typeName={typeName}\n context={context}\n className='ms-checkout-delivery-options__price'\n data={{ price: { CustomerContextualPrice: get(deliveryOption, 'ShippingChargeAmount', 0) } }}\n freePriceText={priceFree}\n />\n )\n };\n });\n };\n\n private readonly getSaveButton = (): React.ReactNode => {\n const { saveBtnLabel = 'Save' } = this.props.resources;\n return (\n <Button\n className='ms-checkout-delivery-options__btn-save'\n title={saveBtnLabel}\n color='primary'\n disabled={!this.selectedItemId}\n onClick={this.onSave}\n >\n {saveBtnLabel}\n </Button>\n );\n };\n\n private readonly getEditButton = (): React.ReactNode => {\n const { editBtnLabel = 'Change' } = this.props.resources;\n return (\n <Button className='ms-checkout-delivery-options__btn-edit' title={editBtnLabel} color='primary' onClick={this.onEdit}>\n {editBtnLabel}\n </Button>\n );\n };\n\n private readonly getCancelButton = (): React.ReactNode => {\n const { cancelBtnLabel = 'Cancel' } = this.props.resources;\n return (\n <Button className='ms-checkout-delivery-options__btn-cancel' title={cancelBtnLabel} color='secondary' onClick={this.onCancel}>\n {cancelBtnLabel}\n </Button>\n );\n };\n\n private readonly setError = (errorMessage: string): void => {\n this.props.telemetry.error(errorMessage);\n this.props.moduleState.setHasError(true);\n this.props.moduleState.onUpdating();\n this.errorMessage = errorMessage;\n };\n\n private readonly clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.errorMessage = undefined;\n };\n\n private readonly onSave = async (): Promise<void> => {\n await this.onSubmit();\n };\n\n private readonly onEdit = async (): Promise<void> => {\n this.props.telemetry.information('Delivery options onEdit is called.');\n\n this.onUpdating();\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: true });\n };\n\n private readonly onSubmit = async (): Promise<void> => {\n this.props.telemetry.information('Delivery options onSubmit is called.');\n\n await this.updateCartDeliverySpecification(this.selectedItemId);\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n };\n\n private readonly onCancel = async (): Promise<void> => {\n this.props.telemetry.information('Delivery options onCancel is called.');\n\n // Reset to the saved value\n const savedDeliveryOption = this.getSavedDeliveryOption();\n if (savedDeliveryOption) {\n this.selectedItemId = savedDeliveryOption;\n this.onReady();\n\n await this.props.data.checkout.result?.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n } else {\n this.onUpdating();\n }\n };\n\n private readonly getSavedDeliveryOption = (): string | undefined => {\n const cartLinesForShipping = this.getCartLinesForShipping();\n return cartLinesForShipping[0] && cartLinesForShipping[0].DeliveryMode;\n };\n\n private readonly updateCartDeliverySpecification = async (deliveryModeId: string): Promise<void> => {\n if (deliveryModeId.trim() === '') {\n return;\n }\n\n const { resources } = this.props;\n const checkoutState = this.props.data.checkout.result as ICheckoutState;\n const updateCartDeliverySpecificationInput = {\n deliveryModeId,\n shippingAddress: checkoutState.shippingAddress,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined\n };\n\n this.clearError();\n this.onPending();\n\n await checkoutState.checkoutCart\n .updateCartDeliverySpecification(updateCartDeliverySpecificationInput)\n .then(response => {\n if (response.status === 'FAILED') {\n this.setError(resources.genericErrorMessage);\n } else {\n this.onReady();\n this.props.moduleState.setIsCancellable(true);\n }\n })\n .catch(() => {\n this.setError(resources.genericErrorMessage);\n });\n };\n\n private readonly getCartLinesForShipping = (): CartLine[] => {\n const { request } = this.props.context;\n const pickupDeliveryModeCode = request && request.channel && request.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode = request && request.channel && request.channel.EmailDeliveryModeCode;\n\n return this.retailMultiplePickUpOptionEnabled\n ? ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !==\n this.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(\n deliveryMode => deliveryMode === cartLine.DeliveryMode\n ) && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n )\n : ((this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart.CartLines) || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n );\n };\n\n private readonly getDeliveryOptions = async (shippingAddress: Address): Promise<void> => {\n if (!this.props.data.checkout.result) {\n return;\n }\n\n const { context, resources, config } = this.props;\n const cartState = this.props.data.checkout.result?.checkoutCart;\n const cartId = (cartState.cart as Cart).Id;\n\n if (context) {\n this.isLoading = true;\n this.deliveryOptions = [];\n this.selectedItemId = '';\n this.clearError();\n\n try {\n let originalDeliveryMode: string = '';\n const shippingCartLines = this.getCartLinesForShipping();\n const hasShippingDeliveryLines = shippingCartLines && shippingCartLines.length > 0 && shippingCartLines[0].DeliveryMode;\n if (hasShippingDeliveryLines) {\n // First store the delivery mode, so that we can restore the shipping information.\n originalDeliveryMode = shippingCartLines[0].DeliveryMode || '';\n\n // Clear the delivery information on retail server, so GetDeliveryOptions charge calculation works correctly\n const cart = cartState.cart;\n await cartState.clearCartLinesDeliveryInformation({\n cart,\n channelDeliveryOptionConfiguration: this.channelDeliveryOptionConfig\n });\n }\n\n // TODO: Check if we can move this getDeliveryOptions to checkout state\n let deliveryOptionFilter: FilterDeliveryModeOption;\n switch (config.filterDeliveryModeOption) {\n case filterDeliveryModeOption.none:\n deliveryOptionFilter = FilterDeliveryModeOption.None;\n break;\n case filterDeliveryModeOption.filterOutNonCarrierDeliveryMode:\n deliveryOptionFilter = FilterDeliveryModeOption.FilterOutNonCarrierDeliveryMode;\n break;\n default:\n deliveryOptionFilter = FilterDeliveryModeOption.FilterOutNonCarrierDeliveryMode;\n }\n const response = await getDeliveryOptionsAsync(\n {\n callerContext: context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context.actionContext)\n },\n cartId,\n shippingAddress,\n [],\n deliveryOptionFilter,\n true\n );\n\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n\n if (response && response.length > 0) {\n this.deliveryOptions = response;\n }\n } catch {\n this.setError(resources.genericErrorMessage);\n }\n\n if (this.deliveryOptions.length === 0) {\n this.setError(resources.deliveryOptionsNotFound);\n } else if (this.cartDeliveryMode && this.isDeliveryModeExists(this.cartDeliveryMode)) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: true });\n\n if (!this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n } else {\n this.onUpdating();\n this.selectedItemId = this.deliveryOptions.length > 0 ? this.deliveryOptions[0].Code || '' : ''; // By default, select first delivery\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: !!this.isSelectDefaultOptionEnabled });\n }\n\n this.isLoading = false;\n }\n };\n\n private readonly getStoredDeliveryOptions = async (): Promise<void> => {\n if (!this.props.data.checkout.result) {\n return;\n }\n\n const { context } = this.props;\n const cartState = this.props.data.checkout.result.checkoutCart;\n\n if (context) {\n this.isLoading = true;\n this.deliveryOptions = [];\n this.selectedItemId = '';\n this.clearError();\n\n let originalDeliveryMode: string = '';\n const shippingCartLines = this.getCartLinesForShipping();\n const hasShippingDeliveryLines = shippingCartLines && shippingCartLines.length > 0 && shippingCartLines[0].DeliveryMode;\n if (hasShippingDeliveryLines) {\n // First store the delivery mode, so that we can restore the shipping information.\n originalDeliveryMode = shippingCartLines[0].DeliveryMode || '';\n\n // Clear the delivery information on retail server, so GetDeliveryOptions charge calculation works correctly\n const cart = cartState.cart;\n await cartState.clearCartLinesDeliveryInformation({\n cart,\n channelDeliveryOptionConfiguration: this.channelDeliveryOptionConfig\n });\n if (hasShippingDeliveryLines) {\n await this.updateCartDeliverySpecification(originalDeliveryMode);\n }\n }\n\n if (this.cartDeliveryMode) {\n this.selectedItemId = this.cartDeliveryMode;\n this.cartDeliveryMode = undefined;\n this.onReady();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Explicitly check for null/undefined.\n this.props.data.checkout.result?.updateHasCartDeliveryMode({ newHasCartDeliveryMode: true });\n\n if (!this.props.data.checkout.result.isPaymentVerificationRedirection) {\n await this.props.data.checkout.result.updateShouldCollapsePaymentSection({ newShouldCollapsePaymentSection: false });\n }\n }\n\n this.isLoading = false;\n }\n };\n\n private readonly loadDeliveryOptions = async (): Promise<void> => {\n const shippingAddress = this.props.data.checkout.result?.shippingAddress;\n\n if (this.canShip() && shippingAddress) {\n if (\n !this.props.data.checkout.result?.isPaymentVerificationRedirection ||\n this.isSelectDefaultOptionEnabled ||\n this.props.data.checkout.result?.isExpressCheckoutApplied\n ) {\n await this.getDeliveryOptions(shippingAddress);\n }\n\n if (this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n await this.getStoredDeliveryOptions();\n }\n\n if (\n this.isSelectDefaultOptionEnabled ||\n this.props.data.checkout.result?.isExpressCheckoutApplied ||\n this.isExpressPaymentAppliedInCartPage\n ) {\n this.onSubmit();\n }\n }\n };\n\n private readonly onDeliveryOptionChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const deliveryModeId = event.currentTarget.value;\n this.selectedItemId = deliveryModeId;\n };\n\n private readonly onReady = () => {\n if (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption)) {\n this.props.moduleState.onReady();\n }\n };\n\n private readonly onUpdating = () => {\n if (!(this.props.config.useDefaultDeliveryOption === useDefaultDeliveryOption.notDisplaySelectedDeliveryOption)) {\n this.props.moduleState.onUpdating();\n }\n };\n\n private readonly onPending = () => {\n if (!this.isSelectDefaultOptionEnabled) {\n this.props.moduleState.onPending();\n }\n };\n}\n\nexport default CheckoutDeliveryOptions;\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 {\n ICheckoutDeliveryOption,\n ICheckoutDeliveryOptionEdit,\n ICheckoutDeliveryOptionsList,\n ICheckoutDeliveryOptionsViewProps\n} from './checkout-delivery-options';\n\nconst DeliveryOptionList: React.FC<ICheckoutDeliveryOptionsList> = ({ DeliveryOptionsList, list }) => {\n if (!list || list.length === 0) {\n return null;\n }\n\n return (\n <Node {...DeliveryOptionsList}>\n {list.map((deliveryOption: ICheckoutDeliveryOptionEdit) => {\n return (\n <Node {...deliveryOption.DeliveryOption} key={deliveryOption.code} aria-label='Please select a delivery option.'>\n {deliveryOption.radioButton}\n {deliveryOption.description}\n {deliveryOption.price}\n </Node>\n );\n })}\n </Node>\n );\n};\n\nconst DeliveryOptionSelected: React.FC<ICheckoutDeliveryOption> = ({ DeliveryOption, description, price }) => {\n return (\n <Node {...DeliveryOption}>\n {description}\n {price}\n </Node>\n );\n};\n\nconst CheckoutDeliveryOptionsView: React.FC<ICheckoutDeliveryOptionsViewProps> = props => {\n const {\n CheckoutDeliveryOptions,\n viewState,\n deliveryOptions,\n deliveryOptionSelected,\n alert,\n waiting,\n saveButton,\n editButton,\n cancelButton\n } = props;\n\n return (\n // TODO: All wrapper div should be provided by viewProps. Once SDK provide the sln, update markup.\n <Module {...CheckoutDeliveryOptions}>\n {viewState.isLoading && waiting}\n {viewState.isError && alert}\n {viewState.isShowList && deliveryOptions && <DeliveryOptionList {...deliveryOptions} />}\n {viewState.isShowSelected && deliveryOptionSelected && <DeliveryOptionSelected {...deliveryOptionSelected} />}\n {viewState.isShowSaveButton && saveButton}\n {viewState.isShowEditButton && editButton}\n {viewState.isShowCancelButton && cancelButton}\n </Module>\n );\n};\n\nexport default CheckoutDeliveryOptionsView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyInput {\n className: string;\n type: string;\n value: string | number;\n min: number;\n max: number;\n ariaValueMax: number;\n ariaValueMin: number;\n ariaValueNow: number;\n id: string;\n step: string;\n onChange(event: React.ChangeEvent<HTMLInputElement>): void;\n onBlur(event: React.FocusEvent<HTMLInputElement>): void;\n}\n\nconst AdressInput: React.FC<ICheckoutLoyaltyInput> = ({\n className,\n type,\n value,\n min,\n max,\n step,\n ariaValueMax,\n ariaValueMin,\n ariaValueNow,\n onChange,\n onBlur,\n id\n}) => (\n <input\n className={className}\n type={type}\n value={value}\n min={min}\n max={max}\n step={step}\n aria-valuemax={ariaValueMax}\n aria-valuemin={ariaValueMin}\n aria-valuenow={ariaValueNow}\n onChange={onChange}\n onBlur={onBlur}\n id={id}\n />\n);\n\nexport default AdressInput;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyLabelProps {\n className: string;\n text: string;\n htmlFor: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.className\n * @param root0.text\n * @param root0.htmlFor\n * @extends {React.FC<ICheckoutLoyaltyLabelProps>}\n */\nconst CheckoutLoyaltyLabel: React.FC<ICheckoutLoyaltyLabelProps> = ({ className, text, htmlFor }) => {\n return (\n <label className={className} htmlFor={htmlFor}>\n {text}\n </label>\n );\n};\n\nexport default CheckoutLoyaltyLabel;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface ICheckoutLoyaltyTextProps {\n className: string;\n text?: string;\n}\n\n/**\n * AddPaymentForm SFC.\n * @param root0\n * @param root0.className\n * @param root0.text\n * @extends {React.FC<ICheckoutLoyaltyTextProps>}\n */\nconst CheckoutLoyaltyText: React.FC<ICheckoutLoyaltyTextProps> = ({ className, text }) => {\n if (!text) {\n return null;\n }\n\n return <span className={className}>{text}</span>;\n};\n\nexport default CheckoutLoyaltyText;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { callActionOrExecute } from '@msdyn365-commerce/retail-proxy';\nimport { createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { LoyaltyPointRedemptionEstimate, LoyaltyRewardPoint } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IModuleStateProps, withModuleState } from '@msdyn365-commerce-modules/checkout-utilities';\nimport { GetLoyaltyTransactionEstimationInput } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Drawer, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport { ErrorLocation } from '@msdyn365-commerce/global-state';\nimport classnames from 'classnames';\nimport { action, computed, reaction, when } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ICheckoutLoyaltyData } from './checkout-loyalty.data';\nimport { ICheckoutLoyaltyProps } from './checkout-loyalty.props.autogenerated';\nimport InputComponent from './components/checkout-loyalty-input';\nimport LabelComponent from './components/checkout-loyalty-label';\nimport TextComponent from './components/checkout-loyalty-text';\nimport { ErrorComponent } from '../../common/error';\n\nexport interface ICheckoutLoyaltyState {\n dollarsApplied: number;\n isFetchingLoyaltyCard: boolean;\n errorMessage?: string;\n}\n\nexport interface ICheckoutLoyaltyModuleProps extends ICheckoutLoyaltyProps<ICheckoutLoyaltyData>, IModuleStateProps {}\n\nexport interface ICheckoutLoyaltyViewState {\n isShowLoyalty: boolean;\n isShowAddLoyalty: boolean;\n}\n\nexport interface ICheckoutLoyaltyShow {\n heading: React.ReactNode;\n coveredAmountText: React.ReactNode;\n amount: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyRewardPoint {\n checkoutLoyaltyRewardPoint: INodeProps;\n key: string;\n title: React.ReactNode;\n availablePointsText: React.ReactNode;\n activePoints: React.ReactNode;\n expiringPointsText: React.ReactNode;\n expiringPoints: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyAdd {\n heading: React.ReactNode;\n cardNumber: React.ReactNode;\n drawer: INodeProps;\n rewardPoints: ICheckoutLoyaltyRewardPoint[];\n loyaltyAmountContainer: INodeProps;\n appliedLoyaltyAmountContainer: INodeProps;\n loyaltyAmountLabel: React.ReactNode;\n loyaltyAmountInput: React.ReactNode;\n loyaltyAmountApplyButton: React.ReactNode;\n showAppliedAmount: boolean;\n loyaltyAmountAppliedText: React.ReactNode;\n loyaltyAmountAppliedPrice: React.ReactNode;\n loyaltyAmountRemoveButton: React.ReactNode;\n}\n\nexport interface ICheckoutLoyaltyViewProps extends ICheckoutLoyaltyModuleProps {\n checkoutLoyalty: IModuleProps;\n viewState: ICheckoutLoyaltyViewState;\n showLoyalty: ICheckoutLoyaltyShow;\n addLoyalty: ICheckoutLoyaltyAdd;\n alert?: React.ReactNode;\n}\n\n/**\n *\n * CheckoutLoyalty component.\n * @extends {React.Component<ICheckoutLoyaltyProps<ICheckoutLoyaltyData>>}\n */\n// @ts-expect-error\n\n@withModuleState\n@observer\nclass CheckoutLoyalty extends React.Component<ICheckoutLoyaltyModuleProps, ICheckoutLoyaltyState> {\n private readonly _dialogToggleRef: React.RefObject<HTMLButtonElement> | undefined;\n\n private readonly moduleClassName: string = 'ms-checkout-loyalty';\n\n private readonly _defaultLoyaltyPoints: number = 0;\n\n constructor(props: ICheckoutLoyaltyModuleProps) {\n super(props);\n this._dialogToggleRef = React.createRef();\n this._applyLoyaltyPoints = this._applyLoyaltyPoints.bind(this);\n this._removeLoyaltyPoints = this._removeLoyaltyPoints.bind(this);\n this._onInputChange = this._onInputChange.bind(this);\n this._onBlur = this._onBlur.bind(this);\n this.state = { dollarsApplied: this.maxDollars, isFetchingLoyaltyCard: false };\n }\n\n @computed get shouldPayLoyalty(): boolean {\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n if (!cart) {\n return false;\n }\n\n // Use loyalty when cart is not full of free items\n const amountDue = cart.TotalAmount || 0;\n return amountDue > 0;\n }\n\n @computed get isDataReady(): boolean {\n return (\n (this.props.data.checkout.result && this.props.data.checkout.status) === 'SUCCESS' &&\n (this.props.data.loyaltyCard && this.props.data.loyaltyCard.status) !== 'LOADING' &&\n (this.props.data.loyaltyTransactionEstimation && this.props.data.loyaltyTransactionEstimation.status) !== 'LOADING'\n );\n }\n\n @computed get maxDollars(): number {\n return this.props.data.loyaltyTransactionEstimation.result &&\n this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints\n ? this.props.data.loyaltyTransactionEstimation.result.MaxCurrencyValueOfLoyaltyPoints\n : 0;\n }\n\n public async componentDidMount(): Promise<void> {\n when(\n () => this.isDataReady,\n async () => {\n await this.init();\n }\n );\n\n reaction(\n () => this.props.data.checkout.result && this.props.data.checkout.result.checkoutCart.cart,\n async () => {\n this._updateEstimate();\n }\n );\n\n reaction(\n () => this.props.data.loyaltyCard.result,\n async () => {\n this._updateLoyalty();\n }\n );\n\n if (this.props.data.checkout.result?.shouldEnableCheckoutErrorDisplayMessaging) {\n reaction(\n () => this.props.data.checkout.result?.checkoutError,\n checkoutError => {\n if (checkoutError && checkoutError.errorLocation === ErrorLocation.CheckoutLoyalty && checkoutError.errorMessage) {\n this._setErrorMessage(checkoutError.errorMessage);\n }\n }\n );\n }\n }\n\n public shouldComponentUpdate(nextProps: ICheckoutLoyaltyModuleProps, nextState: ICheckoutLoyaltyState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const {\n resources,\n renderView,\n moduleState: { hasError, isReady }\n } = this.props;\n\n if (\n this.props.data.loyaltyCard &&\n this.props.data.loyaltyCard.result &&\n this.props.data.loyaltyCard.result.CardNumber &&\n this.shouldPayLoyalty\n ) {\n const loyaltyCard = this.props.data.loyaltyCard.result;\n const checkoutState = this.props.data.checkout.result;\n let isShowLoyalty = false;\n const errorMessage = this.state.errorMessage;\n\n if (isReady) {\n if (!checkoutState || checkoutState.loyaltyAmount === 0) {\n return null;\n }\n isShowLoyalty = true;\n }\n\n const viewProps = {\n ...this.props,\n viewState: {\n isShowLoyalty,\n isShowAddLoyalty: !isReady\n },\n alert: hasError && errorMessage && <ErrorComponent {...{ title: resources.errorMessageTitle, message: errorMessage }} />,\n checkoutLoyalty: {\n moduleProps: this.props,\n className: classnames(\n this.moduleClassName,\n { [`${this.moduleClassName}__applied`]: isShowLoyalty },\n this.props.config.className\n )\n },\n showLoyalty: {\n heading: <Heading headingTag='h3' className={`${this.moduleClassName}__heading`} text={resources.loyaltyHeadingText} />,\n coveredAmountText: (\n <TextComponent className={`${this.moduleClassName}__text`} text={resources.loyaltyCoveredAmountText} />\n ),\n amount: (\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: checkoutState && checkoutState.loyaltyAmount } }}\n />\n )\n },\n addLoyalty: {\n heading: <Heading headingTag='h3' className={`${this.moduleClassName}__heading`} text={resources.loyaltyHeadingText} />,\n drawer: {\n tag: Drawer,\n className: `${this.moduleClassName}__drawer`,\n toggleButtonText: this._drawerHeader(),\n openGlyph: `${this.moduleClassName}__drawer-open`,\n closeGlyph: `${this.moduleClassName}__drawer-close`,\n glyphPlacement: 'end'\n },\n cardNumber: <TextComponent className={`${this.moduleClassName}__card-number`} text={loyaltyCard.CardNumber || ''} />,\n rewardPoints:\n loyaltyCard.RewardPoints &&\n loyaltyCard.RewardPoints.map((points, index) => {\n return this._renderPointSection(points, resources.availablePointsLabel, resources.expiringLoyaltyPointsLabel);\n }),\n loyaltyAmountContainer: {\n className: `${this.moduleClassName}__amount`\n },\n appliedLoyaltyAmountContainer: {\n className: `${this.moduleClassName}__applied-amount`\n },\n loyaltyAmountLabel: (\n <LabelComponent\n className={`${this.moduleClassName}__amount-label`}\n text={resources.payWithLoyaltyAmountLabel}\n htmlFor={`${this.props.id}-label`}\n />\n ),\n loyaltyAmountInput: (\n <InputComponent\n className={`${this.moduleClassName}__amount-input`}\n onChange={this._onInputChange}\n onBlur={this._onBlur}\n type='number'\n step='.01'\n value={this.state.dollarsApplied}\n min={0}\n max={this.maxDollars}\n ariaValueMax={this.maxDollars}\n ariaValueMin={0}\n ariaValueNow={this.state.dollarsApplied}\n id={`${this.props.id}-label`}\n />\n ),\n loyaltyAmountApplyButton: (\n <Button\n className={`${this.moduleClassName}__amount-button`}\n title={this.props.resources.applyCheckoutLoyaltyPaymentText}\n onClick={this._applyLoyaltyPoints}\n disabled={\n this.state.dollarsApplied > this.maxDollars ||\n this.state.dollarsApplied <= 0 ||\n isNaN(this.state.dollarsApplied) ||\n this.state.isFetchingLoyaltyCard\n }\n >\n {this.props.resources.applyCheckoutLoyaltyPaymentText}\n </Button>\n ),\n showAppliedAmount: checkoutState && checkoutState.loyaltyAmount > 0,\n loyaltyAmountAppliedText: (\n <TextComponent className={`${this.moduleClassName}__applied-text`} text={resources.loyaltyCoveredAmountText} />\n ),\n loyaltyAmountAppliedPrice: (\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: checkoutState && checkoutState.loyaltyAmount } }}\n />\n ),\n loyaltyAmountRemoveButton: (\n <Button\n className='ms-checkout-loyalty-remove-btn'\n title={this.props.resources.removeCheckoutLoyaltyPaymentText}\n onClick={this._removeLoyaltyPoints}\n innerRef={this._dialogToggleRef}\n >\n {this.props.resources.removeCheckoutLoyaltyPaymentText}\n </Button>\n )\n }\n };\n\n return renderView(viewProps) as React.ReactElement;\n }\n this.props.context.telemetry.error('Checkout loyalty content is empty, module wont render');\n return null;\n }\n\n private _drawerHeader(): JSX.Element {\n return (\n <>\n <p className={`${this.moduleClassName}__covered-text`}>{this.props.resources.loyaltyCoveredAmountText}</p>\n <PriceComponent\n className={`${this.moduleClassName}__applied-value`}\n id={this.props.id}\n typeName={this.props.typeName}\n context={this.props.context}\n data={{ price: { CustomerContextualPrice: this.maxDollars } }}\n />\n </>\n );\n }\n\n private _renderPointSection(\n point: LoyaltyRewardPoint,\n loyaltyCoveredAmountText: string,\n expiringLoyaltyPointsLabel: string\n ): ICheckoutLoyaltyRewardPoint {\n return {\n key: point.RewardPointId || '',\n checkoutLoyaltyRewardPoint: {\n className: `${this.moduleClassName}__program`\n },\n title: <TextComponent className={`${this.moduleClassName}__program-title`} text={point.Description} />,\n availablePointsText: <TextComponent className={`${this.moduleClassName}__program-available`} text={loyaltyCoveredAmountText} />,\n activePoints: (\n <TextComponent className={`${this.moduleClassName}__program-points`} text={(point && point.ActivePoints!).toString()} />\n ),\n expiringPointsText: <TextComponent className={`${this.moduleClassName}__program-expiring`} text={expiringLoyaltyPointsLabel} />,\n expiringPoints: (\n <TextComponent\n className={`${this.moduleClassName}__program-points`}\n text={(point && point.PointsExpiringSoon!).toString()}\n />\n )\n };\n }\n\n private readonly init = async (): Promise<void> => {\n this.props.moduleState.init({\n onEdit: this.onEdit,\n onCancel: this.onCancel,\n onSubmit: this.onSubmit,\n isRequired: false,\n ...(!this.isEnabled() && { status: 'disabled' })\n });\n\n const savedLoyaltyAmount = this.props.data.checkout.result?.loyaltyAmount;\n if (savedLoyaltyAmount) {\n this.props.moduleState.onReady();\n } else if (this.props.data.checkout.result?.isPaymentVerificationRedirection) {\n this.props.moduleState.onSkip();\n } else if (\n this.props.data.loyaltyCard.result &&\n this.props.data.checkout.result &&\n this.props.data.loyaltyCard.result.CardNumber !== this.props.data.checkout.result.checkoutCart.cart.LoyaltyCardId\n ) {\n this.props.data.checkout.result.checkoutCart\n .updateLoyaltyCardId({ loyaltyCardNumber: this.props.data.loyaltyCard.result.CardNumber })\n .catch(error => {\n if (this.context.telemetry) {\n this.context.telemetry.warning(error);\n this.context.telemetry.debug('Unable to update the loyalty card');\n }\n });\n }\n };\n\n private readonly onEdit = () => {\n this.props.telemetry.information('Payment section loyalty onEdit is called.');\n\n this.props.moduleState.onUpdating();\n };\n\n private readonly onCancel = () => {\n this.props.telemetry.information('Payment section loyalty onCancel is called.');\n\n this.handleCancelOrSubmit();\n };\n\n private readonly onSubmit = () => {\n this.props.telemetry.information('Payment section loyalty onSubmit is called.');\n\n this.handleCancelOrSubmit();\n };\n\n private readonly handleCancelOrSubmit = () => {\n const checkoutState = this.props.data.checkout.result;\n if (checkoutState && checkoutState.loyaltyAmount > 0) {\n // Show summary screen\n this.props.moduleState.onReady();\n } else {\n // Skip the module\n this.props.moduleState.onSkip();\n }\n };\n\n private readonly isEnabled = () => {\n return (\n this.props.context.request.user.isAuthenticated &&\n this.props.data.loyaltyCard.result &&\n this.props.data.loyaltyCard.result.CardNumber &&\n this.shouldPayLoyalty\n );\n };\n\n private async _applyLoyaltyPoints(): Promise<void> {\n this.props.telemetry.information('Payment section loyalty apply button onClick is called.');\n\n const checkoutState = this.props.data.checkout.result;\n\n if (!checkoutState) {\n return;\n }\n\n this._clearError();\n await checkoutState.updateLoyaltyAmount({ newAmount: Number.parseFloat(this.state.dollarsApplied.toString()) });\n this.setState({\n isFetchingLoyaltyCard: true\n });\n }\n\n private async _removeLoyaltyPoints(): Promise<void> {\n this.props.telemetry.information('Payment section loyalty remove button onClick is called.');\n\n const checkoutState = this.props.data.checkout.result;\n\n if (!checkoutState) {\n return;\n }\n\n this._clearError();\n await checkoutState.updateLoyaltyAmount({ newAmount: 0 });\n this.setState({\n dollarsApplied: 0\n });\n }\n\n private _onInputChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const value = event.currentTarget.value;\n this.setState({ dollarsApplied: value.length > 0 ? Number(value) : Number.parseFloat(value), isFetchingLoyaltyCard: false });\n }\n\n private _onBlur(event: React.FocusEvent<HTMLInputElement>): void {\n const num = Number.parseFloat(event.currentTarget.value).toFixed(2);\n const element = document.getElementById(`${this.props.id}-label`) as HTMLInputElement;\n if (element && num) {\n element.value = num;\n this.setState({ dollarsApplied: Number.parseFloat(num) });\n }\n }\n\n private _updateLoyalty(): void {\n if (this.props.moduleState.isDisabled && this.isEnabled()) {\n this._updateEstimate();\n this.props.moduleState.onUpdating();\n }\n }\n\n private _updateEstimate(): void {\n const card = this.props.data.loyaltyCard.result;\n const checkout = this.props.data.checkout.result;\n const cart = this.props.data.checkout.result ? this.props.data.checkout.result.checkoutCart.cart : undefined;\n const channelConfig = this.props.context.request.channel;\n if (card && card.CardNumber && cart && channelConfig) {\n const currencyCode = channelConfig.Currency || '';\n const loyalPointsRequest = createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput(cart.Id, card.CardNumber, currencyCode);\n\n // @ts-expect-error\n // Due to bug 23214358, this is getting improperly cached. Need to turn on cache bypass for now to work around issue\n loyalPointsRequest._query.options.bypassCache = 'get';\n\n callActionOrExecute<LoyaltyPointRedemptionEstimate>(loyalPointsRequest, this.props.context.actionContext)\n .then(async points => {\n this.props.context.actionContext.update(\n new GetLoyaltyTransactionEstimationInput(this.props.context.request.apiSettings),\n points\n );\n const newMaxPoints = points.MaxCurrencyValueOfLoyaltyPoints ?? this._defaultLoyaltyPoints;\n\n // If points are already applied, ensure you don't apply more points than max\n if (checkout && checkout.loyaltyAmount > newMaxPoints) {\n await checkout.updateLoyaltyAmount({ newAmount: newMaxPoints });\n }\n\n this.setState({ dollarsApplied: newMaxPoints, isFetchingLoyaltyCard: false });\n })\n .catch(error => {\n this.props.context.actionContext.telemetry.exception(error);\n this.props.context.actionContext.telemetry.debug('Error getting Loyalty Point Redemption Estimate');\n });\n }\n }\n\n @action\n private readonly _setErrorMessage = (errorMessage: string): void => {\n this.props.telemetry.error(errorMessage);\n this.props.moduleState.setHasError(true);\n this.props.moduleState.onUpdating();\n this.setState({\n errorMessage\n });\n };\n\n private readonly _clearError = (): void => {\n this.props.moduleState.setHasError(false);\n this.setState({\n errorMessage: ''\n });\n };\n}\n\nexport default CheckoutLoyalty;\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 { ICheckoutLoyaltyAdd, ICheckoutLoyaltyRewardPoint, ICheckoutLoyaltyShow, ICheckoutLoyaltyViewProps } from './checkout-loyalty';\n\nconst AddCheckoutLoyalty: React.FC<ICheckoutLoyaltyAdd> = ({\n heading,\n cardNumber,\n drawer,\n rewardPoints,\n loyaltyAmountContainer,\n appliedLoyaltyAmountContainer,\n loyaltyAmountLabel,\n loyaltyAmountInput,\n loyaltyAmountApplyButton,\n showAppliedAmount,\n loyaltyAmountAppliedText,\n loyaltyAmountAppliedPrice,\n loyaltyAmountRemoveButton\n}) => {\n return (\n <>\n {heading}\n {cardNumber}\n <Node {...drawer}>\n {rewardPoints.map((rewardPoint: ICheckoutLoyaltyRewardPoint) => {\n return (\n <Node {...rewardPoint.checkoutLoyaltyRewardPoint} key={rewardPoint.key}>\n {rewardPoint.title}\n {rewardPoint.availablePointsText}\n {rewardPoint.activePoints}\n {rewardPoint.expiringPointsText}\n {rewardPoint.expiringPoints}\n </Node>\n );\n })}\n </Node>\n <Node {...loyaltyAmountContainer}>\n {loyaltyAmountLabel}\n {loyaltyAmountInput}\n {loyaltyAmountApplyButton}\n {showAppliedAmount && (\n <Node {...appliedLoyaltyAmountContainer}>\n {loyaltyAmountAppliedText}\n {loyaltyAmountAppliedPrice}\n {loyaltyAmountRemoveButton}\n </Node>\n )}\n </Node>\n </>\n );\n};\n\nconst ShowCheckoutLoyalty: React.FC<ICheckoutLoyaltyShow> = ({ heading, coveredAmountText, amount }) => {\n return (\n <>\n {heading}\n {coveredAmountText}\n {amount}\n </>\n );\n};\n\nconst CheckoutLoyaltyView: React.FC<ICheckoutLoyaltyViewProps> = props => {\n const { checkoutLoyalty, alert, viewState, showLoyalty, addLoyalty } = props;\n\n return (\n <Module {...checkoutLoyalty}>\n {alert}\n {viewState.isShowLoyalty && <ShowCheckoutLoyalty {...showLoyalty} />}\n {viewState.isShowAddLoyalty && <AddCheckoutLoyalty {...addLoyalty} />}\n </Module>\n );\n};\n\nexport default CheckoutLoyaltyView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoCodeProps extends IComponentProps<{}> {\n cart: ICartState | undefined;\n promoCodeHeadingText: string;\n appliedPromoCodeHeadingText: string;\n removePromoAriaLabelFormat: string;\n promoPlaceholderText: string;\n promoCodeApplyButtonText: string;\n collapseTimeOut: number;\n removePromoText: string;\n invalidPromoCodeErrorText: string;\n failedToAddPromoCodeErrorText: string;\n duplicatePromoCodeErrorText: string;\n failedToRemovePromoCodeErrorText: string;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n promoCodeApplyCallback?(): void;\n}\n\ninterface IPromoCodeState {\n isCollapseOpen: boolean;\n promoCodeInputValue: string;\n error: string;\n canApply: boolean;\n}\n\n/**\n *\n * The PromoCode component renders the promocode section.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass PromoCode extends React.Component<IPromoCodeProps, IPromoCodeState> {\n private readonly payLoad: IPayLoad;\n\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\n this.state = {\n isCollapseOpen: false,\n promoCodeInputValue: '',\n error: '',\n canApply: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IPromoCodeProps, nextState: IPromoCodeState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n return (\n <div>\n <div className='msc-promo-code-heading'>{this.props.promoCodeHeadingText}</div>\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\n {this.state.error}\n </p>\n {this._renderAppliedPromoCode(this.props)}\n </div>\n );\n }\n\n private readonly _onInputChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\n const error = e.target.value === '' ? '' : this.state.error;\n this.setState({\n promoCodeInputValue: e.target.value.trim(),\n error,\n canApply: !!e.target.value\n });\n };\n\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart) {\n return;\n }\n const appliedPromo = this.state.promoCodeInputValue;\n\n cartState\n .addPromoCode({ promoCode: appliedPromo })\n .then(result => {\n if (result.status === 'SUCCESS') {\n // Show success text\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\n } else if (result.substatus === 'ALREADYADDED') {\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\n } else {\n this.setState({ error: this.props.invalidPromoCodeErrorText });\n }\n })\n .catch(error => {\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\n });\n };\n\n /**\n * On Submit function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n this._applyPromotionHandler(cartState);\n };\n\n /**\n * On apply promotion function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _applyPromotionHandler = (cartState: ICartState | undefined) => () => {\n this._applyPromotion(cartState);\n };\n\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <form onSubmit={this._onSubmitHandler(cartState)} className='msc-promo-code__form-container'>\n <div className='msc-promo-code__group'>\n <input\n className='msc-promo-code__input-box'\n onChange={this._onInputChangeHandler}\n value={this.state.promoCodeInputValue}\n placeholder={promoPlaceholderText}\n />\n <Button\n title={promoCodeApplyButtonText}\n className='msc-promo-code__apply-btn btn'\n onClick={this._applyPromotionHandler(cartState)}\n disabled={!this.state.canApply}\n {...attributes}\n >\n {promoCodeApplyButtonText}\n </Button>\n </div>\n </form>\n );\n };\n\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\n if (!cartState) {\n return;\n }\n const code = event.currentTarget.getAttribute('data-value') || '';\n cartState\n .removePromoCodes({\n promoCodes: [code]\n })\n .then(result => {\n if (result.status === 'SUCCESS') {\n this.setState({ error: '' });\n }\n })\n .catch(() => {\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\n });\n };\n\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\n return;\n }\n let discountAmount = 0;\n for (const line of cartState.cart.CartLines) {\n if (line.DiscountLines) {\n for (const discountLine of line.DiscountLines) {\n if (discountLine.DiscountCode === code) {\n discountAmount += discountLine.DiscountCost!;\n }\n }\n }\n }\n return discountAmount * -1;\n };\n\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || props.cart.cart.Coupons.length === 0) {\n return;\n }\n\n const removePromotionHandler = (event: React.MouseEvent<HTMLElement>) => {\n this._removePromotion(props.cart, event);\n };\n\n const promoCodTotalDiscount = props.cart.cart.Coupons.reduce((count: number, coupon: Coupon) => {\n return count + (this._calculateDiscount(coupon.Code || '', props.cart) || 0);\n }, 0);\n\n return (\n <>\n <div className='msc-promo-code__discount'>\n <div className='msc-promo-code__discount-heading'>{this.props.appliedPromoCodeHeadingText}</div>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: promoCodTotalDiscount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__discount-value'\n />\n </div>\n {props.cart.cart.Coupons.map((coupon: Coupon) => {\n const ariaLabel = props.removePromoAriaLabelFormat\n ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code)\n : '';\n\n return (\n <div key={coupon.Code} className='msc-promo-code__line-container'>\n <div className='msc-promo-code__line-value'>\n {coupon.Code}{' '}\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__line-discount-value'\n />\n </div>\n <Button\n title={props.removePromoText}\n className='msc-promo-code__line__btn-remove'\n onClick={removePromotionHandler}\n data-value={coupon.Code}\n aria-label={ariaLabel}\n >\n {props.removePromoText}\n </Button>\n </div>\n );\n })}\n </>\n );\n };\n}\n\nexport default PromoCode;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderProps } from '../header.props.autogenerated';\n\n/**\n * The header preferred store component.\n */\n@observer\nexport class HeaderPreferredStore extends React.PureComponent<IHeaderProps<IHeaderData>> {\n private readonly modalCloseButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n /**\n * Handle click on the store selector.\n * @returns : Promise void.\n */\n public handleClick = () => {\n return this._findPreferredStoreOnClick(this.props);\n };\n\n public render(): JSX.Element | undefined {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n slots,\n resources\n } = this.props;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\n const storeName =\n storeSelectorStateManager?.preferredStore && storeSelectorStateManager.preferredStore.StoreName\n ? storeSelectorStateManager.preferredStore.StoreName\n : resources.headerPreferredStoreText;\n\n return (\n <div className='ms-header__preferred-store-container'>\n <button\n className='ms-header__preferred-store-btn msc-btn'\n color='secondary'\n aria-label={resources.headerPreferredStoreAriaLabel}\n onClick={this.handleClick}\n ref={this.modalCloseButtonRef}\n >\n <span className='ms-header__preferred-store-text'>{storeName}</span>\n </button>\n {slots.storeSelector}\n </div>\n );\n }\n\n return undefined;\n }\n\n private async _findPreferredStoreOnClick(props: IHeaderProps<IHeaderData>): Promise<void> {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n modules\n } = props;\n if (!storeSelectorStateManager) {\n return;\n }\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n await storeSelectorStateManager\n .openDialog({\n id: storeSelectorId,\n showMapViewLink: true,\n parentElementRef: this.modalCloseButtonRef,\n onLocationSelected: orgUnitLocation => {\n return Promise.resolve();\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to set preferred store');\n }\n });\n }\n}\n\nexport default HeaderPreferredStore;\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, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ILogoProps {\n image: Msdyn365.IImageData;\n gridSettings?: Msdyn365.IGridSettings;\n link?: ILinkData;\n className?: string;\n telemetryContent?: ITelemetryContent;\n requestContext: Msdyn365.IRequestContext;\n typeName?: string;\n}\n\nexport interface ILinkData {\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n openInNewTab?: boolean;\n linkText?: string;\n}\n\n/**\n *\n * Logo component.\n * @extends {React.PureComponent<ILogoConfig>}\n */\nexport class Logo extends React.PureComponent<ILogoProps> {\n private readonly attributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: ILogoProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return <div className={this.props.className}>{this._renderLogo(this.props)}</div>;\n }\n\n private _renderLogo(config: ILogoProps): JSX.Element {\n if (config.link && config.link.linkUrl.destinationUrl) {\n return (\n <a\n href={config.link.linkUrl.destinationUrl}\n aria-label={config.link.ariaLabel}\n target={config.link.openInNewTab ? '_blank' : undefined}\n rel='noopener noreferrer'\n {...this.attributes}\n >\n {this._renderImage(config)}\n </a>\n );\n }\n return this._renderImage(config);\n }\n\n private _renderImage(config: ILogoProps): JSX.Element {\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Msdyn365.Image\n {...config.image}\n requestContext={this.props.requestContext}\n gridSettings={this.props.gridSettings!}\n imageSettings={(config && config.image && config.image.imageSettings) || defaultImageSettings}\n loadFailureBehavior='default'\n editProps={{\n key: config.image || {},\n requestContext: this.props.requestContext,\n moduleType: this.props.typeName,\n imagePropertyName: 'image'\n }}\n shouldSkipToMainImage\n />\n );\n }\n}\n\nexport default Logo;\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 {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderResources } from '../header.props.autogenerated';\n\nexport interface INavIconProps {\n resources: IHeaderResources;\n isExpanded: boolean;\n targetId: string;\n telemetryContent?: ITelemetryContent;\n toggleNavBar(): void;\n}\n\n/**\n *\n * NavIcon component.\n * @extends {React.PureComponent<INavIconProps>}\n */\n\n@observer\nexport class NavIcon extends React.PureComponent<INavIconProps> {\n private readonly attributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: INavIconProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n <Button\n className='ms-header__nav-icon'\n onClick={this.props.toggleNavBar}\n title={this.props.resources.mobileHamburgerAriaLabel}\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\n aria-expanded={this.props.isExpanded}\n aria-controls={this.props.targetId}\n {...this.attributes}\n />\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n KeyCodes,\n Modal,\n ModalBody,\n ModalHeader,\n onTelemetryClick,\n Popover,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\nimport { IHeaderData } from './header.data';\nimport { IHeaderProps, IHeaderResources, IMyAccountLinksData } from './header.props.autogenerated';\n\nexport interface IHeaderState {\n mobileMenuCollapsed: boolean;\n signinPopoverOpen: boolean;\n hasSigninerror?: boolean;\n}\n\nexport interface IHeaderViewProps extends IHeaderProps<IHeaderData>, IHeaderState {\n logo: React.ReactNode;\n wishListIconDesktop: React.ReactNode;\n wishListIconMobile: React.ReactNode;\n cartIcon: React.ReactNode;\n navIcon: React.ReactNode;\n className: string;\n menuBar: React.ReactNode[];\n search: React.ReactNode[];\n siteOptions: React.ReactNode[];\n HeaderTag: IModuleProps;\n HeaderContainer: INodeProps;\n MobileMenuContainer: INodeProps;\n MobileMenuHeader: React.ReactNode;\n MobileMenuBodyContainer: INodeProps;\n MobileMenuLinksContainer: INodeProps;\n HeaderTopBarContainer: INodeProps;\n Divider: INodeProps;\n\n AccountInfoDropdownParentContainer?: INodeProps;\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\n accountInfoDropdownButton?: React.ReactNode;\n\n signOutLink?: React.ReactNode;\n signInLink?: React.ReactNode;\n switchCustomerLink?: React.ReactNode;\n isOBORequest?: boolean;\n accountLinks?: React.ReactNode[];\n preferredStore?: React.ReactNode;\n}\n\n/**\n *\n * Header component.\n * @extends {React.PureComponent<IHeaderProps<IHeaderData>>}\n */\n@observer\nclass Header extends React.PureComponent<IHeaderProps<IHeaderData>, IHeaderState> {\n private readonly popOverRef: React.RefObject<HTMLButtonElement>;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private cart: ICartState | undefined;\n\n /**\n * The signed-in user name displayed in the header bar\n */\n @computed public get displayName(): Readonly<string | undefined> {\n const user = this.props.context.request.user;\n return user?.isOBORequest ? this.workerName : this.customerName;\n }\n\n /**\n * OBO scenario. The name of worker who shops on behalf of customer.\n */\n @computed public get workerName(): Readonly<string | undefined> {\n const user = this.props.context.request.user;\n return user?.firstName || user?.name;\n }\n\n @computed public get customerName(): Readonly<string | undefined> {\n const customer = this.props.data.accountInformation?.result;\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n\n public constructor(props: IHeaderProps<IHeaderData>) {\n super(props);\n this.popOverRef = React.createRef();\n this._toggleNavbar = this._toggleNavbar.bind(this);\n this._togglePopover = this._togglePopover.bind(this);\n this._keydown = this._keydown.bind(this);\n this.state = {\n mobileMenuCollapsed: true,\n signinPopoverOpen: false,\n hasSigninerror: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('keydown', this._keydown);\n }\n reaction(\n () => this.props.data.cart.result,\n () => {\n this.cart = this.props.data.cart.result;\n }\n );\n\n const {\n context: {\n request: { user }\n },\n resources: { signUpCustomerNotFoundTitle, signUpMultipleCustomerFoundTitle, closeNotificationLabel }\n } = this.props;\n\n const signinNotificationError = this._getSigninNotification(user, signUpMultipleCustomerFoundTitle, signUpCustomerNotFoundTitle);\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\n // For signup show simple error notification.\n NotificationsManager.instance().addNotification(new ErrorNotification(signinNotificationError, closeNotificationLabel));\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('keydown', this._keydown, false);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n data: { accountInformation, wishlists },\n context: {\n request: { user }\n },\n context,\n resources: { cartLabel, cartQtyLabel }\n } = this.props;\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\n const navbarKey = 'header-nav-mobile';\n const customer = accountInformation && accountInformation.result;\n const cartIconSlot = this._getSlot('cartIcon');\n const menuBarSlot = this._getSlot('menuBar');\n const searchSlot = this._getSlot('search');\n let wishlistCount = 0;\n const siteOptionsSlot = this._getSlot('siteOptions');\n const preferredStoreSlot = this._getSlot('storeSelector');\n if (wishlists !== undefined) {\n if (\n !wishlists.result ||\n !ArrayExtensions.hasElements(wishlists.result) ||\n !wishlists.result[0].CommerceListLines ||\n !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)\n ) {\n wishlistCount = 0;\n } else {\n wishlistCount = wishlists.result[0].CommerceListLines.length;\n }\n }\n const viewProps: IHeaderViewProps = {\n ...(this.props as IHeaderProps<IHeaderData>),\n ...this.state,\n logo: (\n <Logo\n {...{\n link: logoLink,\n image: logoImage,\n className: 'ms-header__logo',\n gridSettings: this.props.context.request.gridSettings,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent,\n typeName: this.props.typeName\n }}\n />\n ),\n wishListIconDesktop: (\n <WishListIconComponent\n className='ms-header__wishlist-desktop'\n showButtonTooltip={!disableTooltip}\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{}}\n wishlistCount={wishlistCount}\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\n isDispayWishlistCount={shouldShowWishlistCount}\n />\n ),\n wishListIconMobile: (\n <WishListIconComponent\n className='ms-header__wishlist-mobile'\n showButtonTooltip={!disableTooltip}\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{}}\n wishlistCount={wishlistCount}\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\n isDispayWishlistCount={shouldShowWishlistCount}\n />\n ),\n cartIcon: ArrayExtensions.hasElements(cartIconSlot) ? (\n cartIconSlot[0]\n ) : (\n <CartIconComponent\n cartLabel={cartLabel}\n cartQtyLabel={cartQtyLabel}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{ cart: this.cart }}\n />\n ),\n navIcon: (\n <NavIcon\n {...{\n resources: this.props.resources,\n isExpanded: !this.state.mobileMenuCollapsed,\n targetId: navbarKey,\n toggleNavBar: this._toggleNavbar,\n telemetryContent: this.telemetryContent\n }}\n />\n ),\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\n className: headerClassName,\n HeaderTag: {\n moduleProps: this.props,\n className: classnames(headerClassName),\n 'aria-label': this.props.resources.headerAriaLabel,\n tag: 'header'\n },\n HeaderContainer: {\n className: classnames('ms-header__container')\n },\n HeaderTopBarContainer: {\n className: classnames('ms-header__topbar')\n },\n Divider: {\n className: classnames('ms-header__divider')\n },\n MobileMenuContainer: {\n tag: Modal,\n id: navbarKey,\n className: 'ms-header__mobile-hamburger',\n isOpen: !this.state.mobileMenuCollapsed,\n wrapClassName: 'ms-header__modal',\n toggle: this._toggleNavbar\n },\n MobileMenuHeader: <ModalHeader className='ms-header__mobile-hamburger-menu-header' toggle={this._toggleNavbar} />,\n MobileMenuBodyContainer: {\n tag: ModalBody,\n className: 'ms-header__mobile-hamburger-menu-body'\n },\n MobileMenuLinksContainer: {\n className: 'ms-header__mobile-hamburger-menu-links'\n },\n AccountInfoDropdownParentContainer: {\n className: 'ms-header__account-info'\n },\n AccountInfoDropdownPopoverConentContainer: this.displayName\n ? {\n tag: Popover,\n id: 'myprofilePopover',\n className: 'ms-header__account-info-content',\n placement: 'bottom',\n isOpen: this.state.signinPopoverOpen,\n target: this.popOverRef,\n toggle: this._togglePopover\n }\n : undefined,\n signInLink: this._getSigninButton(user, this.props.resources),\n signOutLink: this._getSignOutButton(user, this.props.resources),\n isOBORequest: user?.isOBORequest,\n switchCustomerLink: this._getSwitchCustomerButton(user, this.props.resources),\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(user, this.props.resources),\n accountLinks: this._getAccountLinks(customer),\n preferredStore: ArrayExtensions.hasElements(preferredStoreSlot) && <HeaderPreferredStore {...this.props} />\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - Link Index.\n * @returns : Void.\n */\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\n if (this.props.config.myAccountLinks?.[linkIndex]) {\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\n }\n };\n\n /**\n * Get the slot.\n * @param slotName - Name of the slot.\n * @returns The slot.\n */\n private _getSlot(slotName: string): React.ReactNode[] | null {\n const { slots } = this.props;\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\n }\n\n /**\n * Renders the sign in button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSigninButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n !this.displayName && (\n <Button\n className='ms-header__signin-button'\n title={resources.signInLinkText}\n href={user?.signInUrl}\n aria-label={resources.signInLinkAriaText}\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\n {...attributes}\n >\n <span className='ms-header__signin-button-text' aria-hidden>\n {resources.signInLinkText}\n </span>\n </Button>\n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSignOutButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n <Button\n className='ms-header__signout-button'\n title={resources.signOutLinkText}\n href={user?.signOutUrl ?? ''}\n aria-label={resources.signOutLinkAriaText}\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\n {...attributes}\n >\n <span className='ms-header__signout-button-text' aria-hidden>\n {resources.signOutLinkText}\n </span>\n </Button>\n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSwitchCustomerButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SwitchCustomer);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const isOBOAccountSelected = user?.isOBORequest && this.props.context.request.cookies.getAccountSelectionCookie();\n return (\n this.displayName &&\n isOBOAccountSelected && (\n <MsDyn365.Link\n link={{\n ariaLabel: resources.switchCustomerLinkAriaText,\n className: 'ms-header__switchcustomer-button',\n linkText: resources.switchCustomerLinkText,\n linkUrl: MsDyn365.getUrlSync('businessPartnerSelection', this.props.context.actionContext),\n role: 'link',\n onClick: () => this.props.context.request.cookies.removeAccountSelectionCookie(),\n additionalProperties: attributes\n }}\n />\n )\n );\n }\n\n private _getSigninNotification(\n user: MsDyn365.IRequestContextUser | undefined,\n signUpMultipleCustomerFoundTitle: string,\n signUpCustomerNotFoundTitle: string\n ): string | undefined {\n const { signUpCustomerNotFound, signUpMultipleCustomerFound } = this.props.config;\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\n\n if (user?.retailServerErrorCode === notFoundError) {\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\n } else if (user?.retailServerErrorCode === multipleAccountError) {\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\n }\n return undefined;\n }\n\n private _getAccountInfoDropdownButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n <Button\n innerRef={this.popOverRef}\n className='ms-header__profile-button'\n aria-describedby='myprofilePopover'\n onClick={this._togglePopover}\n color='link'\n aria-label={this.displayName}\n aria-expanded={this.state.signinPopoverOpen}\n {...attributes}\n >\n <div className='ms-profile-button-text'>\n <div>{this.displayName}</div>\n {user?.isOBORequest && this.customerName && <div>{format(resources.shoppingAsText, this.customerName)}</div>}\n </div>\n </Button>\n )\n );\n }\n\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\n const { myAccountLinks } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n if (!customer || !this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\n return undefined;\n }\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\n payLoad.contentAction.etext = cta.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: cta.ariaLabel,\n className: 'ms-signin-info__account-link-button',\n linkText: cta.linkText,\n linkUrl: cta.linkUrl.destinationUrl,\n openInNewTab: cta.openInNewTab,\n role: 'link',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={index}\n link={editableLink}\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\n />\n );\n });\n }\n\n private _toggleNavbar(): void {\n this.setState({\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\n });\n }\n\n private _togglePopover(): void {\n this.setState({\n signinPopoverOpen: !this.state.signinPopoverOpen\n });\n }\n\n private _keydown(event: KeyboardEvent): void {\n if (event.keyCode === KeyCodes.Escape) {\n this.setState({ mobileMenuCollapsed: true });\n }\n }\n}\n\nexport default Header;\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 { IHeaderViewProps } from './header';\n\nconst headerView: React.FC<IHeaderViewProps> = props => {\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer,\n Divider\n } = props;\n return (\n <Module {...HeaderTag}>\n <Node {...HeaderContainer}>\n <Node {...HeaderTopBarContainer}>\n {props.navIcon}\n {props.logo}\n {_renderReactFragment(props.search)}\n {props.preferredStore}\n {_renderDesktopAccountBlock(props)}\n {props.wishListIconDesktop}\n <Node {...Divider} />\n {props.cartIcon}\n {_renderReactFragment(props.siteOptions)}\n </Node>\n <Node {...MobileMenuContainer}>\n <Node {...MobileMenuBodyContainer}>\n {props.MobileMenuHeader}\n {_renderReactFragment(props.menuBar)}\n <Node {...MobileMenuLinksContainer}>\n {props.accountLinks ? props.accountLinks.map(link => link) : false}\n {props.siteOptions}\n {props.wishListIconMobile}\n {props.signInLink}\n {props.signOutLink}\n </Node>\n </Node>\n </Node>\n {_renderReactFragment(props.menuBar)}\n </Node>\n </Module>\n );\n};\n\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signOutLink,\n signInLink,\n accountLinks\n } = props;\n\n if (AccountInfoDropdownParentContainer) {\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n <Node {...AccountInfoDropdownParentContainer}>\n {accountInfoDropdownButton}\n <Node {...AccountInfoDropdownPopoverConentContainer}>\n {accountLinks ? accountLinks.map(link => link) : false}\n {signOutLink}\n </Node>\n </Node>\n );\n } else if (signInLink) {\n return <Node {...AccountInfoDropdownParentContainer}>{signInLink}</Node>;\n }\n }\n props.context.telemetry.error('Header content is empty, module wont render.');\n return null;\n}\n\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\n return (\n <>\n {items && items.length > 0\n ? items.map((slot: React.ReactNode, index: number) => {\n return <React.Fragment key={index}>{slot}</React.Fragment>;\n })\n : null}\n </>\n );\n}\n\nexport default headerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n ObjectExtensions,\n PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getTelemetryObject,\n IComponentNodeProps,\n IModuleProps,\n INodeProps,\n ISingleSlideCarouselProps,\n ITelemetryContent,\n NodeTag,\n SingleSlideCarousel\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductCollectionData } from './product-collection.data';\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\n\nexport interface IProductCollectionViewProps extends IProductCollectionProps<IProductCollectionData> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n seeAllButton?: React.ReactNode;\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent<IProductCollectionProps<IProductCollectionData>, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps<IProductCollectionData>) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection.products\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\n await this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n const { heading, className, shouldDisplaySeeAllButton } = this.props.config;\n const { resources } = this.props;\n const recommendation = this.props.config.productCollection.recommendationListId;\n\n // Initialize state in case if the products were not found during initial module render\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\n this.initProductState(this.props.config.productCollection);\n\n const products = this.state.products;\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingLabel = heading ? heading.text : '';\n const headingComponent = heading && (\n <Msdyn365.Text\n className='ms-product-collection__heading'\n tag={heading.tag || 'h1'}\n text={headingLabel}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\n const getProductData = this._getProduct(item, index);\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\n });\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items'\n },\n isCarousel,\n\n products:\n ArrayExtensions.hasElements(updatedProducts) &&\n updatedProducts.filter(item => {\n return item !== undefined;\n }),\n productPrices: this.productPrices,\n seeAllButton:\n recommendation && shouldDisplaySeeAllButton && ArrayExtensions.hasElements(updatedProducts)\n ? this._getSeeAllButton(recommendation, headingLabel)\n : undefined\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n /**\n * Get products dimension availabilities.\n * @param products - Products.\n * @returns Promise.\n */\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n const validProducts = ArrayExtensions.validValues(products);\n if (\n ArrayExtensions.hasElements(validProducts) &&\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\n ) {\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n validProducts,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n }\n };\n\n /**\n * Helper method to initialize products state.\n * @param productCollection - List of products.\n */\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\n let products = this.state.products;\n const productCollectionProducts = productCollection.products;\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\n products = productCollectionProducts;\n this.setState({ products });\n } else if (\n ArrayExtensions.hasElements(products) &&\n ArrayExtensions.hasElements(productCollectionProducts) &&\n !ArrayExtensions.equals(products, productCollectionProducts)\n ) {\n products = productCollectionProducts;\n this.setState({ products });\n }\n\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n };\n\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\n if (!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const quickviewSlot =\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\n const productComparisonButtonSlot = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const reviewCount = 1;\n const reviewTotalRatings = Number(product.TotalRatings);\n const reviewCountAriaLabelValue =\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index\n },\n productComponent: (\n <ProductComponent\n context={this.props.context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n ratingCountAriaLabel={reviewCountAriaLabelValue}\n allowBack={allowBack}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButtonSlot}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled?.IsEnabled}\n priceResources={priceResources}\n dimensionAvailabilities={this.state.productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\n )}\n />\n )\n };\n };\n\n /**\n * Get the active price for products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.state.products;\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n if (Msdyn365.msdyn365Commerce.isBrowser) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n\n this.setState({ products });\n };\n\n /**\n * Get the see all button.\n * @param recommendation - Recommendation.\n * @param headingLabel - Heading label.\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\n */\n private readonly _getSeeAllButton = (recommendation: string, headingLabel: string): React.ReactNode => {\n const catalogId = getCatalogId(this.props.context.request);\n const seeAllLink = `/search?recommendation=${recommendation}&title=${headingLabel}&catalogid=${catalogId}`;\n return (\n <Button\n className='ms-product-collection__see-all-btn msc-cta__primary'\n title={this.props.resources.seeAllButtonText}\n href={seeAllLink}\n >\n {this.props.resources.seeAllButtonText}\n </Button>\n );\n };\n}\n\nexport default ProductCollection;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const {\n heading,\n ProductCollectionContainer,\n products,\n SingleSlideCarouselComponentProps,\n GridComponentProps,\n isCarousel,\n seeAllButton\n } = props;\n\n if (products) {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {seeAllButton}\n {isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)}\n </Module>\n );\n }\n props.context.telemetry.error('Product collection content is empty, module wont render.');\n return null;\n};\n\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return <Node {...carouselContainer}>{items && items.map(_renderProduct)}</Node>;\n};\n\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return <Node {...gridContainer}>{items && items.map(_renderProduct)}</Node>;\n};\n\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\n const { ProductContainer, productComponent } = product;\n\n return <Node {...ProductContainer}>{productComponent}</Node>;\n};\n\nexport default ProductCollectionView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartComponent, IAddToCartResources, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { getUrlSync, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * The data on which the component should operate.\n */\nexport interface IAddToCartSelectedData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * The resources needed to render a buy selected component.\n */\nexport interface IAddToCartSelectedResources {\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n}\n\n/**\n * Configuration of a buy selected component.\n */\nexport interface IAddToCartSelectedProps extends IComponentProps<IAddToCartSelectedData> {\n className: string;\n context: ICoreContext;\n\n resources: IAddToCartSelectedResources;\n\n isIcon?: boolean;\n}\n\n/**\n * Get the dialog strings.\n * @param props - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getDialogStrings = (props: IAddToCartSelectedProps): IAddToCartResources => {\n return {\n goToCartText: props.resources.quickOrderGridGoToCartText ?? '',\n continueShoppingText: props.resources.quickOrderGridDialogCloseText ?? '',\n closeNotificationLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n headerItemOneText: props.resources.quickOrderGridSingleItemText ?? '',\n headerItemFormatText: props.resources.quickOrderGridMultiLineItemFormatText ?? '',\n headerLinesFormatText: props.resources.quickOrderGridMultiLinesFormatText ?? '',\n headerMessageText: props.resources.quickOrderGridHeaderMessageText ?? '',\n freePriceText: props.resources.freePriceText ?? '',\n originalPriceText: props.resources.originalPriceText ?? '',\n currentPriceText: props.resources.currentPriceText ?? '',\n addedQuantityText: props.resources.addedQuantityText ?? '',\n buyAgainNotificationTitle: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationTitle ?? '',\n buyAgainNotificationCloseAriaLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? ''\n };\n};\n\n/**\n * Get the dialog strings.\n * @param quickOrder - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getOrderDetails = (quickOrder: QuickOrderTemplate): OrderDetailsProduct[] => {\n const orderDetails: OrderDetailsProduct[] = [];\n for (const quickLine of quickOrder.quickOrderTemplateLines) {\n const quantity = quickLine.productListLine.Quantity;\n const salesLine: SalesLine = {\n Quantity: quantity\n };\n const products = new OrderDetailsProduct(salesLine, quickLine.fullProduct?.ProductDetails);\n orderDetails.push(products);\n }\n return orderDetails;\n};\n\n/**\n * Renders a button which adds given products to the cart.\n * @param props - Configuration of the component.\n * @returns A react element or null if no products were given.\n */\nexport const AddToCartProductListComponent: React.FC<IAddToCartSelectedProps> = (props: IAddToCartSelectedProps): JSX.Element | null => {\n const {\n data: { quickOrderTemplate }\n } = props;\n\n if (quickOrderTemplate?.quickOrderTemplateLines[0].fullProduct?.ProductDetails === undefined) {\n return null;\n }\n const quantity = quickOrderTemplate.quickOrderTemplateLines[0].productListLine.Quantity;\n const buttonLabel = props.resources.quickOrderGridBuySelectedButtonText;\n const buttonAriaLabel = props.resources.quickOrderGridBuySelectedButtonAriaLabel;\n const dialogStrings: IAddToCartResources = getDialogStrings(props);\n const shouldSkipSiteSettings: boolean = true;\n const orderDetailProducts = getOrderDetails(quickOrderTemplate);\n return (\n <AddToCartComponent\n addToCartText={buttonLabel ?? ''}\n outOfStockText=''\n addToCartArialLabel={buttonAriaLabel}\n quantity={quantity}\n id={props.id}\n typeName={props.typeName}\n className={props.className}\n navigationUrl={getUrlSync('cart', props.context.actionContext)}\n data={{ product: quickOrderTemplate.quickOrderTemplateLines[0].fullProduct?.ProductDetails }}\n context={props.context}\n dialogStrings={dialogStrings}\n shouldSkipSiteSettings={shouldSkipSiteSettings}\n orderDetailsProducts={orderDetailProducts}\n />\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddToCartProductListComponent } from './add-to-list';\nimport { IQuickOrderGridActionsViewProps } from './utilities';\n\n/**\n * Interface for quick order grid action data.\n */\nexport interface IQuickOrderGridActionsData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * Interface for quick order grid action props.\n */\nexport interface IQuickOrderGridActionsProps extends IComponentProps<IQuickOrderGridActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n moduleClassName: string;\n typeName: string;\n handlers: {\n removeProductList(productListId: string): void;\n };\n resources: {\n quickOrderGridDeleteButtonText: string;\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n };\n}\n\n/**\n * Remove ProductList Action.\n * @param props -Quick order grid action props.\n */\nconst removeQuickOrderList = (props: IQuickOrderGridActionsProps): void => {\n const {\n data: { quickOrderTemplate },\n handlers\n } = props;\n const { removeProductList } = handlers;\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Need to check data.\n if (quickOrderTemplate && quickOrderTemplate.productList.Id) {\n removeProductList(quickOrderTemplate.productList.Id);\n }\n};\n\n/**\n * Get Addtobag Button.\n * @param props -Order template action props.\n * @returns QuickOrderGrid actions view props.\n */\nconst getQuickOrderGridAddToCartDialog = (props: IQuickOrderGridActionsProps): React.ReactNode => {\n const {\n data: { quickOrderTemplate },\n context,\n moduleClassName,\n resources,\n typeName\n } = props;\n const buttonId = 'quick-order-grid';\n return (\n <AddToCartProductListComponent\n className={`${moduleClassName}-action-bar__buy-selected msc-btn`}\n id={buttonId}\n typeName={typeName}\n data={{ quickOrderTemplate }}\n context={context}\n resources={resources}\n />\n );\n};\n\n/**\n * Remove Quick order grid action.\n * @param props -Quick order grid action props.\n * @returns Remove order template.\n */\nconst removeActionHandler = (props: IQuickOrderGridActionsProps) => () => {\n removeQuickOrderList(props);\n};\n\n/**\n * Quick order grid action view.\n * @param props -Quick Order Grid template action props.\n * @returns QuickOrderGrid actions view props.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name needs to be this.\nexport const QuickOrderGridActionsView = (props: IQuickOrderGridActionsProps): IQuickOrderGridActionsViewProps => {\n const { moduleClassName, resources } = props;\n const { quickOrderGridDeleteButtonText } = resources;\n\n return {\n addProductListToBag: getQuickOrderGridAddToCartDialog(props),\n removeProductList: (\n <Button className={`${moduleClassName}-action-bar__delete-list-button`} onClick={removeActionHandler(props)}>\n {quickOrderGridDeleteButtonText}\n </Button>\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderGridDrawerProps } from './quick-order-grid-drawer-props';\n\n/**\n * Interface for drawer state.\n */\nexport interface IQuickOrderGridDrawerState {\n isOpen: boolean;\n}\n\n/**\n * Placement of glyph.\n */\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Grid Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\nexport class QuickOrderGridDrawer extends React.Component<IQuickOrderGridDrawerProps, IQuickOrderGridDrawerState> {\n private readonly _drawerOpenGlyph: string;\n\n private readonly _drawerCloseGlyph: string;\n\n private readonly _drawerGlyphClass: string;\n\n private _isManuallyToggled: boolean;\n\n public constructor(props: IQuickOrderGridDrawerProps) {\n super(props);\n this._isManuallyToggled = false;\n this.state = { isOpen: props.collapseProps?.isOpen ?? false };\n this._drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n const closeGlyph = this.props.closeGlyph ? this.props.closeGlyph : '';\n if (this.props.isAnimateGlyph) {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : closeGlyph);\n this._drawerCloseGlyph = this._drawerOpenGlyph;\n } else {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n this._drawerCloseGlyph = classnames(this._drawerGlyphClass, closeGlyph);\n }\n }\n\n /**\n * Method to call on click of drawer button.\n * @param event - Product DeliveryOption List.\n */\n public toggle = (event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void => {\n event.preventDefault();\n this._isManuallyToggled = true;\n if (this.props.onToggle) {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n this.props.onToggle(this.state);\n } else {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n }\n };\n\n public shouldComponentUpdate(nextProps: IQuickOrderGridDrawerProps, nextState: IQuickOrderGridDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps: ICollapseProps = { ...this.props.collapseProps };\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this._isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className);\n const drawerButtonClassName = `${this.props.className ? this.props.className : ''}__button`;\n this._isManuallyToggled = false;\n return (\n <div className={drawerClass}>\n <Button\n {...this.props.toggleButtonProps}\n onClick={this.toggle}\n aria-expanded={collapseProps.isOpen}\n block\n disabled={this.props.isDisabled}\n className={drawerButtonClassName}\n color='secondary'\n >\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen, drawerClass)}\n </Button>\n <Collapse {...collapseProps} />\n </div>\n );\n }\n\n private _generateDrawerButtonInnerMarkup(isCollapseState: boolean, drawerClass: string): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n const headingDrawerClass = `${drawerClass}-heading`;\n const descriptionDrawerClass = `${drawerClass}-description`;\n return (\n <>\n <h2 className={classnames(drawerButtonTextClass, headingDrawerClass)}>{this.props.moduleHeadingText}</h2>\n <span className={classnames(drawerButtonTextClass, descriptionDrawerClass)}>{this.props.moduleDescriptionText}</span>\n {this._generateGlyphMarkup('drawer__glyph__end', isCollapseState)}\n </>\n );\n }\n\n private _generateGlyphMarkup(location: string, isCollapseState: boolean): JSX.Element {\n let glyphClass = isCollapseState ? this._drawerOpenGlyph : this._drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return <span className={glyphClass} />;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridState } from './utilities';\n\n/**\n * Interface quick order grid form props.\n */\nexport interface IQuickOrderGridFormProps {\n isAddtoListDisabled: boolean | undefined;\n productTextInput: React.RefObject<HTMLInputElement>;\n quantityTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n maxQuantity?: number;\n moduleClassName: string;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n quickOrderGridState: IQuickOrderGridState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddProductListClick(): Promise<void>;\n}\n\n/**\n * Interface quick order grid form view props.\n */\nexport interface IQuickOrderGridFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToListBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleQuantityChange(event.target.value || '');\n};\n\n/**\n * Quick order grid form component.\n * @param props -Component form props.\n * @returns Quick order gridp view props..\n */\nexport const QuickOrderGridFormComponent = (props: IQuickOrderGridFormProps): IQuickOrderGridFormViewProps => {\n const {\n moduleClassName,\n productTextInput,\n quantityTextInput,\n quickOrderGridState,\n maxChars,\n maxQuantity,\n isAddtoListDisabled,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n handleQuantityChange,\n handleInputChange,\n handleAddProductListClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n <div className={`${moduleClassName}__content-form-main-product`}>\n <h2 className={`${moduleClassName}__content-form-main-product-lable`} aria-label={ariaLabelProduct}>\n {ariaLabelProduct}\n </h2>\n <input\n className={`${moduleClassName}__content-form-main-product-input`}\n type='text'\n aria-label={ariaLabelProduct}\n ref={productTextInput}\n onChange={onInputChange}\n />\n </div>\n );\n\n const quantityNode = (\n <div className={`${moduleClassName}__content-form-main-quantity`}>\n <h2 className={`${moduleClassName}__content-form-main-quantity-lable`} aria-label={ariaLabelQuantity}>\n {ariaLabelQuantity}\n </h2>\n <input\n className={`${moduleClassName}__content-form-main-quantity-input`}\n pattern='[0-9]*'\n ref={quantityTextInput}\n onChange={onQuantityInputChange}\n maxLength={maxChars}\n type='number'\n aria-live='polite'\n aria-label={ariaLabelQuantity}\n aria-valuemin={0}\n aria-valuemax={maxQuantity}\n aria-valuenow={quickOrderGridState.quantity}\n />\n </div>\n );\n\n const addToListNode = (\n <div className={`${moduleClassName}__content-form-main-add-to-product-list`}>\n <Button\n className={`${moduleClassName}__content-form-main-add-to-product-list-button`}\n disabled={isAddtoListDisabled}\n aria-label={ariaLabelAddtoCart}\n onClick={handleAddProductListClick}\n >\n {ariaLabelAddtoCart}\n </Button>\n </div>\n );\n\n const userMessageNode = quickOrderGridState.stateMessage ? (\n <Alert color={quickOrderGridState.stateMessage.statusCssString} isOpen={quickOrderGridState.stateMessage.isOpen}>\n <span className={quickOrderGridState.stateMessage.messageGlyph} />\n <span>{quickOrderGridState.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToListBtn: addToListNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { QuickOrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order grid.\n */\nexport class QuickOrderGridProduct {\n @observable\n public isSelected: boolean;\n\n public readonly productLine: QuickOrderTemplateLine;\n\n public constructor(productLine: QuickOrderTemplateLine) {\n this.productLine = productLine;\n this.isSelected = false;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order grid table header resources.\n */\nexport interface IQuickOrderGridTableHeaderResources {\n quickOrderGridProductNumberText: string;\n quickOrderGridProductText: string;\n quickOrderGridUnitPriceText: string;\n quickOrderGridUnitOfMeasureText: string;\n quickOrderGridQuantityText: string;\n quickOrderGridActionsText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderGridTableHeaderResources;\n}\n\n/**\n * Interface for quick order grid table header component.\n */\nexport interface IQuickOrderGridTableHeaderComponent extends IComponent<IQuickOrderGridTableHeaderProps> {}\n\n/**\n * Get the quick order grid header cells for desktop.\n * @param props -- The quick order grid table header props.\n * @returns The list of cells for quick order grid header component in desktop version.\n */\nconst QuickOrderGridDesktopHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n <th>\n <span className={classnames(`${props.className}__emptyColumn`)} />\n </th>\n <th>{resources.quickOrderGridProductNumberText}</th>\n <th>{resources.quickOrderGridProductText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridUnitPriceText}</th>\n <th>{resources.quickOrderGridUnitOfMeasureText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridQuantityText}</th>\n <th>{resources.quickOrderGridActionsText}</th>\n </>\n );\n};\n\n/**\n * Get the quick order grid header cells for mobile.\n * @param props -- The quick order grid table header props.\n * @returns The quick order grid header component in desktop version.\n */\nconst QuickOrderGridMobileHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={classnames(`${props.className}__emptyColumn`)} />\n <th>{resources.quickOrderGridProductNumberText}</th>\n <th />\n </>\n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderGridTableHeaderComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderGridMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopHeaderCellsComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductPrice } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { QuickOrderGridProduct } from '../../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../../utilities';\n\n/**\n * Data required to render each quick order grid row.\n */\nexport interface IQuickOrderGridTableRowData {\n product: QuickOrderGridProduct;\n}\n\n/**\n * Resources for quick order grid table rows.\n */\nexport interface IQuickOrderGridTableRowResources {\n quickOrderGridQuantityMobileText: string;\n quickOrderGridProductDimensionsSeparator: string;\n quickOrderGridViewDetailsButtonText: string;\n quickOrderGridViewDetailsButtonAriaLabel: string;\n quickOrderGridRemoveItemButtonAriaLabel: string;\n quickOrderGridInputQuantityAriaLabel: string;\n quickOrderGridDecrementButtonAriaLabel: string;\n quickOrderGridIncrementButtonAriaLabel: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableRowProps extends IComponentProps<IQuickOrderGridTableRowData> {\n context: ICoreContext;\n className: string;\n productListLine: ProductListLine;\n price?: ProductPrice;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderGridTableRowResources;\n index: number;\n callbacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * The default image settings for quick order grid table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order grid row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderGridTableRowProductImageComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const fallbackImageUrl = getFallbackImageUrl(product?.ItemId, props.context.actionContext.requestContext.apiSettings);\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n <div className={containerClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n className={`${containerClassName}__product-image`}\n altText={product?.Name}\n src={product?.PrimaryImageUrl ?? ''}\n fallBackSrc={fallbackImageUrl}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n};\n\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderProductPrice = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const { context, moduleId, moduleTypeName, resources } = props;\n const price = props.price;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-quick-order-grid-row__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderUnitOfMeasure = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const price = props.price;\n\n if (price) {\n return (\n <div className='ms-quick-order-grid-row__product-unit-of-measure'>\n {StringExtensions.isNullOrEmpty(props.productListLine.UnitOfMeasure) || price.UnitOfMeasure}\n </div>\n );\n }\n return null;\n};\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (\n onChangeQuantity: (\n orderTemplateLineId: string | undefined,\n quantity: number,\n props?: IQuickOrderGridTableRowProps | undefined\n ) => boolean,\n itemKey: string | undefined,\n props: IQuickOrderGridTableRowProps\n) => (newValue: number) => {\n onChangeQuantity(itemKey, newValue, props);\n return true;\n};\n\n/**\n * On Change function.\n * @param onRemoveItem -On change quantity function.\n * @param quickOrderGridProductKey -QuickOrderGridp Product.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onRemoveHandler = (\n onRemoveItem: (quickOrderGridProduct: QuickOrderGridProduct, props?: IQuickOrderGridTableRowProps | undefined) => void,\n quickOrderGridProductKey: QuickOrderGridProduct,\n props: IQuickOrderGridTableRowProps\n) => () => {\n onRemoveItem(quickOrderGridProductKey, props);\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderGridExtraActionsPopupComponent: React.FC<IQuickOrderGridTableRowProps> = (\n props: IQuickOrderGridTableRowProps\n): JSX.Element | null => {\n const {\n resources: { quickOrderGridViewDetailsButtonAriaLabel, quickOrderGridViewDetailsButtonText }\n } = props;\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const [shouldShowActions, setShowActions] = useState(false);\n let productUrl = '';\n if (product === undefined) {\n return null;\n }\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n const onClickViewDetails = React.useCallback(() => {\n if (MsDyn365.isBrowser) {\n window.location.href = productUrl;\n }\n }, [productUrl]);\n\n const toggle = React.useCallback(() => {\n const shouldShowActionsNewValue = !shouldShowActions;\n if (shouldShowActionsNewValue) {\n if (setShowPreviousActions) {\n setShowPreviousActions(false);\n }\n setShowActions(shouldShowActionsNewValue);\n setShowPreviousActions = setShowActions;\n } else {\n setShowPreviousActions = undefined;\n setShowActions(shouldShowActionsNewValue);\n }\n }, [shouldShowActions, setShowActions]);\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n const actionsContainerClassName = `${className}__actions-container`;\n\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} onClick={toggle} />\n {shouldShowActions && (\n <div className={actionsContainerClassName}>\n <Button\n className={`${actionsContainerClassName}__view-details`}\n onClick={onClickViewDetails}\n aria-label={quickOrderGridViewDetailsButtonAriaLabel}\n >\n {quickOrderGridViewDetailsButtonText}\n </Button>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n >\n {props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Renders quick order grid table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for desktop view.\n */\nexport const QuickOrderGridDesktopTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { quantity } = props;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n if (product !== undefined) {\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>{product.ItemId}</td>\n <td>\n <div className={`${props.className}__product-info`}>\n <a className={`${props.className}__product-name`} href={productUrl}>\n {product.Name}\n </a>\n <span className={`${props.className}__product-dimensions`}>\n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderGridProductDimensionsSeparator)}\n </span>\n </div>\n </td>\n <td className={columnWithNumberClassName}>{renderProductPrice(props)}</td>\n <td>{renderUnitOfMeasure(props)}</td>\n <td className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n max={10}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </td>\n <td>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n onClick={onRemoveHandler(props.callbacks.onRemoveItem, props.data.product, props)}\n />\n </td>\n </>\n );\n }\n\n return null;\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for mobile view.\n */\nexport const QuickOrderGridMobileTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { quantity } = props;\n if (product !== undefined) {\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{product.RecordId}</span>\n <span className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n max={10}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </span>\n </div>\n </td>\n <td>\n <QuickOrderGridExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\n }\n return null;\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderGridTableRowComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n let headerCells: JSX.Element;\n if (isMobileView) {\n headerCells = <QuickOrderGridMobileTableRowCellComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopTableRowCellComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderGridProduct } from '../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../utilities';\nimport {\n IQuickOrderGridTableHeaderResources,\n IQuickOrderGridTableRowResources,\n QuickOrderGridTableHeaderComponent,\n QuickOrderGridTableRowComponent\n} from './components';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderGridTableData {\n quickOrderGridProducts: QuickOrderGridProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderGridTableResources extends IQuickOrderGridTableHeaderResources, IQuickOrderGridTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderGridTableProps extends IComponentProps<IQuickOrderGridTableData> {\n context: ICoreContext;\n className: string;\n moduleId: string;\n moduleTypeName: string;\n\n resources: IQuickOrderGridTableResources;\n isMobileView: boolean;\n imageSettings?: IImageSettings;\n callBacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderGridTableComponent extends IComponent<IQuickOrderGridTableProps> {}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderGridTableComponent: React.FC<IQuickOrderGridTableProps> = (props: IQuickOrderGridTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderGridProducts = props.data.quickOrderGridProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n <table className={props.className}>\n <QuickOrderGridTableHeaderComponent\n context={props.context}\n typeName={props.typeName}\n id={headerClassName}\n className={headerClassName}\n isMobile={isMobile}\n resources={props.resources}\n data={{}}\n />\n {quickOrderGridProducts.map((quickOrderProduct, index) => {\n const price = quickOrderProduct.productLine.fullProduct?.ProductPrice;\n const quantity = quickOrderProduct.productLine.productListLine.Quantity!;\n return (\n <QuickOrderGridTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={quickOrderProduct.productLine.fullProduct?.ProductDetails.RecordId}\n className={rowClassName}\n resources={props.resources}\n isMobile={isMobile}\n price={price}\n moduleId={props.moduleId}\n moduleTypeName={props.moduleTypeName}\n quantity={quantity}\n index={index}\n imageSettings={props.imageSettings}\n productListLine={quickOrderProduct.productLine.productListLine}\n callbacks={props.callBacks}\n data={{\n product: quickOrderProduct\n }}\n />\n );\n })}\n </table>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getProductConfigure,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport {\n ProductDimension,\n ProductDimensionType,\n ProductDimensionValue,\n ProductListsDataActions,\n ProductListType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n addItemToProductListAction,\n AddItemToProductListInput,\n ArrayExtensions,\n createProductList,\n CreateProductListInput,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IDimensionForSelectedVariant,\n IPromiseQueue,\n QuickOrderTemplate,\n QuickOrderTemplateLine,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n Heading,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { ActiveProductListInput } from './actions';\nimport {\n IQuickOrderGridActionsProps,\n IQuickOrderGridActionsViewProps,\n IQuickOrderGridRowCallbacks,\n IQuickOrderGridState,\n QuickOrderGridActionsView,\n QuickOrderGridDrawer,\n QuickOrderGridFormComponent,\n QuickOrderGridProduct,\n QuickOrderGridTableComponent\n} from './components';\nimport { IQuickOrderGridData } from './quick-order-grid.data';\nimport { IQuickOrderGridProps, IQuickOrderGridResources } from './quick-order-grid.props.autogenerated';\n\n/**\n * QuickOrder Grid View props.\n */\nexport interface IQuickOrderGridViewProps extends IQuickOrderGridProps<IQuickOrderGridData> {\n header: JSX.Element;\n actions?: INodeProps;\n isB2bCustomer?: boolean;\n isQuickOrderGridFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n loading?: React.ReactNode;\n quickOrderGridForm: INodeProps;\n quickOrderGridFormProductContent: INodeProps;\n quickOrderGridFormMsgContent: INodeProps;\n quickOrderGridProps: IModuleProps;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n container?: JSX.Element;\n orderActions?: IQuickOrderGridActionsViewProps | null;\n bulkPurchase?: React.ReactNode;\n}\n\n/**\n * QuickOrder Grid View port.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * QuickOrderGrid component.\n * @extends {React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>>}\n */\nclass QuickOrderGrid extends React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>, IQuickOrderGridState> {\n private readonly _productTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly _quantityInput: React.RefObject<HTMLInputElement>;\n\n private readonly _waitTime: number = 500;\n\n private readonly _dimensionUpdateQueueMaxLength: number = 2;\n\n private readonly _errorCssClass: string = 'danger';\n\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n\n private readonly _quickOrderGridFormClass: string;\n\n private readonly _quickOrderGridFormProductContent: string;\n\n private readonly _quickOrderGridFormMsgContent: string;\n\n private readonly _telemetryContent: ITelemetryContent;\n\n private readonly _dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(this._dimensionUpdateQueueMaxLength);\n\n private _dimensions: { [id: number]: string } = {};\n\n private readonly _cssClassNameConfigure: string = 'ms-quick-order_grid__content-form-main';\n\n private readonly _className: string = 'ms-quick-order-grid';\n\n // @ts-expect-error: Debouce needs to be used as type.\n private _cancellabelDebounce: debounce;\n\n private readonly _quickOrderGridCallbacks: IProductDimensionCallbacks = {\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this._dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this._dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: string) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw new Error(error);\n }\n });\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n private readonly _quickOrderGridRowCallbacks: IQuickOrderGridRowCallbacks = {\n /**\n * Method to call remove button.\n * @param line - Grid row product.\n */\n onRemoveItem: (line: QuickOrderGridProduct): void => {\n this._removeItemRowFromTable(line.productLine);\n },\n\n /**\n * Method to call on change quantity button.\n * @param productListLineId - Grid row product list line id.\n * @param quantity - Product quantity.\n * @returns - Falg to get confirmation for action.\n */\n onChangeQuantity: (productListLineId: string | undefined, quantity: number): boolean => {\n return this._changeRowQuantity(productListLineId, quantity);\n }\n };\n\n public constructor(props: IQuickOrderGridProps<IQuickOrderGridData>) {\n super(props);\n this._productTextInput = React.createRef();\n this._quantityInput = React.createRef<HTMLInputElement>();\n\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n isQuickOrderGridFormExpanded: false,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: [],\n isUpdatingDimension: false,\n productListId: ''\n };\n\n this._quickOrderGridFormClass = 'ms-quick-order-grid__content-form';\n this._quickOrderGridFormProductContent = 'ms-quick-order-grid__content-form-main';\n this._quickOrderGridFormMsgContent = 'ms-quick-order-grid__content-form-msg';\n }\n\n @computed public get isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n const quickOrderTemplate = data.quickOrderTemplate;\n\n if (quickOrderTemplate?.result !== undefined) {\n this.setState({\n products: quickOrderTemplate.result.quickOrderTemplateLines,\n productListId: quickOrderTemplate.result.productList.Id\n });\n }\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderGridModuleHeading,\n quickOrderGridModuleDescription,\n quickOrderGridAddtogrid,\n quickOrderGridProductQuantityInputLabel,\n quickOrderGridProductInputLabel,\n quickOrderGridProductDimensionTypeColor,\n quickOrderGridProductDimensionTypeConfiguration,\n quickOrderGridSelectDimensionFormatString,\n quickOrderGridProductDimensionTypeSize,\n quickOrderGridProductDimensionTypeStyle,\n quickOrderGridProductDimensionTypeAmount,\n quickOrderGridModulePageHeading\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderGridSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderGridProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderGridProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderGridProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderGridProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderGridProductDimensionTypeAmount\n };\n\n const { isQuickOrderGridFormExpanded, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const headerClassName = `${this._className}__header`;\n\n const header = (\n <div className={headerClassName}>\n <Heading className={`${headerClassName}-heading`} text={quickOrderGridModulePageHeading} />\n </div>\n );\n\n const viewProps: IQuickOrderGridViewProps = {\n ...(this.props as IQuickOrderGridProps<IQuickOrderGridData>),\n\n quickOrderGridProps: { className: classnames('ms-quick-order-grid', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order-grid__content' },\n isB2bCustomer: customerInfo?.IsB2b,\n header,\n actions: {\n className: `${this._className}-action-bar`,\n tag: 'div'\n },\n drawer: {\n tag: QuickOrderGridDrawer,\n className: `${this._className}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderGridFormExpanded },\n moduleHeadingText: quickOrderGridModuleHeading,\n moduleDescriptionText: quickOrderGridModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this._telemetryContent\n },\n bulkPurchase: this._renderBulkPurchase(),\n quickOrderGridForm: {\n className: `${this._quickOrderGridFormClass} ${isQuickOrderGridFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderGridFormProductContent: {\n className: this._quickOrderGridFormProductContent\n },\n quickOrderGridFormMsgContent: {\n className: this._quickOrderGridFormMsgContent\n },\n form: QuickOrderGridFormComponent({\n productTextInput: this._productTextInput,\n quantityTextInput: this._quantityInput,\n isAddtoListDisabled: !productResponse,\n ariaLabelAddtoCart: quickOrderGridAddtogrid,\n ariaLabelProduct: quickOrderGridProductInputLabel,\n ariaLabelQuantity: quickOrderGridProductQuantityInputLabel,\n maxChars: 50,\n maxQuantity,\n moduleClassName: this._className,\n quickOrderGridState: this.state,\n handleInputChange: this._handleInputChange,\n handleQuantityChange: this._handleQuantityChange,\n handleAddProductListClick: this._addItemToProductListLine\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this._cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderGridSelectDimensionFormatString,\n productConfigureResources,\n this._quickOrderGridCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderGridFormExpanded: this.state.isQuickOrderGridFormExpanded,\n isMobileView: this.state.isMobile,\n container: ArrayExtensions.hasElements(this.state.products) ? this._renderListContainer() : undefined,\n orderActions: this._renderQuickOrderGridActions(quickOrderTemplate?.result)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderQuickOrderGridActions(quickOrderTemplate: QuickOrderTemplate | undefined): IQuickOrderGridActionsViewProps | null {\n const { typeName, context, resources } = this.props;\n const {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n } = resources;\n if (ArrayExtensions.hasElements(quickOrderTemplate?.quickOrderTemplateLines)) {\n const quickOrderGridActions: IQuickOrderGridActionsProps = {\n data: { quickOrderTemplate },\n moduleClassName: this._className,\n id: 'quick-order-grid',\n typeName,\n context,\n handlers: {\n removeProductList: this._removeProductList\n },\n resources: {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n }\n };\n\n return QuickOrderGridActionsView(quickOrderGridActions);\n }\n return null;\n }\n\n /**\n * Renders bulk purchase module.\n * @returns Bulk purchase module react node.\n */\n private _renderBulkPurchase(): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Temporary switch for the feature which is under development.\n if (!this.props.context.app.config.isBulkPurchaseEnabled) {\n return null;\n }\n\n if (!ArrayExtensions.hasElements(this.props.slots.bulkPurchaseSlots)) {\n return null;\n }\n\n const containerClass = `${this._className}__bulk-purchase`;\n return (\n <div className={containerClass}>\n {React.cloneElement(this.props.slots.bulkPurchaseSlots[0] as React.ReactElement, {\n productDimensions: this.state.productDimensions\n })}\n </div>\n );\n }\n\n /**\n * Render list container.\n * @returns JSX element.\n */\n private _renderListContainer(): JSX.Element {\n const containerClass = `${this._className}__table-content`;\n return <div className={containerClass}>{this._renderQuickOrderTable(this._className)}</div>;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderGridProducts(): QuickOrderGridProduct[] {\n const products: QuickOrderTemplateLine[] = this.state.products;\n\n const quickOrderGridProduct: QuickOrderGridProduct[] = products.map((product: QuickOrderTemplateLine) => {\n return new QuickOrderGridProduct(product);\n });\n\n return ArrayExtensions.validValues(quickOrderGridProduct);\n }\n\n /**\n * Method to call on clear button.\n */\n private readonly _removeProductList = () => {\n const { context, data, telemetry, resources } = this.props;\n const { quickOrderTemplate } = data;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && quickOrderTemplate && quickOrderTemplate.result) {\n ProductListsDataActions.deleteAsync({ callerContext: context.actionContext }, quickOrderTemplate.result.productList)\n .then(() => {\n window.location.reload();\n })\n .catch((error: string) => {\n telemetry.warning('[quick-order-grid] Unable to delete product list.');\n telemetry.error(error);\n this._updateStatusState(\n resources.quickOrderGridDeleteProductListFailedText,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n });\n } else {\n telemetry.warning('[quick-order-grid] Failed to delete product list. Product List was not found');\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n <QuickOrderGridTableComponent\n id={tableClassName}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n typeName={this.props.typeName}\n key={tableClassName}\n className={tableClassName}\n data={{\n quickOrderGridProducts: this._initQuickOrderGridProducts()\n }}\n context={this.props.context}\n resources={this.props.resources}\n isMobileView={this.state.isMobile}\n callBacks={this._quickOrderGridRowCallbacks}\n />\n );\n }\n\n /**\n * Method to called on product input change.\n * @param query - Product inventory info.\n */\n private readonly _handleInputChange = (query: string): void => {\n const queryMinLength = 4;\n if (!query || query.length > queryMinLength) {\n this.setState({ quantity: 0, productDimensions: [], productResponse: undefined });\n this._updateStatusState('', '', '', false);\n }\n if (this._cancellabelDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this._cancellabelDebounce.cancel();\n }\n\n const { telemetry, context } = this.props;\n const zeroNumber = 0;\n if (!StringExtensions.isNullOrEmpty(query)) {\n this._cancellabelDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext\n )\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderGridFormExpanded: true\n });\n })\n .catch((error: Error) => {\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this._waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this._cancellabelDebounce();\n }, zeroNumber);\n this.setState({ isQuickOrderGridFormExpanded: true });\n } else {\n this.setState({ productResponse: undefined, isQuickOrderGridFormExpanded: true });\n }\n };\n\n /**\n * Method to called on quantity change.\n * @param value - Quantity value.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n const currentValue = Number.parseInt(value, 10);\n const inputElement = this._quantityInput.current instanceof HTMLInputElement && this._quantityInput.current;\n const quantityChangeDebounceTimeout = 200;\n const minimumQuantity = 0;\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (!Number.isNaN(this.state.quantity) && !(this.state.quantity < minimumQuantity) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, quantityChangeDebounceTimeout)();\n });\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionType - Dimension Type.\n * @param resources - String resources.\n * @returns Dropdwon label.\n */\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update dimension and product in UI.\n */\n private readonly _updateDimensions = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n if (!productResponse || !hasProductDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this._dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // eslint-disable-next-line no-console -- Testing.\n console.log(this.state.isUpdatingDimension);\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const dimensionKey of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[dimensionKey]) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[dimensionKey] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n ?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) ?? dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n // eslint-disable-next-line no-async-promise-executor -- existing code\n const selectedProduct = new Promise<SimpleProduct | null>(async resolve => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n };\n\n /**\n * Method to get updated dimension value.\n * @param productDimensionFull - Product dimension full.\n * @param newValueId - New Dimension value.\n * @returns Dimension Value.\n */\n private readonly _updateDimensionValue = (\n productDimensionFull: IDimensionForSelectedVariant,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionTypeValue - Dimension Type.\n * @param resources - String resources.\n * @param isGiftCard - Flag to check if its a giftcard product.\n * @returns Dropdwon error label.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderGridResources,\n isGiftCard?: boolean\n ): string => {\n const amountErrorMessage = resources.quickOrderGridproductDimensionTypeAmountErrorMessage;\n\n switch (dimensionTypeValue) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.quickOrderGridproductDimensionTypeColorErrorMessage;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.quickOrderGridproductDimensionTypeConfigurationErrorMessage;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.quickOrderGridproductDimensionTypeSizeErrorMessage;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? amountErrorMessage : resources.quickOrderGridproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param productResponse - Simple Product.\n * @param quantity - Product Quantity.\n * @returns Flag to validate productlistline.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- existing code\n const missingDimensions = productResponse.Dimensions?.filter(\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n );\n const minimumQuantity = 0;\n if (ArrayExtensions.hasElements(missingDimensions)) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code\n if (this.state.productDimensionErrorState.configureErrors) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= minimumQuantity) {\n const resources = this.props.resources;\n this._updateStatusState(resources.quickOrderGridWrongQuantityErrorMsg, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n }\n return true;\n };\n\n /**\n * Initial the products on quick order.\n * @param result - Simple Product.\n * @param isGiftCard - Product Quantity.\n * @returns Flag to validate cart.\n */\n private _getConfigureErrors(\n result: ProductDimension[] | undefined,\n isGiftCard?: boolean\n ): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n\n /**\n * Method to call on quantity change in row.\n * @param itemKey - Product Key.\n * @param quantity - Product quantity.\n * @returns Flag to update status.\n */\n private readonly _changeRowQuantity = (itemKey: string | undefined, quantity: number): boolean => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n if (quickOrderTemplate?.result) {\n const quickOrderTemplateLinesData = quickOrderTemplate.result.quickOrderTemplateLines;\n if (ArrayExtensions.hasElements(quickOrderTemplateLinesData)) {\n const orderLineIndex = quickOrderTemplateLinesData.findIndex(\n (lines: QuickOrderTemplateLine) => lines.productListLine.LineId === itemKey\n );\n const newProductListLine = { ...quickOrderTemplateLinesData[orderLineIndex] };\n if (quickOrderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return true;\n }\n const previousQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n ProductListsDataActions.updateProductListLinesAsync(\n { callerContext: context.actionContext },\n quickOrderTemplate.result.productList.Id,\n [line.productListLine]\n )\n .then(list => {\n if (ArrayExtensions.hasElements(list)) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n quickOrderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...quickOrderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedProductList = { ...quickOrderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(\n new ActiveProductListInput(context.actionContext.requestContext),\n updatedProductList\n );\n return true;\n }\n\n return false;\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable to update product quantity.');\n telemetry.error(error.message);\n const userMessage = 'Failed to update quantity value.';\n newProductListLine.productListLine.Quantity = previousQuantity;\n this._updateStatusState(userMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n });\n }\n return false;\n }\n\n return false;\n };\n\n /**\n * Method to call on remove item from table.\n * @param line - Order Template Line.\n */\n private readonly _removeItemRowFromTable = (line: QuickOrderTemplateLine): void => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n\n if (quickOrderTemplate?.result) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken) {\n ProductListsDataActions.removeProductListLinesAsync(\n { callerContext: context.actionContext },\n line.productListLine.ProductListId!,\n [line.productListLine]\n )\n .then(() => {\n window.location.reload(false);\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable remove item from product list grid');\n telemetry.error(error.message);\n });\n } else {\n telemetry.warning('[quick-order-grid] Unable remove items from product list grid user token was not found');\n }\n }\n };\n\n /**\n * Method to call on add item from form.\n */\n private readonly _addItemToProductListLine = async (): Promise<void> => {\n const {\n context: { actionContext },\n resources,\n telemetry\n } = this.props;\n const {\n quickOrderGridAddedToGridSuccessMessage,\n quickOrderGridAddedToGridFailureMessage,\n quickOrderGridAddedToGridDuplicateError\n } = resources;\n const { productResponse, quantity, productListId } = this.state;\n let newProductList = '';\n\n this._updateStatusState('', '', '', false);\n\n if (productResponse !== undefined && this._validateCart(productResponse, quantity)) {\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n newProductList = this._createProductList();\n } else {\n newProductList = this.state.productListId;\n }\n\n if (StringExtensions.isNullOrWhitespace(newProductList)) {\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return;\n }\n\n const input = new AddItemToProductListInput(\n newProductList,\n productResponse.RecordId,\n quantity,\n productResponse.DefaultUnitOfMeasure ?? 'ea'\n );\n\n await addItemToProductListAction(input, actionContext)\n .then(result => {\n if (result.ProductListId) {\n this._updateStatusState(quickOrderGridAddedToGridSuccessMessage, 'success', 'fas fa-check', true);\n window.location.reload();\n this.setState({});\n }\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error trying to Update Grid Line from the quick order grid');\n if (error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n this._updateStatusState(\n quickOrderGridAddedToGridDuplicateError,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n } else {\n this._updateStatusState(\n quickOrderGridAddedToGridFailureMessage,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n }\n });\n }\n };\n\n /**\n * Method to create product list.\n * @returns - ProductListId.\n */\n private readonly _createProductList = (): string => {\n const {\n context: { actionContext },\n telemetry,\n resources\n } = this.props;\n const { productListId } = this.state;\n const { quickOrderGridAddedToGridFailureMessage } = resources;\n\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n const input = new CreateProductListInput('', ProductListType.QuickOrder);\n\n createProductList(input, actionContext)\n .then(result => {\n if (!StringExtensions.isNullOrWhitespace(result.Id)) {\n this.setState({ productListId: result.Id });\n return result.Id;\n }\n return '';\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error on creating productlist from quick order grid');\n telemetry.error(error.message);\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return '';\n });\n return '';\n }\n\n return productListId;\n };\n\n /**\n * Method to create product list.\n * @param messageText - Message Text.\n * @param statusCssString - Css class names.\n * @param messageGlyph - Glyph string.\n * @param isOpen - Flag to show.\n */\n private readonly _updateStatusState = (messageText: string, statusCssString: string, messageGlyph: string, isOpen: boolean): void => {\n this.setState({\n // eslint-disable-next-line react/no-unused-state -- Showing user message in Form component.\n stateMessage: {\n messageText,\n statusCssString,\n messageGlyph,\n isOpen\n }\n });\n };\n}\nexport default QuickOrderGrid;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridFormViewProps } from './components';\nimport { IQuickOrderGridViewProps } from './quick-order-grid';\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...containerProps}>\n <Node {...labelContainerProps}>{heading}</Node>\n {errors}\n {select}\n </Node>\n );\n};\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return <Node {...containerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n }\n return null;\n};\n\n/**\n * Render product dimension/configure container.\n * @param form -- Form props.\n * @param isMobileView -- Flag to check mobile view.\n * @param quickOrderForm - Form component container.\n * @param quickOrderProductContent - Form product component.\n * @param quickOrderMessageContent - Form user message component.\n * @param configure - Product Dimension component.\n * @returns Jsx element of quick order form component.\n */\nconst renderForm = (\n form: IQuickOrderGridFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMessageContent: INodeProps,\n configure?: IProductDimensionConfigureViewProps\n) => {\n return isMobileView ? (\n <Node {...quickOrderForm}>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n {form.addToListBtn}\n </Node>\n </Node>\n ) : (\n <Node {...quickOrderForm}>\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToListBtn}\n </Node>\n </Node>\n );\n};\n\n/**\n * Retrieves current sort criteria.\n * @param props - QuickOrder Grid view props.\n * @returns - Render View.\n */\nconst quickOrderGridView: React.FC<IQuickOrderGridViewProps> = props => {\n const {\n isB2bCustomer,\n quickOrderGridProps,\n contentProps,\n form,\n quickOrderGridForm,\n drawer,\n configure,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n isMobileView,\n header,\n container,\n actions,\n orderActions\n } = props;\n\n return isB2bCustomer ? (\n <Module {...quickOrderGridProps}>\n {header}\n {actions && (\n <Node {...actions}>\n {orderActions?.addProductListToBag}\n {orderActions?.removeProductList}\n </Node>\n )}\n <Node {...drawer}>\n <Node {...contentProps}>\n {renderForm(\n form as IQuickOrderGridFormViewProps,\n isMobileView,\n quickOrderGridForm,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n configure\n )}\n {props.bulkPurchase}\n </Node>\n </Node>\n {container}\n </Module>\n ) : null;\n};\n\nexport default quickOrderGridView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n (isRangeType(refinementCriterion.DataTypeValue) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent<IChoiceSummaryProps> {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\n return {\n key: this._getKeyForRefinerValue(selectedRefiner),\n value: selectedRefiner\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly<IChoiceSummaryProps>) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n <div className='msc-choice-summary'>\n {items.length > 0 && label && <span className='msc-choice-summary__label'>{label}</span>}\n <ul className={classnames(classNames, 'msc-choice-summary__list', 'list-unstyled')}>\n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <li className='msc-choice-summary__list-item' key={item.key}>\n <a\n className='msc-choice-summary__item'\n href={this.props.urlBuilder(item.value, false)}\n aria-label={`${item.value.LeftValueBoundString} ${choiceAriaLabel}`}\n onClick={this._onClick}\n role='button'\n id={item.key}\n {...attribute}\n >\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString ||\n item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString}\n <span\n className={`${this.closeButtonGlyph} msc-choice-summary__glyph`}\n role='button'\n aria-label={closeAriaLabel}\n />\n </a>\n </li>\n );\n })}\n </ul>\n {items.length > 0 && clearAllText && (\n <a\n href={this.props.urlBuilder({}, true)}\n className='msc-choice-summary__clear-all'\n {...clearAllAttributes}\n onClick={this._onClick}\n >\n {clearAllText}\n </a>\n )}\n </div>\n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n if (refinerHierarchy && refinerHierarchy.find) {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(r => r.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement>): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC<IErrorMessage> = ({ text }) => {\n return (\n <span className='ms-search-result-container__no-results-message'>\n <h5 className='error-text'>\n {` `}\n {text}\n {` `}\n </h5>\n </span>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC<IFeatureSearchResultItem> = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <div className='ms-feature-search-result__item'>\n <a\n href={productUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n {...attribute}\n aria-label={product.Name}\n >\n <div className='msc-feature-search-result__item__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n </div>\n </a>\n <div className='msc-feature-search-result__item__detail'>\n <p className='msc-feature-search-result__item__heading'>{heading}</p>\n {renderProductTitle(product?.Name)}\n </div>\n </div>\n );\n};\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string,\n fallbackImage?: string,\n context?: IRequestContext\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings,\n fallBackSrc: fallbackImage\n };\n return <Image {...img} {...imageProps} loadFailureBehavior='empty' requestContext={context} />;\n}\n\nfunction renderProductTitle(title?: string): JSX.Element | null {\n return <h1 className='msc-feature-search-result__item__product-title'>{title}</h1>;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC<ILink> = ({ text, className, href, ariaLabel }) => (\n <a className={className} href={href} aria-label={ariaLabel}>\n {' '}\n {text}{' '}\n </a>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject<HTMLButtonElement> | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject<HTMLButtonElement> | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC<IModalToggleProps> = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n <button id={id} className='msc-button' aria-label={ariaLabel} onClick={onClick} ref={innerRef}>\n {text}\n </button>\n );\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: <ModalBody className='msc-review-modal-body' />\n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n <Modal\n autoFocus\n applicationNode='renderPage'\n returnFocusRef={props.returnRef}\n isOpen={props.isOpen}\n toggle={props.onModalToggle}\n className='msc-search-result-modal'\n zIndex={1050}\n />\n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return <ModalHeader toggle={props.onModalToggle}>{props.resources.modalTitle}</ModalHeader>;\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n <ModalFooter>\n <Button onClick={props.onModalToggle} className='ms-sort-and-filter-modal-close'>\n {props.resources.modalCloseButtonText}\n </Button>\n </ModalFooter>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC<IProductSearchResultItems> = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) => (\n <li className='ms-product-search-result__item' key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={allowBackNavigation}\n id={moduleId}\n key={product.RecordId}\n typeName={moduleType}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButton}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n ))}\n </ul>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component<IRangeRefineItemProps, IRangeRefineItemState> {\n private readonly _formattedPriceReverseLookup: Map<string, string> = new Map();\n\n private readonly minInput: React.RefObject<HTMLInputElement>;\n\n private readonly maxInput: React.RefObject<HTMLInputElement>;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return [\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\n <label className={minLabelClassName}>\n {refineItemCommonProps.minLabel}\n <input\n className={minInputClassName}\n onChange={this._changeMin}\n onFocus={this._changeMin}\n onBlur={this._finishChangeMin}\n value={formattedSelectedMin}\n ref={this.minInput}\n />\n </label>\n <label className={maxLabelClassName}>\n {refineItemCommonProps.maxLabel}\n <input\n className={maxInputClassName}\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\n onChange={this._changeMax}\n onFocus={this._changeMax}\n onBlur={this._finishChangeMax}\n value={formattedSelectedMax}\n ref={this.maxInput}\n />\n </label>\n {validationErrorMin && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>\n {validationErrorMin}\n </span>\n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>\n {validationErrorMax}\n </span>\n )}\n </form>\n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n <Slider\n className='ms-refine-submenu__range-refiner'\n key={this.state.sliderId}\n sliderKey={sliderKey}\n id={this.state.sliderId}\n inForm={false}\n min={(this.state.minValue && Number(this.state.minValue)) || undefined}\n max={(this.state.maxValue && Number(this.state.maxValue)) || undefined}\n step={1}\n orientation='horizontal'\n labels={this.state.labels}\n showLabels\n showTooltip\n sliderThumbs={this.state.sliderThumbs}\n onChangeEnd={this._onRangeUpdateEnd}\n onChange={debounce(this._onRangeUpdate, 500)}\n handleTooltipText={this._handleRangeTooltipText}\n {...ariaAttributes}\n />\n );\n }\n\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent<HTMLInputElement>): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component<IRefineItemProps, IRefineItemState> {\n private readonly anchorType: React.RefObject<HTMLAnchorElement>;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n\n return (\n <li className={className} id={`${parentProductRefinerHierarchy.KeyName!}_${index}`}>\n <a\n key={selectedRefinementCriterion ? 'true' : 'false'}\n ref={this.anchorType}\n href={this._getRefinerUrl()}\n tabIndex={hasColor ? -1 : 0}\n onClick={this._onClick}\n className={itemTypeClassName}\n role={inputType}\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {/* eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string. */}\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext<IDimensionsApp>);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n <SwatchComponent\n className='ms-refine-submenu-item__swatch'\n apiSettings={this.props.context.request.apiSettings}\n list={swatchItems}\n isSelectionEnabled={false}\n isRefineItem\n />\n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent<HTMLAnchorElement | HTMLInputElement>): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n <li\n className='ms-refine-submenu-item ms-refine-submenu-item__rating'\n role={!this.props.isMobileView ? 'presentation' : undefined}\n id={`${parentProductRefinerHierarchy.KeyName!}_${index!}`}\n >\n <a\n href={this._getRefinerUrl()}\n role='option'\n aria-selected={isChecked}\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString!}\n ${productCountAriaLabelValue!}`}\n onClick={this._onClick}\n {...attribute}\n >\n <RatingComponent\n className={ratingComponentClass}\n avgRating={refinerRating}\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString}\n hideCount={false}\n readOnly\n ariaLabel=''\n context={context}\n id={this.props.moduleId}\n typeName={this.props.moduleTypeName}\n data={{}}\n />\n <span className='refine-submenu-item__rating' aria-hidden={this.props.isMobileView ? 'true' : undefined}>\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext<IGeneric<IAny>>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\n // isExpanded = true;\n // }\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\n return null;\n }\n\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n <div className={className}>\n <Button\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\n aria-label={productRefinerHierarchy.KeyName}\n onClick={this._onToggleSubmenu}\n aria-expanded={this.state.expanded}\n >\n {productRefinerHierarchy.KeyName}\n </Button>\n <Collapse isOpen={this.state.expanded} timeout={350}>\n {this._renderChildItems(productRefinerHierarchy)}\n </Collapse>\n </div>\n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n return (\n <RefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n selectedRefinerValues={selectedRefinerValues.filter(selectedValue =>\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n <ul\n className={`ms-refine-submenu__list ${productRefinerHierarchy.KeyName}`}\n {...role}\n aria-label={productRefinerHierarchy.KeyName}\n >\n {listItems}\n </ul>\n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `not-selected-${index}`;\n return (\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\n <RangeRefineItem\n parentProductRefinerHierarchy={productRefinerHierarchy}\n productRefinerValue={child}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n rangeType={rangeType}\n key={key}\n sliderKey={key}\n context={context}\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n />\n </li>\n );\n });\n return <ul className={`ms-refine-submenu__list list-unstyled ${productRefinerHierarchy.KeyName}`}>{listItems}</ul>;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC<ISeparator> = ({ separator }) => (\n <span>\n {` `}\n {separator}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC<ITitle> = ({ text, className }) => (\n <span className={className}>\n {` `}\n {text}\n {` `}\n </span>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport { format, ProductPrice, ProductRefinerValue, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps<ISearchResultContainerData> {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent<ISearchResultContainerProps<ISearchResultContainerData>>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps<ISearchResultContainerData>,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject<HTMLButtonElement>;\n\n private readonly _sortAndFilterContainerRef: React.RefObject<LabeledDropdown>;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public constructor(props: ISearchResultContainerProps<ISearchResultContainerData>, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef<HTMLButtonElement>();\n this._sortAndFilterContainerRef = React.createRef<LabeledDropdown>();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: []\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise<void> {\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n <FeatureSearchResultItem\n product={searchProduct}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n telemetryContent={this.telemetryContent}\n recommendation={this.props.context.request.query?.recommendation}\n />\n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n <ModalToggle\n text={resources.modalTitle}\n ariaLabel={resources.modalTitle}\n innerRef={this._modalToggleRef}\n onClick={this._toggleModal}\n id='search-result-modal'\n />\n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && <ErrorMessage text={errorText} />,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal({\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = <Title className='ms-search-result__collection-title-prefix' text={resources.searchTextPrefix} />;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = listPageState?.currentPageNumber\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(n => n.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\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 { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAdditionalContentData, ILinksData } from '../video-player.props.autogenerated';\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Component props.\n */\nexport interface IVideoPlayerAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content view props.\n */\nexport interface IVideoPlayerAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n additionalContentItems?: IVideoPlayerAdditionalContentItemViewProps;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Item view props.\n */\nexport interface IVideoPlayerAdditionalContentItemViewProps {\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentItemContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Video Player Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='ms-video-player__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Video Player Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='ms-video-player__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalParagraphChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Video Player Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IVideoPlayerAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'ms-video-player__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.openInNewTab,\n role: 'link'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Video Player additonal content item props.\n * @param props - Video Player Additional content component props.\n * @returns IVideoPlayerAdditionalContentItemViewProps.\n */\nconst getAdditionalContentItems = (\n item: IAdditionalContentData,\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentItemViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentItemContainer: { className: 'ms-video-player__details__additional-content__container' },\n additionalContentItemLinks: { className: 'ms-video-player__details__additional-content__cta' }\n };\n};\n\n/**\n * VideoPlayerAdditionalContent component.\n * @param props - Video Player Additional content component props.\n * @returns Video Player Additional content view props.\n */\nexport const videoPlayerAdditionalContent = (\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n const reactNodes: IVideoPlayerAdditionalContentItemViewProps = getAdditionalContentItems(additionalContent, props);\n return {\n additionalContentNode: { className: 'ms-video-player__details__additional-content' },\n additionalContentItems: reactNodes\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerData, IPlayerOptions, IPlayerResources, IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, videoPlayerAdditionalContent } from './components/additional-content';\nimport { ILinksData, IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IVideoPlayerAdditionalContentViewProps;\n handleText?(): void;\n handleParagraph?(): void;\n handleAdditionalText?(): void;\n handleAdditionalParagraph?(): void;\n handleLink?(): void;\n handleAdditionalLink?(): void;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent<IVideoPlayerProps<IVideoPlayerData>>}\n */\nclass VideoPlayer extends React.PureComponent<IVideoPlayerProps<IVideoPlayerConfig>> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps<IVideoPlayerConfig>) {\n super(props);\n this.isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const options = {\n ...this.props.config,\n isMobileDevice: this.isMobileDevice\n };\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options as IPlayerOptions, metaData: videoMetaData };\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\n player: (\n <MsDyn365.Video className='' editProps={{ key: this.props.config.video, requestContext: this.props.context.request }}>\n <Player\n playerData={videoPlayerData}\n playerResources={playerResources}\n telemetryContent={this.telemetryContent}\n isEditor={this.props.context.request.params.isEditor}\n />\n </MsDyn365.Video>\n ),\n title: this._getVideoDetailsHeading(),\n text: this._getVideoDetailsParagraph(),\n links: this._getVideoDetailsLinks(),\n detailsContainer: { className: 'ms-video-player__details' },\n detailsContainerCTA: { className: 'ms-video-player__details__cta' },\n additionalContent: videoPlayerAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleText: this.handleTextChange,\n handleParagraph: this.handleParagraphChange,\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleLink: this.handleLinkTextChange,\n handleAdditionalLink: this.handleAdditionalTextChange\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handle paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handle additional text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * Handle additional link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle additional paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * Get video details links.\n * @returns - React node.\n */\n private _getVideoDetailsLinks(): React.ReactNode[] | undefined {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n\n return links?.map((linkData: ILinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'ms-video-player__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n }\n\n private _getVideoDetailsHeading(): React.ReactNode | undefined {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='ms-video-player__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='ms-video-player__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n}\n\nexport default VideoPlayer;\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 { IVideoPlayerAdditionalContentViewProps } from './components/additional-content';\nimport { IVideoPlayerViewProps } from './video-player';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IVideoPlayerAdditionalContentViewProps) => {\n if (additionalContent.additionalContentItems) {\n return (\n <Node {...additionalContent.additionalContentNode}>\n <>\n {additionalContent.additionalContentItems.heading}\n <Node {...additionalContent.additionalContentItems.additionalContentItemContainer}>\n {additionalContent.additionalContentItems.text}\n <Node {...additionalContent.additionalContentItems.additionalContentItemLinks}>\n {additionalContent.additionalContentItems.links}\n </Node>\n </Node>\n </>\n </Node>\n );\n }\n\n return null;\n};\n\nconst VideoPlayerView: React.FC<IVideoPlayerViewProps> = props => {\n return (\n <div id={props.id} className='ms-video-player' {...props.renderModuleAttributes(props)}>\n {props.player}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </div>\n );\n};\n\nexport default VideoPlayerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\n <div key={key} className={className}>\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\n </div>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getFallbackImageUrl, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext<IGeneric<IAny>>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps) => {\n const { productUrl, telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n !StringExtensions.isNullOrWhitespace(productUrl) && (\n <a href={productUrl} className='ms-wishlist-items__product-link' {...productAttributes} aria-label={_renderAriaLabel(input)}>\n {productName}\n </a>\n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n <Button\n className='ms-wishlist-items__product-add-button'\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n onClick={addItemAction}\n disabled={!(isServiceItem || isInStock)}\n >\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n </Button>\n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-wishlistitems__product-unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const {\n product,\n productUrl,\n price,\n context,\n imageSettings,\n wishlistState,\n itemKey,\n handlers,\n inventoryInformationLabel,\n enableImageProductLink,\n inventoryLabelClassName\n } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\n\n return {\n key: `${RecordId}-item`,\n productImage: PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\n productLink: renderProductLink(input),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\n productStatusMessage: wishlistState &&\n wishlistState.isOpen &&\n wishlistState.productId === RecordId &&\n wishlistState.itemKey === itemKey && (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\n <span>{wishlistState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n};\n\nconst _renderProductImage = (\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className='ms-wishlist-items__product-image'\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-wishlist-items__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n <WishlistItemDimension\n key={`${product.RecordId}-dimensions-${index}`}\n className='msc-price ms-wishlist-items__product-dimension'\n dimensionType={type}\n dimensionValue={dimension.DimensionValue.Value}\n />\n );\n });\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className='ms-wishlist-items__message-waiting'>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n getProductUrlSync,\n IProductInventoryInformation,\n QueryResultSettingsProxy\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps<IWishlistItemsData> {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState> {\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: IWishlistItemsProps<IWishlistItemsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({});\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps<IWishlistItemsData>, nextState: IWishlistItemActionMessageState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n // StatusMessage: <Waiting className={ waitingClass || 'ms-wishlist-items__message-loading'} />\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addToCartButtonText,\n outOfStockText,\n removeButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount\n } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n\n return WishlistItem(currentProductProps)!;\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n <MsDyn365.Text\n className='ms-wishlist-items__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform\n ?.enableDefaultOrderQuantityLimits;\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n (customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b)));\n\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]\n );\n\n const isOrderQuantityLimitsFeatureEnabled =\n isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n const addProductToCartInput = {\n product,\n quantity: 1,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\n : 0,\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: isOrderQuantityLimitsFeatureEnabled },\n isAddEmailDeliveryItemToCart:\n ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity =\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && isOrderQuantityLimitsFeatureEnabled) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = context.app.config.maxQuantityForCartLineItem || 10;\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\n .replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(\n product: FullProduct,\n productInventoryCollection: IProductInventoryInformation[] | undefined\n ): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (\n productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\n ) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (\n !wishlists.result ||\n wishlists.result.length === 0 ||\n !wishlists.result[0].CommerceListLines ||\n wishlists.result[0].CommerceListLines.length === 0\n ) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n };\n}\n\nexport default WishlistItems;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n"],"names":["OrderSummaryLine","_ref","price","label","context","id","typeName","toBeCalculatedText","freeText","cssLabel","React","className","PriceComponent","data","CustomerContextualPrice","freePriceText","_buildOrderSummarySection","props","arguments","length","undefined","telemetry","_computedLoyaltyAmount","checkoutState","loyaltyAmount","OrderSummary","_ExtensionProperties$","_ExtensionProperties$2","isOnCartPage","TaxAmount","TotalAmount","OtherChargeAmount","ExtensionProperties","cart","canShip","hasDeliveryMethod","hasShippingMethod","freightFee","getDeliveryConfiguration","channelConfiguration","_cart$ChargeLines","_cart$ExtensionProper","pickupDeliveryModeCode","PickupDeliveryModeCode","ChargeLines","GrossAmount","DeliveryMode","find","prop","Key","Value","BooleanValue","totalExclShippingCharges","DecimalValue","totalDiscountPriceIncGST","window","Window","digitalData","transaction","profile","total","transactionTotal","totalDiscount","reactNodes","subtotal","subTotalLabel","tax","taxLabel","orderTotal","orderTotalLabel","otherCharge","otherChargeLabel","shipping","shippingLabel","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","reduce","giftCardCounter","count","giftCard","Balance","amount","Math","min","totalAmountAfterGiftCard","loyalty","loyaltyLabel","giftcardLabel","_objectSpread","totalDiscounts","totalDiscountsLabel","ePropsValue","IS_BUSINESS_ACCOUNT_KEY","CUST_ACCOUNT_STATUS_KEY","isShareholder","console","log","CustomerId","isBusinessAccountProperty","_isBusinessAccountPro","isCasual","_isBusinessAccountPro2","isGuest","findExtensionProperty","key","isShareholderAccountNotOnHold","custHoldStatusProp","onHoldStatus","StringValue","includes","isShareholderAccountNotInactive","custAccountStatusProp","accountStatus","isShareholderAccountDisabled","isShareholderAccountInactive","hasEcommerceAccess","userContactDetails","_userContactDetails$C","CustomerAccounts","account","IsActive","Permissions","Authorities","Authority","getExtensionProperty","extensionProperties","keyValue","typeValue","extensionProperty","String","Boolean","Integer","IntegerValue","Decimal","isValidColour","str","match","DeliveryMethodsAllowedValue","getDeliveryMethodsAllowedProperty","cartline","_deliveryMethodsAllow","deliveryMethodsAllowed","filter","keyValuePair","hasDeliveryOnlyError","deliveryOptions","hasDeliveryType","DeliveryType","DELIVERY","PICKUP","FulfillmentStoreId","hasPickupOnlyError","hasCartLineValidationErrors","cartlines","deliveryOptionForCartLine","item","_cartline$ItemId","ProductId","ItemId","toString","DeliveryOptions","retrieveDeliveryOptionsForCartItems","async","actionContext","products","Promise","all","map","product","getDeliveryOptionsAsync","callerContext","queryResultSettings","recordId","RecordId","salesPriceInclGST","AdjustedPrice","then","response","filterDeliveryOptionsForProductId","productId","deliveryOption","type","ESAM_EXTENSION_PROPERTY_KEY","CHECKOUT_ADDRESS_FLAG","toggleReadOnlyFormInputs","setAsReadOnly","inputIdList","forEach","element","document","getElementById","removeAttribute","setAttribute","debouncedESAMSuggestionsAPICall","_debounce","value","proxyUrl","subscriptionKey","onSuccessCallback","getESAMAddressSuggestions","catch","constructStreetValue","addressResponse","address","AddressType","AddressLine3","AddressLine1","AddressLine2","SuburbLocality","UnitType","RuralDelivery","getQuantityError","stockLeft","resources","errorMessageOutOfStock","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","replace","getGenericError","result","failureReason","addedToCartFailureMessage","cartActionResult","substatus","_cart$cart$ExtensionP","maxQuantityForLineItem","app","config","maxQuantityForCartLineItem","curQuantity","maxQuantityLimitText","getConfigureErrors","dimensions","dimension","DimensionTypeValue","dimensionTypeValue","productDimensionTypeColorErrorMessage","productDimensionTypeConfigurationErrorMessage","productDimensionTypeSizeErrorMessage","productDimensionTypeStyleErrorMessage","getDimensionErrorString","getBuyBoxInventoryLabel","productAvailableQuantity","StockLevelLabel","inventoryClassName","StockLevelCode","toLowerCase","getBuyboxProductTitle","titleHeadingTag","Heading","headingTag","text","Name","getBuyboxProductDescription","Description","getBuyboxAddToCart","state","callbacks","_props$data","_priceData$find","_priceData$find2","_props$data$product$r5","_props$data$productDi","quantity","selectedProduct","isUpdatingDimension","selectedDimensions","priceData","priceIncGST","specialPriceIncGST","isCartEmpty","dialogStrings","goToCartText","buyBoxGoToCartText","continueShoppingText","buyBoxContinueShoppingText","headerItemOneText","buyBoxSingleItemText","headerItemFormatText","buyBoxMultiLineItemFormatText","headerMessageText","buyBoxHeaderMessageText","priceFree","originalPriceText","currentPriceText","closeNotificationLabel","addedQuantityText","defaultImageSettings","viewports","xs","q","w","h","lg","xl","lazyload","productAvailability","ProductAvailableQuantity","isLoading","status","changeUpdatingDimension","productDim","Dimensions","dim","DimensionValue","DimensionId","allDim","Object","keys","productDimensions","disableButton","disableAddToCartButton","addToCartText","ContainerProps","button","AddToCartComponent","outOfStockText","navigationUrl","getUrlSync","BasePrice","onError","updateErrorState","errorHost","quantityError","configureErrors","missingDimensions","otherError","onAdd","_props$data$product$r","_props$data$product$r2","_props$data$product$r3","_props$data$product$r4","productdetail","productInfo","productName","sku","Price","category","primaryCategory","dispatchEvent","CustomEvent","getSelectedProduct","disabled","gridSettings","request","imageSettings","getBuyboxProductPrice","_props$data$productPr","_priceData$find3","_priceData$find4","productPrice","Number","toFixed","getBuyboxProductRating","ratingsSummary","ratingComponent","averageRating","RatingComponent","avgRating","readOnly","ariaLabel","format","averageRatingAriaLabel","ratingCount","reviewsCount","getBuyboxProductAddToWishlist","wishlists","AddToWishlistComponent","addToWishlistButtonText","removeFromWishlistButtonText","addToWishlistMessage","removedFromWishlistMessage","addItemToWishlistError","removeItemFromWishlistError","nameOfWishlist","onSuccess","onAddToWishlistSuccess","getBuyboxProductQuantity","errorState","LabelContainerProps","tag","htmlFor","heading","productQuantityHeading","errors","input","Quantity","max","currentCount","onChange","newValue","updateQuantity","inputQuantityAriaLabel","Dropdown","constructor","super","selectMenu","_onChanged","this","setState","selectedIndex","event","target","dropdownId","selectId","selectedValue","innerText","componentDidMount","current","render","dropdownList","dropdownName","dropdownToggleName","ref","selected","hidden","getBuyboxProductConfigure","getDropdownName","onChanged","notification","dimensionSelectedAsync","dropdowns","productDimensionFull","_mapProductDimensionFullToDropdownViewProps","sizeGuideLink","dimensionChanged","dropdownCallback","selectDimensionFormatString","toLocaleLowerCase","DimensionValues","dimensionValue","errorMessage","isSizeDropdown","href","select","ShopSimiliarButtonType","isGiftCard","productDimensionTypeAmountErrorMessage","BuyboxErrorBlock","showError","customAmountError","errorMessages","values","message","push","Alert","isOpen","color","assertive","buyboxErrorMessageHeader","index","getBuyboxFindInStore","_data$product","_data$productPrice","_data$storeSelectorSt","_data$cart","_data$deliveryOptions","_data$productAvailabl","_data$featureState","_data$channelDelivery","_props$data$product","slots","storeSelector","findInStoreHeaderText","descriptionTextToShowAllPickupOptions","channel","storeSelectorStateManager","retailMulitplePickupMFeatureState","featureState","IsEnabled","channelDeliveryOptionConfig","modalOpen","onClick","modules","dataProduct","multiplePickupStoreSwitchName","storeSelectorId","openDialog","onLocationSelected","resolve","error","debug","findInStoreOnClick","isSectionDisabled","buttonText","description","isStockCheck","buyboxResources","pickupInventory","_pickupInventory","pickup","deliveryType","isAggregatedInventory","IsProductAvailable","findInStoreLinkText","findInStoreDescriptionText","findInStoreNotAvailableTextButton","findInStoreNotAvailableDescription","getFindInStoreInventorySettings","enableStockCheck","ArrayExtensions","hasElements","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","delivery","deliveryCode","Code","PickupDeliveryModeCodes","option","priceComponent","popupProps","productQuantity","setModalOpen","changeModalOpen","renderModalPopup","Popup","assign","openFindInStoreDialog","productPickupOptionList","modal","Buybox","dimensionUpdateQueue","FinitePromiseQueue","buyboxCallbacks","newQuantity","newErrorState","updateSelectedProduct","newSelectedProduct","newInventory","newPrice","newDeliveryOptions","productDeliveryOptions","selectedDimensionId","selectedDimensionValueId","newSelectedDimensions","enqueue","_updateDimensions","reason","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","dimensionType","_getDropdownName","isModalOpen","apiSettings","channelId","dimensionsToUpdate","mappedDimensions","_updateDimensionValue","reject","newProduct","getSelectedVariant","SelectedVariantInput","MasterProductId","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","getPriceForSelectedVariant","PriceForSelectedVariantInput","getDeliveryOptionsForSelectedVariant","GetDeliveryOptionsForSelectedVariantInput","_checkAddToCartDisable","_resp$AggregatedProdu","_isBackorderAllowedPr","searchCriteria","DefaultWarehouseOnly","FilterByChannelFulfillmentGroup","ProductIds","physicalAvailableQuantity","isBackorderAllowedProp","isBackorderAllowed","resp","getEstimatedAvailabilityAsync","AggregatedProductInventoryAvailabilities","PhysicalAvailableQuantity","finalCheck","newValueId","productDimensionTypeColor","productDimensionTypeConfiguration","productDimensionTypeSize","productDimensionTypeStyle","hasEcomPermission","cartLine","CartLines","user","token","getContactDetailsAsync","JSON","parse","atob","split","oid","mediaGallery","contentBlock","deliveryAvaliableIcon","clickCollectAvaliableIcon","hideAddToCartButton","viewProps","ModuleProps","moduleProps","classnames","ProductInfoContainerProps","MediaGalleryContainerProps","title","configure","findInStore","addToCart","addToWishlist","rating","hideRating","inventoryLabel","deliveryBlock","clickCollectBlock","renderView","DeliveryMethods","deliveryMethods","isMobile","src","alt","altText","clickCollect","_renderFindInStore","_renderAddToCart","Node","_renderAddToWishlist","_renderConfigure","_renderConfigureDropdown","dropdown","_renderQuantity","quantityComponent","extentionResources","decrementButtonAriaLabel","incrementButtonAriaLabel","_data$product$result","_data$product$result3","_props$data$productPr2","shortDescProp","device","Type","setDeliveryMethods","useState","useEffect","_data$product$result2","fetchData","Module","_renderStoreLocation","orgUnitName","_getOrgUnitName","orgUnitLocations","fulfillmentStoreId","foundLocation","orgUnitLocation","OrgUnitNumber","OrgUnitName","_assembleCartlines","_getProduct","foundProductAvailability","foundProductDeliveryOption","_foundProductAvailabi","productAvailabilites","_productAvailability$","_assembleNode","foundProductDeliveryOptions","removeButtonText","removeItemClickHandler","validationErrorRemoveItemText","maxQuantity","outOfStockThreshold","maxCartlineQuantity","isStockCheckEnabled","AvailableQuantity","_getCartItemMaxQuantity","onRemoveClickHandler","hasError","CartLineItemComponent","currentQuantity","isOutOfStock","productUrl","getProductUrlSync","isQuantityEditable","primaryImageUrl","PrimaryImageUrl","displayMode","validationErrorRemoveButton","remove","Button","storeLocation","getMiniCartData","ctx","miniCartData","getCartState","getActiveCartProductsAction","ActiveCartProductsInput","exception","Error","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","requestContext","availableQuantity","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","CartIcon","_getImageSettings","sm","_removeItemFromCartHandler","cartlineToRemove","cartLineIds","LineId","removeCartLines","warning","_checkBackorderErrors","lineItems","inventoryStocks","p1","some","p2","isShareholderUser","isAccountNotInactive","isAccountNotOnHold","hasValidationErrors","populateMiniCartData","_cart$cart$CartLines","isClickCollect","url","requestUrl","pathname","getEstimatedProductWarehouseAvailabilityAsync","cartID","Id","InventoryStockAvailabilities","reaction","_this$props$data$cart","when","enableHoverCart","onHoldMessage","suspendedMessage","ecomPermissionMessage","isAuthenticated","signInUrl","cartUrl","cartLines","_getCartLines","hasErrors","backorderError","includeFlyout","goToCartButtonText","goToCartButtonTitle","totalItemsInCart","flyoutTitle","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","disableCheckout","inventoryAvaliabilityLineItems","slice","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","UncontrolledTooltip","placement","hideArrow","trigger","CartlinesWrapper","miniCartIcon","miniCartItemWrapper","checkoutButtons","_getCheckoutButtons","goToCartButton","totalPrice","disableCheckoutButton","checkoutURL","checkoutAsShareholderURL","signInURL","_getSignInURL","checkoutWithAccountButtonTitle","RichTextComponent","checkoutWithCardButtonTitle","checkoutButtonTitle","guestCheckoutButtonTitle","MsDyn365","isBrowser","indexOf","location","origin","FlyoutCartLineItems","sizeString","colorString","configString","styleString","quantityDisplayString","quantityDisplayText","discountStringText","shippingChargesText","inventoryAvaliabilityMessages","clickCollectText","deliveryText","noBackOrder","clickCollectOutOfStock","deliveryOutOfStock","removeCartButtonText","outOfRangeOneText","outOfRangeFormatText","cartState","__decorate","observer","renderModuleAttributes","_renderCartlines","PickUpInStore","_toggleBOPIS","isBopisSelected","alreadySelectedLocation","_onLocationChangedCallback","updateCartLinePickupLocation","cartLineId","ShippingAddress","clearCartLinePickupLocation","toggleBopis","defaultComponent","_renderShippingMethod","shipItText","pickupInStoretext","changeStoreText","bopisSelected","toggleBOPIS","name","checked","shipitText","pickUpInStoreText","_props$cartState","defaultWishlistName","moveToWishlistSuccessHandler","cartLineDeliveryMethodsText","includeErrors","_getErrorMessage","inventoryLbl","inventoryCode","removeButtonElement","productObj","validationErrorRemoveButtonElement","quantityOnChange","updateCartLinesQuantitySuccessHandler","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","removeButton","pickUpInStore","pickitUpText","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","_cartState$cart$CartL","showSpinner","firstCartline","setDeliveryMode","_callUpdateDeliverySpecification","getProductWarehouseAvailability","onlyUpdateNonPickup","updateCartLinePickupLocations","isDelivery","_context$actionContex","deliveryModeIdDeliveryValue","deliveryModeIdPickupValue","addressObject","City","Street","ThreeLetterISORegionName","TwoLetterISORegionName","ZipCode","Zip","BuildingCompliment","County","Country","CountyName","DistrictName","FullAddress","Address","Postbox","State","StateName","StreetNumber","updateCartDeliverySpecificationDeliveryInput","DeliveryModeId","DeliveryPreferenceTypeValue","DeliveryAddress","updateCartDeliverySpecificationPickupInput","PickUpStoreId","cookieCartId","cookies","getCartCookie","substring","updateDeliverySpecificationAsync","info","orgUnit","_getOrgUnit","locations","setProductAttributes","_cartState$cart$CartL2","cartLineOutOfStock","inventoryAvailabilityLevel","inventoryAvailabilityMessage","inventoryOrderOutOfStockFieldName","inventoryOrderOutOfStockMessage","newCartLine","newCartAttributes","TextValue","PhysicalAvailableInventoryLevelCode","_lineItems$index","_lineItems$index2","AttributeValues","PhysicalAvailableInventoryLevelLabel","refreshCart","_updateCart","_updateCartLines","_props$data$cart$resu","_props$data$cart$resu2","updateCart","newCartObject","_context$actionContex2","_props$data$cart$resu3","updateCartLinesAsync","Version","Cart","setShowSpinner","show","_getDeliveryMethods","_cart$cart","shipToAddressDisplayText","pickItUpDisplayText","changeStoreDisplayText","reload","_moveToWishlistSuccessHandler","_updateCartlineQuantity","cartlineToUpdate","updateCartLineQuantity","isUserAuthorised","hasCheckedUserAuthority","isSingleAccount","_this$props$data$acco","customer","accountInformation","FirstName","_this$props$data$acco2","AccountNumber","checkoutUrl","backToShoppingUrl","cartTitle","promotionBlocksWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","removePromoAriaLabelFormat","deliveryMethodHeading","deliveryMethodTitle","deliveryMethodOptions","orderSummaryHeading","orderSummaryTitle","orderSummaryAccountDetails","_getOrderSummaryAccountDetails","orderSummaryLineitems","_getOrderSummaryLineItems","checkoutWithAccountButton","checkoutWithCreditCardButton","checkoutAsSignInUserButton","checkoutAsGuestButton","backToShoppingButton","backToShoppingButtonTitle","continuingShoppingButton","promotionBlocks","waitingComponent","Waiting","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","loadingSpinner","OrderSummaryErrors","_getOrderSummaryErrors","allErrors","fullError","line","Wrapper","outOfStockErrorMessageHeader","header","itemsWithCountLabel","estimatedShippingLabel","estimatedTaxLabel","yetToBeCalculatedText","accountNumber","displayName","_openHeaderDropdown","click","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","CartLineItems","shipInsteadDisplayText","outOfStockErrorMessage","showOutOfStockErrors","deliveryOnly","cartLineDeliveryOnly","clickCollectOnly","cartLineClickCollectOnly","outOfStockCC","cartLineClickCollectOutOfStock","outOfStockDel","cartLineDeliveryOutOfStock","oosNoBackOrder","cartLineNoBackOrder","computed","DeliveryMethodMessage","children","cartDeliveryMethodMessage","_cartlines$0$data","errorData","cartEmptyHeader","cartEmptyText","emptyCartHeader","emptyCartText","_renderOrderSummarylines","orderSummaryLines","observable","isChecked","ariaSetSize","ariaPosInSet","CheckoutDeliveryOptions","selectedItemId","init","moduleState","onEdit","onCancel","onSubmit","cartDeliveryMode","getSavedDeliveryOption","_this$props$data$chec","_this$props$data$chec2","checkout","checkoutCart","isDeliveryModeExists","deliveryMode","_deliveryOption$","DeliveryModes","getDeliveryOptionSelected","_this$deliveryOptions","selectedItem","get","ChargeAmount","DeliveryOption","DescriptionComponent","ChargeDescription","getErrorMessage","errorMessageTitle","CheckoutDeliveryOptionsError","role","ErrorTitleComponent","ErrorMessageComponent","getDeliveryOptionList","_this$deliveryOptions2","code","radioButton","RadioButtonComponent","onDeliveryOptionChange","getSaveButton","saveBtnLabel","onSave","getEditButton","editBtnLabel","getCancelButton","cancelBtnLabel","setError","setHasError","onUpdating","clearError","sessionStorage","setItem","updateDeliverySpecification","savedDeliveryOption","onReady","_this$props$data$chec3","checkoutCartDeliveryMode","deliveryModeId","trim","updateDeliverySpecificationInput","shippingAddress","onPending","genericErrorMessage","setIsCancellable","getDeliveryOptions","_this$props$data$chec4","_this$props$context$a","_this$props$data$chec5","clearCartLinesDeliveryInformation","checkoutCartCookieId","getCheckoutCartCookie","cartId","allDeliveryModes","removePickUpFromDeliveryArray","_this$props$data$chec6","_this$deliveryOptions3","deliveryOptionsNotFound","deliveryMethod","loadDeliveryOptions","currentTarget","billingAddress","getItem","isReady","isUpdating","isError","isShowList","isShowSelected","deliveryOptionsData","errorMessageData","viewState","isShowSaveButton","hasExternalSubmitGroup","isShowEditButton","isShowCancelButton","classname","DeliveryOptionsList","list","deliveryOptionSelected","waiting","saveButton","editButton","cancelButton","action","withModuleState","DeliveryOptionList","DeliveryOptionSelected","_ref2","ErrorMessage","_ref3","AddPaymentForm","canSubmit","canCancel","cancelButtonText","submitButtonText","inputLabel","image","accountName","PaymentInformation","changePaymentButtonText","cardTitle","cardNumberLabel","expiresDateLabel","addressTitle","tokenizedPaymentCard","tenderLine","canEdit","iconImageSettings","SHAREHOLDER_KEY_VALUE","CheckoutShareholderPayment","isFetchingPaymentConnector","isEnabled","isCancellable","isRequired","saveExtensionProp","cartProperties","getGiftCardTotalAmount","getLoyaltyAmount","every","asyncResultStatus","_checkout$result","isPaymentVerificationRequried","isPaymentProcessing","hasInitialized","showBillingAddress","paragraph","shouldPaidByCard","imageProps","contentBlockImage","Image","alert","ErrorComponent","paymentInformation","PaymentInformationComponent","addPaymentForm","AddPaymentFormComponent","getLineItems","_getLineItemComponent","_product","_getPickUpAtStoreComponents","pickupDeliveryLocation","pickUpAtStoreWithLocationText","PickUpAtStore","_getLineItemsComponents","items","locationMatch","_getDeliveryLocation","isPickUp","LineItem","pickUpAtStore","_getLineItemsByDeliveryType","_filterItemsByDiliveryType","LineItemDeliveryGroup","LineItemList","_getLineItems","lineItemsHeading","editCartText","LineItems","Header","editLink","itemsForPickup","itemsForShip","getOrderSummary","showLineItems","orderSummaryProps","getOrderSummaryAccountDetails","lines","CheckoutGuidedCard","editButtonRef","formCardRef","renderFooder","isVisted","isSubmitting","isCancelAllowed","hasControlGroup","resource","saveAndContinueBtnLabel","focusOnFirstFocusableElement","node","ReactDOM","child","querySelector","focus","focusOnEditButton","scrollToTitle","formCard","scrollIntoView","getTitle","step","Tag","componentDidUpdate","prevProps","isActive","onNext","isExpanded","isPending","changeBtnLabel","active","expanded","closed","visted","initialized","ready","pending","updating","innerRef","CheckoutGuidedForm","currentStep","getEnabledModules","childIds","getModule","childId","isDisabled","getStep","getId","getHeading","isEditor","hasModuleState","GuidedCard","disableGuidedCheckoutFlow","enableControl","placeOrderText","canPlaceOrder","registerForBulkEmails","placeOrder","isBusy","setIsBusy","OPERATIONS","getCardTypeId","cardPrefix","resolveCardTypesAsync","CardType","Unknown","TypeId","findTenderIdTypeByOperationId","tenderTypes","operationId","matchedTenderType","tenderType","OperationId","TenderTypeId","roundNumber","_cartState$cart$Exten","getCheckoutState","guestCheckoutEmail","Currency","amountDue","AmountDue","cartTenderLines","getTenderLinePromises","loyaltyCardNumber","LoyaltyCardId","chargedAmount","loyaltyTenderLinePromise","Amount","getTenderTypesAsync","getLoyaltyTenderLine","giftCardExtend","_giftCardExtend$Expir","_giftCardExtend$Expir2","tenderTypeId","giftCardPin","Pin","giftCardExpirationYear","ExpirationDate","parseInt","giftCardExpirationMonth","creditCardTenderLinePromise","GiftCardId","GiftCardPin","GiftCardExpirationYear","GiftCardExpirationMonth","getGiftCardTenderLine","TenderLineId","IsPolicyBypassed","cartTypeId","CardTypeId","cardTenderLine","TokenizedPaymentCard","House","CardTokenInfo","Phone","Address1","getCreditCardTenderLine","salesOrder","checkoutAsync","bypassCache","lineItemIdsToRemove","e","activeCart","activeCartLine","checkoutCartLine","removeAllPromoCodes","removeCheckoutCartId","Checkout","isBulkEmailChecked","orderNote","loaded","_registerForBulkEmails","registerContactForBulkEmailsAsync","_updateAttributeArray","updateAttributeValues","newAttributeValues","handleOrderNoteBlur","sessionOrderNote","stringify","orderNoteUpdate","cartAttributeArray","salesOrderAttribute","obj","attributeObj","TextValueTranslations","checkoutAddressFlag","_checkoutAddressFlag$","retrieveSessionStoreAttribute","sessionStorageValueKey","attributeName","_this$props$data$chec7","sessionStorageValue","removeItem","handleOrderNoteChange","handleBulkEmailChange","getSlotItems","onPlaceOrder","checkoutOutOfStockErrorMessage","orderConfirmation","isOverMaxQuantity","_this$props$data$chec8","hasOrderConfirmation","checkoutAddressAttribute","phoneAttribute","customerNameAttribute","inventoryAvaailabilityMessage","populateDataLayer","orderedProducts","redirect","tenderLines","TenderLines","chargeLines","CalculatedAmount","deliveryCost","shippingCost","paymentMethod","transactionId","ChannelReferenceId","emptyActiveCart","orderConfirmationUrl","separator","updateSalesOrder","newSalesOrder","newOrderedProducts","productInventoryInformation","_cart$CartLines","productInventory","_productInventory$Pro","getActiveChildModuleStates","onContainerReady","cartInfo","cartObj","totalItems","transactionProducts","itemArr","TotalItems","i","netPrice","NetPrice","isEditorialMode","cartStatus","_this$props$data$chec9","shareholderData","_this$props$data$chec10","_this$props$data$chec11","cartExtensionProps","sessionUserOrderNote","profileInfo","customerType","unitPrice","userOrderNote","isEmptyCart","editCartLink","SendBulkEmails","canAccessShareholderCheckout","canAccessCheckout","_this$props$data$prod","checkoutHeading","bulkEmailMessage","cookieConsentRequiredMessage","checkoutClass","checkoutInformation","isConsentGiven","hasSalesOrder","checkoutProps","headerProps","bodyProps","mainProps","mainControlProps","sideProps","sideControlFirstProps","sideControlSecondProps","AlertComponent","loading","canShow","guidedForm","GuidedFormComponent","orderSummary","placeOrderButton","placeholder","onBlur","maxLength","PlaceOrderButtonComponent","PickUpAtStoreComponent","LineItemComponent","LineItemGroupComponent","lineItem","LineItemsComponent","_ref4","OrderSummaryComponent","_ref5","keepShoppingButton","layout","HeadingTag","ProductCollection","handleHeadingChange","trace","telemetryContent","getTelemetryObject","telemetryPageName","friendlyName","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","ProductContainer","productComponent","ProductComponent","ratingAriaLabel","_getActivePrice","productRecIds","prod","projectDomain","ChannelId","CatalogId","catalogId","affliations","customerInput","GetCustomerInput","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","getActivePricesAsync","Date","activePricesResponse","productPrices","activePrice","_activePrice$Extensio","_activePrice$Extensio2","_prod$ExtensionProper","property","_property$Value","_property$Value2","productCollection","enableAffiliationBasedPricing","isCarousel","carousel","headingComponent","Msdyn365","editProps","productCollectionViewProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperPrevious","flipperNextLabel","flipperNext","parentId","ProductCollectionContainer","GridComponentProps","_renderCarousel","carouselContainer","_renderProduct","_renderGrid","gridContainer","Link","ProductSearchResultItems","moduleType","moduleId","FeatureSearchResultItem","productRecordId","getProductPageUrlSync","fallbackImage","getFallbackImageUrl","payLoad","getPayloadObject","attribute","getTelemetryAttributes","onTelemetryClick","imageUrl","img","fallBackSrc","loadFailureBehavior","renderProductPlacementImage","featureSimilarLooksTitle","Title","Separator","AttributeDataType","RefinerType","ProductRefinerSource","DisplayTemplate","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","isRangeType","dataTypeValue","Constants","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","SingleSelect","Values","matchingIndex","findIndex","criterion","splice","RangeRefineItem","_formattedPriceReverseLookup","Map","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","formAttrs","rangeNameFormat","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onFocus","maxLabel","placeholderTextMax","gstRate","gstPercentage","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","touched","validationError","validationErrorRange","locale","currency","priceAmount","Intl","NumberFormat","style","currencyDisplay","minimumFractionDigits","formatPrice","has","set","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","tooltip","RefineItem","_onClick","preventDefault","analyticsEvent","eventName","eventAction","timeStamp","isToggledOn","anchorType","_this$props","attrs","_objectWithoutProperties","_excluded","isSingleSelect","itemTypeClassName","SourceValue","Rating","contentAction","etext","LeftValueBoundLocalizedString","_getRefinerUrl","tabIndex","_this$props$selectedR","_productRefinerValue$","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","hideCount","moduleTypeName","Count","urlBuilder","ChoiceSummary","closeButtonGlyph","_this$_getSelectedRef","stopPropagation","clearAll","getAttribute","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","_getKeyForRefinerValue","clearAllText","classNames","choiceAriaLabel","selectedRefinersMap","clearAllAttributes","listItemProps","rangeIncGST","priceRange","priceRangeIncGST","_numberWithCommas","_replaceCumulative","RegExp","x","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","UnitText","_get","ModalToggle","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","productRefinerHierarchy","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","_getRangeType","DisplayTemplateValue","Range","SliderWithBars","onUpdateRefiners","prevState","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","_this$props$context$r2","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","_pageType","urlTokens","pageType","expandrefinerCount","listPageState","activeProducts","_getSearchResultModal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","getFriendlyName","NameTranslations","productCountNumber","productCountText","totalProductCount","numberOfProducts","oneProduct","TitleContainer","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","fullUrl","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","previousText","nextText","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","refiners","refiner","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","sortingCritera","Columns","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","priceFilter","indexOfItemInArray","criteria","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","zero","one","two","three","four","_viewport","_updateViewport","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","decodeURIComponent","pageSize","_this$props$context$r","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","includeAttributes","getCollectionProducts","productResults","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","_this$props$context$a2","addEventListener","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","md","createSearchResultModal","modalProps","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","renderTitleCount","SuggestionType","AutoSuggestInput","searchText","top","suggestionType","hitPrefix","hitSuffix","getCacheKey","getCacheObjectType","dataCacheType","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","ProductSearchCriteria","SearchCondition","Context","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","ImageUrl","generateImageUrl","AllSearchResults","createObservableDataAction","autoSuggestPromises","inputData","ProductSuggestionsComponent","suggestions","autoSuggestProps","_item$ExtensionProper","adjustedPriceIncGST","_getHighlightedText","thumbnail","_renderThumbnail","_renderPrice","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","_generateLink","suggestion","formattedLink","formattedText","dangerouslySetInnerHTML","getRichTextHtml","adjustedPrice","basePrice","CategorySuggestionsComponent","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","splitValue","pop","_getCategoryLink","searchPageURL","searchQsp","searchRefiners","route","urlPath","categoryRefiners","encodedRefiner","encodeURIComponent","compressRefiners","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","isSearchFormExpanded","searchTextInput","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","inputNode","submitBtnNode","cancelBtn","submitBtn","LabelComponent","searchLabelClass","searchLabelArialLabel","searchtext","searchCollapsedLabel","attributes","Search","waitTime","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","KeyCodes","Escape","formReference","contains","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","update","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","getSearchSuggestionsAction","_getSuggestionType","inputSuggestionType","results","_getSearchRefiners","autoSuggestAriaLabel","_setAutoSuggestResultCount","suggestionTypes","distinctSuggestionTypes","suggestionTypeItem","charAt","toUpperCase","join","_handleSubmit","productSearchTracking","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","searchInputMaxLength","suggestionTypeCriterion","searchFormClass","productSuggestionClick","body","params","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","productSuggestions","Product","categorySuggestions","Category","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","autoComplete","UlProduct","UlCategory","form","autosuggestProduct","autosuggestCategory","getProductSearchRefinersAsync","_renderForm","_renderProductSuggestions","_renderCategorySuggestions","inputRef","_validateMin","minValue","currentInput","_onIncrement","_onDecrement","_handleChange","incDisabled","currentValue","quantityClasses","pattern","invokeCallback","inputElement","HTMLInputElement","defaultProps","getCheckoutCart","require","CartLineItemFunctions","renderProductDimensions","DimensionStrings","productDimension","renderDiscountLines","DiscountLines","discountLine","OfferId","OfferName","DiscountCost","isSalesLine","PeriodicDiscount","DiscountAmountWithoutTax","DiscountAmount","Percentage","renderInventoryLabel","inventoryCssName","CartLineComponent","cartData","_cartLine$ExtensionPr","_this$props$children7","_this","LineNumber","inventoryLineItem","isDeliveryMethodsAllowedDelivery","destructDimensionStrings","fallbackImageUrl","_generateErrorMessage","_generateValidationErrorMessage","_this$props$children","isCompact","isDeliveryOnly","deliveryMethodAllowed","isOOSCC","isOOSDel","isBackOrderAllowed","IsBackOrderAllowed","_this$props$children6","extendedText","_this$props$children2","_this$props$children3","_this$props$children4","_this$props$children5","_updateQuantity","_generateQuantityAndPrice","renderPrice","nodes","_cartLine$ExtensionPr2","_cartLine$ExtensionPr3","totalPriceIncGST","totalSpecialPriceIncGST","sanitizeImageUrl","StockLabel","notDeliveryOnly","icon","Tick","ExclamationMark","Cross","xmlns","width","height","fill","viewBox","d","msdyn365Commerce","createComponentOverride","component","CarouselModule","_handleDismissCarousel","dismissCarousel","_next","nextIndex","activeIndex","content","animating","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","closeAnimation","previous","onIndicatorsClickHandler","handleDismissCarousel","handleOnExited","handleOnExiting","retrieveItems","Carousel","pause","pauseOnHover","ride","autoplay","interval","transitionType","hideFlipper","dismissEnabled","dismissCarouselAriaText","ariaLabelForDismissButton","indicatorAriaText","ariaLabelForSlide","directionTextPrev","directionTextNext","keyboard","CheckoutStateInput","buildCacheKey","CheckoutState","_giftCards","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_isTermsAndConditionAccepted","_customerAccountAmount","defineProperty","prototype","_tokenizedPaymentCard","_tenderLine","_billingAddress","_shippingAddress","_cardPrefix","_loyaltyCardNumber","updateTokenizedPaymentCard","newTokenizedPaymentCard","updateTenderLine","newTenderLine","updateShippingAddress","newShippingAddress","updateBillingAddress","newBillingAddress","updateCardPrefix","newCardPrefix","removeGiftCard","giftCardNumber","removeGiftCardExtend","addGiftCard","__spreadArrays","addGiftCardExtend","updateLoyaltyCardNumber","newLoyaltyCardNumber","updateLoyaltyAmount","newAmount","updateGuestCheckoutEmail","newGuestCheckoutEmail","updateTermsAndConditionsAcceptance","newIsTermsAndConditionAccepted","updateCustomerAccountAmount","ModuleStatesCacheKey","getModuleStates","cacheKey","moduleStates","WrappedComponent","_super","ModuleState","call","initializeState","_b","states","__assign","_a","isSubmitContainer","getModuleStateManager","validate","isSkipped","shouldSubmitContainer","setIsRequired","setIsSubmitContainer","onSkip","onDisable","getModuleByTypeName","getModuleStateManagerByTypeName","options","_moduleState","_validateLeaf","source","module","isMatch","_validateContainer","allMatched","skipSkippableItem","shouldEnableSinglePaymentAuthorizationCheckout","_isPaymentSectionContainer","__extends","shouldComponentUpdate","nextProps","TelemetryConstant","retailMultiplePickUpOptionEnabled","isSelectDefaultOptionEnabled","useDefaultDeliveryOption","hasInvoiceLine","getCartLinesForShipping","information","updateShouldCollapsePaymentSection","newShouldCollapsePaymentSection","updateCartDeliverySpecification","cartLinesForShipping","updateCartDeliverySpecificationInput","emailDeliveryModeCode","EmailDeliveryModeCode","_this$channelDelivery","originalDeliveryMode","shippingCartLines","hasShippingDeliveryLines","channelDeliveryOptionConfiguration","deliveryOptionFilter","filterDeliveryModeOption","FilterDeliveryModeOption","None","FilterOutNonCarrierDeliveryMode","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","_unused","updateHasCartDeliveryMode","newHasCartDeliveryMode","isPaymentVerificationRedirection","getStoredDeliveryOptions","_this$props$data$chec12","_this$props$data$chec13","_this$props$data$chec14","isExpressCheckoutApplied","isExpressPaymentAppliedInCartPage","_this$props$data$cart2","properties","_this$expressPaymentD","_this$expressPaymentD2","expressPaymentDetailsFromCartPage","isExpressCheckoutAppliedInCartPage","_this$props$data$chec19","isDataReady","_this$props$data$chec15","_this$props$data$chec16","_this$props$data$chec17","_this$props$data$chec18","shouldEnableCheckoutErrorDisplayMessaging","_this$props$data$chec20","checkoutError","errorLocation","ErrorLocation","nextState","_this$props$data$chan","_this$props$data$feat","feature","deliveryOptionAriaLabel","ariaValueMax","ariaValueMin","ariaValueNow","CheckoutLoyalty","moduleClassName","_defaultLoyaltyPoints","loyaltyCard","CardNumber","updateLoyaltyCardId","handleCancelOrSubmit","shouldPayLoyalty","_setErrorMessage","_clearError","_dialogToggleRef","_applyLoyaltyPoints","_removeLoyaltyPoints","_onInputChange","_onBlur","dollarsApplied","maxDollars","isFetchingLoyaltyCard","loyaltyTransactionEstimation","MaxCurrencyValueOfLoyaltyPoints","_updateEstimate","_updateLoyalty","isShowLoyalty","isShowAddLoyalty","checkoutLoyalty","showLoyalty","loyaltyHeadingText","coveredAmountText","TextComponent","loyaltyCoveredAmountText","addLoyalty","drawer","Drawer","toggleButtonText","_drawerHeader","openGlyph","closeGlyph","glyphPlacement","cardNumber","rewardPoints","RewardPoints","points","_renderPointSection","availablePointsLabel","expiringLoyaltyPointsLabel","loyaltyAmountContainer","appliedLoyaltyAmountContainer","loyaltyAmountLabel","payWithLoyaltyAmountLabel","loyaltyAmountInput","InputComponent","loyaltyAmountApplyButton","applyCheckoutLoyaltyPaymentText","showAppliedAmount","loyaltyAmountAppliedText","loyaltyAmountAppliedPrice","loyaltyAmountRemoveButton","removeCheckoutLoyaltyPaymentText","point","RewardPointId","checkoutLoyaltyRewardPoint","availablePointsText","activePoints","ActivePoints","expiringPointsText","expiringPoints","PointsExpiringSoon","parseFloat","num","card","channelConfig","loyalPointsRequest","createGetMaxLoyaltyPointsToRedeemForTransactionBalanceInput","_query","callActionOrExecute","_points$MaxCurrencyVa","GetLoyaltyTransactionEstimationInput","newMaxPoints","AddCheckoutLoyalty","rewardPoint","ShowCheckoutLoyalty","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","_onSubmitHandler","_applyPromotionHandler","_removePromotion","removePromoCodes","promoCodes","_calculateDiscount","discountAmount","DiscountCode","_renderAppliedPromoCode","Coupons","removePromotionHandler","promoCodTotalDiscount","coupon","ApplyPromoCode","isCollapseOpen","HeaderPreferredStore","modalCloseButtonRef","handleClick","_findPreferredStoreOnClick","storeName","preferredStore","StoreName","headerPreferredStoreText","headerPreferredStoreAriaLabel","showMapViewLink","parentElementRef","Logo","_renderLogo","link","linkUrl","destinationUrl","openInNewTab","rel","_renderImage","imagePropertyName","shouldSkipToMainImage","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","targetId","handleLinkTextChange","linkIndex","_this$props$config$my","myAccountLinks","linkText","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","hasSigninerror","isOBORequest","workerName","customerName","firstName","signUpCustomerNotFoundTitle","signUpMultipleCustomerFoundTitle","signinNotificationError","_getSigninNotification","NotificationsManager","instance","addNotification","ErrorNotification","logoLink","logoImage","shouldShowWishlistCount","disableTooltip","headerToggleClass","headerClassName","navbarKey","cartIconSlot","_getSlot","menuBarSlot","searchSlot","wishlistCount","siteOptionsSlot","preferredStoreSlot","CommerceListLines","logo","wishListIconDesktop","WishListIconComponent","wishlistTooltipText","wishlistCountLabel","isDispayWishlistCount","wishListIconMobile","navIcon","menuBar","search","siteOptions","HeaderTag","headerAriaLabel","HeaderContainer","HeaderTopBarContainer","Divider","MobileMenuContainer","wrapClassName","MobileMenuHeader","MobileMenuBodyContainer","MobileMenuLinksContainer","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","Popover","signInLink","_getSigninButton","signOutLink","_getSignOutButton","switchCustomerLink","_getSwitchCustomerButton","accountInfoDropdownButton","_getAccountInfoDropdownButton","accountLinks","_getAccountLinks","slotName","SignIn","signInLinkText","signInLinkAriaText","_user$signOutUrl","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","SwitchCustomer","isOBOAccountSelected","getAccountSelectionCookie","switchCustomerLinkAriaText","switchCustomerLinkText","removeAccountSelectionCookie","additionalProperties","signUpCustomerNotFound","signUpMultipleCustomerFound","retailServerErrorCode","MyProfile","shoppingAsText","cta","editableLink","onTextChange","_renderReactFragment","slot","_renderDesktopAccountBlock","_getProductsDimensionsAvailabilities","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","validValues","DimensionTypes","none","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","initProductState","productCollectionProducts","equals","_this$state$productsD","quickviewSlot","quickview","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","TotalRatings","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","isPriceMinMaxEnabled","priceResources","priceRangeSeparator","quickViewButton","dimensionAvailabilities","dimensionAvailability","_product$MasterProduc","masterProductId","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","recommendation","headingLabel","seeAllLink","getCatalogId","seeAllButtonText","shouldDisplaySeeAllButton","recommendationListId","updatedProducts","getProductData","ObjectExtensions","isNullOrUndefined","seeAllButton","AddToCartProductListComponent","_quickOrderTemplate$q","_quickOrderTemplate$q2","quickOrderTemplate","quickOrderTemplateLines","fullProduct","ProductDetails","productListLine","buttonLabel","quickOrderGridBuySelectedButtonText","buttonAriaLabel","quickOrderGridBuySelectedButtonAriaLabel","_props$resources$quic","_props$resources$quic2","_props$resources$quic3","_props$resources$quic4","_props$resources$quic5","_props$resources$quic6","_props$resources$quic7","_props$resources$free","_props$resources$orig","_props$resources$curr","_props$resources$adde","_props$resources$quic8","_props$resources$quic9","quickOrderGridGoToCartText","quickOrderGridDialogCloseText","quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel","quickOrderGridSingleItemText","quickOrderGridMultiLineItemFormatText","headerLinesFormatText","quickOrderGridMultiLinesFormatText","quickOrderGridHeaderMessageText","buyAgainNotificationTitle","quickOrderGridBuySelectedAddingToCartErrorNotificationTitle","buyAgainNotificationCloseAriaLabel","getDialogStrings","orderDetailProducts","quickOrder","orderDetails","quickLine","_quickLine$fullProduc","salesLine","OrderDetailsProduct","getOrderDetails","addToCartArialLabel","shouldSkipSiteSettings","orderDetailsProducts","getQuickOrderGridAddToCartDialog","removeActionHandler","handlers","removeProductList","productList","removeQuickOrderList","QuickOrderGridDrawer","_props$collapseProps$","_props$collapseProps","_isManuallyToggled","previousState","collapseProps","_drawerGlyphClass","toggleGlyphClassName","isAnimateGlyph","_drawerOpenGlyph","_drawerCloseGlyph","drawerClass","drawerButtonClassName","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","isCollapseState","drawerButtonTextClass","toggleButtonClassName","headingDrawerClass","descriptionDrawerClass","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","QuickOrderGridFormComponent","productTextInput","quantityTextInput","quickOrderGridState","isAddtoListDisabled","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","handleQuantityChange","handleAddProductListClick","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","quantityNode","addToListBtn","userMessage","stateMessage","statusCssString","messageGlyph","messageText","QuickOrderGridProduct","productLine","isSelected","QuickOrderGridDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderGridProductNumberText","quickOrderGridProductText","quickOrderGridUnitPriceText","quickOrderGridUnitOfMeasureText","quickOrderGridQuantityText","quickOrderGridActionsText","QuickOrderGridMobileHeaderCellsComponent","QuickOrderGridTableHeaderComponent","rowClassName","headerCells","cropFocalRegion","QuickOrderGridTableRowProductImageComponent","_props$data$product$p","_product$PrimaryImage","_props$imageSettings","containerClassName","setShowPreviousActions","onChangeHandler","onChangeQuantity","itemKey","onRemoveHandler","onRemoveItem","quickOrderGridProductKey","QuickOrderGridExtraActionsPopupComponent","_props$data$product$p2","quickOrderGridViewDetailsButtonAriaLabel","quickOrderGridViewDetailsButtonText","shouldShowActions","setShowActions","StringExtensions","isNullOrWhitespace","onClickViewDetails","shouldShowActionsNewValue","actionsContainerClassName","quickOrderGridRemoveItemButtonAriaLabel","QuickOrderGridDesktopTableRowCellComponent","_props$data$product$p3","_product$Dimensions","_productListLine$Line","_dimension$DimensionV","quickOrderGridProductDimensionsSeparator","renderProductPrice","isNullOrEmpty","UnitOfMeasure","renderUnitOfMeasure","IncrementalQuantity","quickOrderGridInputQuantityAriaLabel","quickOrderGridDecrementButtonAriaLabel","quickOrderGridIncrementButtonAriaLabel","IsGiftCard","QuickOrderGridMobileTableRowCellComponent","_props$data$product$p4","_productListLine$Line2","QuickOrderGridTableRowComponent","variant","VariantType","Viewport","QuickOrderGridTableComponent","setIsMobile","isMobileView","quickOrderGridProducts","updateViewport","quickOrderProduct","_quickOrderProduct$pr","_quickOrderProduct$pr2","ProductPrice","callBacks","QuickOrderGrid","_waitTime","_dimensionUpdateQueueMaxLength","_errorCssClass","_errorCssGlyphClass","_dimensionUpdateQueue","_dimensions","_cssClassNameConfigure","_className","_quickOrderGridCallbacks","_quickOrderGridRowCallbacks","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","ProductListsDataActions","_updateStatusState","quickOrderGridDeleteProductListFailedText","productResponse","_cancellabelDebounce","isQuickOrderGridFormExpanded","getScanResult","GetScanResultInput","ProductDimensionFull","_handleQuantityChange","_quantityInput","_this$state$productRe","ProductDimensionType","Color","Configuration","Size","Style","productDimensionTypeAmount","hasProductDimensions","productDimensionErrorState","clearOtherErrorState","dimensionKey","_this$_updateDimensio","_getDimensionErrorString","amountErrorMessage","quickOrderGridproductDimensionTypeAmountErrorMessage","quickOrderGridproductDimensionTypeColorErrorMessage","quickOrderGridproductDimensionTypeConfigurationErrorMessage","quickOrderGridproductDimensionTypeSizeErrorMessage","quickOrderGridproductDimensionTypeStyleErrorMessage","_validateCart","_productResponse$Dime","_getConfigureErrors","quickOrderGridWrongQuantityErrorMsg","quickOrderTemplateLinesData","orderLineIndex","newProductListLine","previousQuantity","newLine","updatedLines","updatedProductList","ProductListLines","ActiveProductListInput","ProductListId","_addItemToProductListLine","quickOrderGridAddedToGridSuccessMessage","quickOrderGridAddedToGridFailureMessage","quickOrderGridAddedToGridDuplicateError","productListId","newProductList","_productResponse$Defa","_createProductList","AddItemToProductListInput","DefaultUnitOfMeasure","addItemToProductListAction","CreateProductListInput","ProductListType","QuickOrder","createProductList","_productTextInput","_telemetryContent","_quickOrderGridFormClass","_quickOrderGridFormProductContent","_quickOrderGridFormMsgContent","customerInformation","customerInfo","quickOrderGridModuleHeading","quickOrderGridModuleDescription","quickOrderGridAddtogrid","quickOrderGridProductQuantityInputLabel","quickOrderGridProductInputLabel","quickOrderGridProductDimensionTypeColor","quickOrderGridProductDimensionTypeConfiguration","quickOrderGridSelectDimensionFormatString","quickOrderGridProductDimensionTypeSize","quickOrderGridProductDimensionTypeStyle","quickOrderGridProductDimensionTypeAmount","quickOrderGridModulePageHeading","productConfigureResources","quickOrderGridProps","contentProps","isB2bCustomer","IsB2b","actions","bulkPurchase","_renderBulkPurchase","quickOrderGridForm","quickOrderGridFormProductContent","quickOrderGridFormMsgContent","getProductConfigure","container","_renderListContainer","orderActions","_renderQuickOrderGridActions","quickOrderGridDeleteButtonText","addProductListToBag","QuickOrderGridActionsView","isBulkPurchaseEnabled","bulkPurchaseSlots","containerClass","_renderQuickOrderTable","_initQuickOrderGridProducts","quickOrderGridProduct","tableClassName","renderConfigureDropdown","containerProps","labelContainerProps","renderConfigure","renderForm","quickOrderForm","quickOrderProductContent","quickOrderMessageContent","_this$props$context","channelInventoryConfigurationId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","closeAriaLabel","refinerValues","filterValue","r","featureSimilarDescriptionTitle","getInventoryLabel","inventoryAttribute","swatchItemAriaLabel","_selectedRefinementCr","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","getLabels","getSliderThumbs","sliderKey","_this$props$minValueS","_this$props$maxValueS","maxValue","sliderKeyString","previousProps","updateSliderProps","_this$props$selectedR5","_this$props$selectedR6","_this$props$selectedR7","_this$props$selectedR8","_this$props$parentPro","_this$props$parentPro2","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","_renderRating","productText","productCount","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","colorHexCode","SwatchComponent","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","defaultChkProductCount","productCountAriaLabelValue","_props$context$reques","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","defaultPageNumber","isListPageStateUpdated","_updateListPageState","_this$props$config$it","_this$props$config$it2","hydrateRefinersFromUrl","_this$props$data$list","_this$props$data$list2","_this$props$data$list3","_this$props$data$list4","_this$props$context$r3","_getAllSortByOptions","_renderPrev","_renderNext","updateRefinerPanel","_shouldHideFromRefiners","_this$props$data$prod2","inventoryAwareSortableAttributeId","_this$props$data$refi","_this$props$data$prod3","n","_getProducts","_this$props$slots","_this$props$data$prod4","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","isPriceMinMaxFeatureState","_getSortCriteriaColumn","_this$props$data$list5","queryColumns","mappedSearchConfiguration","_this$props$data$list6","paginationPreviousText","paginationNextText","_nameTranslation","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r4","_this$props$context$r5","_this$props$context$r6","newListPageState","Recommendation","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r7","_this$props$context$r8","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","_listPageState$result","_listPageState$result2","_this$props$context$r9","_this$props$data$list7","_this$props$data$list8","Browser","isRecoSearchPage","_props$context$action","SearchState","getAdditionalContentItems","_item$links","renderHeading","additionalContentHeading","handleAdditionalTextChange","subtext","renderParagraph","additionalContentParagraphText","handleAdditionalParagraphChange","links","ctaLink","renderLinks","handleAdditionalLinkTextChange","additionalContentItemContainer","additionalContentItemLinks","videoPlayerAdditionalContent","additionalContent","additionalContentNode","additionalContentItems","VideoPlayer","handleTextChange","handleParagraphChange","isMobileDevice","video","playerResources","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","videoMetaData","_video$_links","videoId","duration","playTime","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","player","Player","playerData","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainer","detailsContainerCTA","handleText","handleParagraph","handleAdditionalText","handleAdditionalParagraph","handleLink","handleAdditionalLink","_this$props$config$ad","linkData","linkId","_heading$tag","detailsContainerCta","WishlistItemDimension","WishListItemActions","onAddToCart","_renderAriaLabel","formattedPrice","CurrencyCode","renderProductLink","productAttributes","renderInventoryInformationLabel","WishlistItemAddToCartButtonComponent","isInStock","isServiceItem","ItemTypeValue","ReleasedProductType","Service","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","unitOfMeasure","unitOfMeasureDisplayType","_renderProductImage","_renderProductDimensions","WishlistItemsStatusMessage","errorType","WishlistItems","_onDismiss","_renderHeading","_addItemToCart","addedToCartSuccessMessage","invoiceInCartErrorMessage","_getProductInventory","isOrderQuantityLimitsFeatureEnabledInHq","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","isOrderQuantityLimitsFeatureEnabledInSiteSettings","isOrderQuantityLimitsFeatureEnabled","addProductToCartInput","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","addProductToCart","_await$cart$cart","maxQtyLimitReachedMessage","_getInventoryValueMessage","_result$errorDetails","errorDetails","LocalizedMessage","_result$errorDetails2","_removeItemFromWishlist","userToken","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","commerceList","castCommerceList","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","_inventoryLabel","_inventoryClassName","_isProductInStock","productResult","foundWishlistItem","commerceListLine","emptyWishlistText","wishlistErrorGettingWishlist","errorProps","statusMessage","emptyViewProps","Products","ProductDimensions","_renderProductList","addToCartButtonText","enableImageProductLink","wishlistState","productImage","productLink","productUnitOfMeasure","entireProductLink","productAriaLabel","addToCartButton","inventoryInformation","productStatusMessage","onDismiss","WishlistItem","minInventory","productInventoryCollection","_renderItem"],"sourceRoot":""}