{"version":3,"file":"static/js/22.5bc2a274a2f4d14a71ea.chunk.js","mappings":"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","sources":["webpack://Citta2.0/./src/components/citta-cart/cart-line-items.tsx?5e8b","webpack://Citta2.0/./src/components/price-component.tsx?ed26","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-pick-up-in-store.tsx?9701","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-items.tsx?0f67","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-groups.tsx?9a00","webpack://Citta2.0/./src/modules/citta-cart/utils/get-promotion-in-citta-cart.ts?15a5","webpack://Citta2.0/./src/modules/citta-cart/citta-cart.tsx?bb3f","webpack://Citta2.0/./src/modules/citta-cart/components/hso-validate-cartlines-inventory.tsx?97a2","webpack://Citta2.0/./src/modules/citta-cart/components/citta-cart-line-items-promotion.tsx?25f5","webpack://Citta2.0/./src/modules/citta-cart/citta-cart.view.tsx?6edb","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.props.autogenerated.ts?7a73","webpack://Citta2.0/./src/modules/citta-search-result-container/components/link.tsx?c700","webpack://Citta2.0/./src/modules/citta-search-result-container/components/product-search-result-items.tsx?8c10","webpack://Citta2.0/./src/modules/citta-search-result-container/components/feature-search-result-item.tsx?568d","webpack://Citta2.0/./src/modules/citta-search-result-container/components/title.tsx?b899","webpack://Citta2.0/./src/modules/citta-search-result-container/components/separator.tsx?b8dd","webpack://Citta2.0/./src/modules/citta-search-result-container/components/utilities.ts?bb91","webpack://Citta2.0/./src/modules/citta-search-result-container/components/range-refine-item.tsx?e0d5","webpack://Citta2.0/./src/modules/citta-search-result-container/components/refine-item.tsx?a159","webpack://Citta2.0/./src/modules/citta-search-result-container/components/choice-summary.tsx?db37","webpack://Citta2.0/./src/modules/citta-search-result-container/components/modal.tsx?ec98","webpack://Citta2.0/./src/modules/citta-search-result-container/components/refine-submenu.tsx?a4fd","webpack://Citta2.0/./src/modules/citta-search-result-container/components/error-message.tsx?2d94","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.tsx?b687","webpack://Citta2.0/./src/components/citta-search-result/utilities.ts?1d16","webpack://Citta2.0/./src/components/citta-search-result/range-refine-item.tsx?f68a","webpack://Citta2.0/./src/components/citta-search-result/refine-item.tsx?5a16","webpack://Citta2.0/./src/components/citta-search-result/refine-submenu.tsx?ad28","webpack://Citta2.0/./src/components/citta-search-result/url-utils.ts?88cb","webpack://Citta2.0/./src/components/citta-search-result/citta-refiners.tsx?b326","webpack://Citta2.0/./src/components/citta-picture.tsx?de55","webpack://Citta2.0/./src/modules/citta-search-result-container/components/product-component.tsx?8073","webpack://Citta2.0/./src/modules/citta-search-result-container/citta-search-result-container.view.tsx?15fd","webpack://Citta2.0/./src/themes/citta/views/cart.view.tsx?dc69","webpack://Citta2.0/./src/themes/citta/views/citta-cart.view.tsx?d1fe","webpack://Citta2.0/./src/validate-cart.ts?cd50","webpack://Citta2.0/./src/Common/get-product.ts?0a21","webpack://Citta2.0/./src/modules/cart-icon/utils/get-products-in-mini-cart.ts?3c15","webpack://Citta2.0/./src/modules/cart-icon/cart-icon.tsx?4ae8","webpack://Citta2.0/./src/modules/cart-icon/components/flyout-cart-line-items.tsx?f2c4","webpack://Citta2.0/./src/modules/cart/actions/get-pickup-options-for-cartlines.ts?acad","webpack://Citta2.0/./src/modules/cart/components/cart-line-groups.tsx?f076","webpack://Citta2.0/./src/modules/cart/utils/get-promotion-in-cart.ts?4195","webpack://Citta2.0/./src/modules/cart/cart.tsx?d4e4","webpack://Citta2.0/./src/modules/cart/cart.view.tsx?d8c2","webpack://Citta2.0/./src/modules/cart/components/cart-line-items-promotion.tsx?80d9","webpack://Citta2.0/./src/modules/cart/components/cart-line-items.tsx?f6b2","webpack://Citta2.0/./src/modules/cart/components/cart-pick-up-in-store.tsx?dca8","webpack://Citta2.0/./src/invoice-summary-lineitem.tsx?5f61","webpack://Citta2.0/./src/order-summary-lineitem.tsx?8a98","webpack://Citta2.0/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://Citta2.0/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://Citta2.0/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://Citta2.0/./src/modules/search-result-container/components/link.tsx?52c2","webpack://Citta2.0/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://Citta2.0/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://Citta2.0/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://Citta2.0/./src/modules/search-result-container/components/title.tsx?c269","webpack://Citta2.0/./src/modules/search-result-container/components/range-refine-item-input.tsx?09aa","webpack://Citta2.0/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://Citta2.0/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://Citta2.0/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://Citta2.0/./src/modules/search-result-container/components/utilities.ts?8569","webpack://Citta2.0/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://Citta2.0/./src/modules/search-result-container/search-result-container.view.tsx?b779"],"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 { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from '@msdyn365-commerce-modules/cart';\r\nimport { getProductUrlSync, IProductInventoryInformation, OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n AddToOrderTemplateComponent, AddToWishlistComponent, CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources, ICartlineResourceString, IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources, IOrderTemplateNameDialogResources, IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IGridSettings, IImageSettings, ITelemetry, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { CartLine, CommerceList, Customer, LineDataValidationFailure, OrgUnitLocation, ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\n// import { PropertyUserActionClass } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceModels.g';\r\nimport { ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport * as React from 'react';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: LineDataValidationFailure[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n /** 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 storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n storeSelectorModuleId?: string;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n\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 = (maxCartlineQuantity: number, isStockCheckEnabled: boolean, productAvailability?: IProductInventoryInformation, productMaxQuantity?: number) => {\r\n const lineMaxQuantity = productMaxQuantity ? productMaxQuantity : maxCartlineQuantity;\r\n\r\n if (isStockCheckEnabled) {\r\n if (!productAvailability || !productAvailability.ProductAvailableQuantity || !productAvailability.IsProductAvailable || !productAvailability.ProductAvailableQuantity.AvailableQuantity) {\r\n return 0;\r\n }\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity ? productAvailability.ProductAvailableQuantity.AvailableQuantity : lineMaxQuantity;\r\n }\r\n\r\n return lineMaxQuantity;\r\n};\r\n\r\nconst _getErrorMessage = (maxQuantity: number, currentQuantity: number, props: ICartLineItemsProps, lineIndex: number, isServiceItem: boolean, eoqQuantity:number): string | undefined => {\r\n \r\n const finalErrorMessage: string[] = [];\r\n if (props.includeErrors) {\r\n if (props.isStockCheckEnabled && !isServiceItem) {\r\n if (maxQuantity <= 0) {\r\n finalErrorMessage.push(props.outOfStockText);\r\n } else if (maxQuantity < currentQuantity) {\r\n if (maxQuantity === 1) {\r\n finalErrorMessage.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessage.push(props.outOfRangeFormatText.replace('{numLeft}', maxQuantity.toString()));\r\n }\r\n }\r\n }\r\n }\r\n const eoqErrorMessage = `Must be purchased in multiples of ${eoqQuantity}`;\r\n\r\n // server-side validation\r\n props.cartlinesErrors\r\n .filter(i => i.LineIndex === lineIndex)\r\n .forEach(i => {\r\n if (\r\n i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityViolatesMultiplicityOfConfiguredNumber\" ||\r\n i.DataValidationFailure?.ErrorResourceId === \"Microsoft_Dynamics_Commerce_Runtime_ItemQuantityLessThanMinimumAndViolatesMultiplicityOfConfiguredNumber\") {\r\n finalErrorMessage.push(eoqErrorMessage);\r\n } else if (i.DataValidationFailure?.ErrorContext) {\r\n finalErrorMessage.push(i.DataValidationFailure.ErrorContext);\r\n }\r\n });\r\n\r\n if (finalErrorMessage.length > 0) {\r\n return finalErrorMessage.join(' ');\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n// tslint:disable-next-line:max-func-body-length\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 { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText,\r\n removeItemClickHandler, moveToWishlistSuccessHandler, addToOrderTemplateButtonText,\r\n addToOrderTemplateDialogResources, createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources, duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText, removeFromWishlistButtonText, orderTemplates, customerInformation,\r\n wishlists, defaultWishlistName, storeSelectorModuleId } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const maxQuantity = _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n foundProductAvailability,\r\n props.isQuantityLimitsFeatureEnabled ? product.Behavior?.MaximumQuantity : undefined);\r\n\r\n // check if the product is service or not by product type\r\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\r\n const isServiceItem = product.ItemTypeValue === PRODUCTASSERVICE;\r\n\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const eoqQuantity:number =isB2B? product.Behavior?.MultipleOfQuantity || 1 : 1;\r\n const errorMessage = _getErrorMessage(maxQuantity, cartline.Quantity!, props, index, isServiceItem, eoqQuantity);\r\n\r\n const onRemoveClickHandler = (event: React.MouseEvent) => { removeItemClickHandler(cartline); };\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}` : undefined;\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 pickUpInStore: (\r\n PickUpInStore({\r\n storeSelectorModuleId: storeSelectorModuleId,\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 locationChangedHandler: props.locationChangedHandler\r\n })\r\n ),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n addToWishlist: (\r\n isAuthenticated ? (\r\n \r\n ) :\r\n undefined\r\n ),\r\n addToOrderTemplate: (\r\n\r\n isAuthenticated && orderTemplates ? (\r\n //@ts-ignore\r\n \r\n ) :\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nconst _assembleCartlines = (cartlines: CartLine[], products: SimpleProduct[] | undefined, props: ICartLineItemsProps): 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 // console.log('product', product, 'cartline', cartline);\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find((productAvailability) => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find((deliveryOption) => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, foundProductDeliveryOption));\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component\r\n */\r\n\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return (\r\n _assembleCartlines(cartlines, products, props)\r\n );\r\n};","import { __assign } from \"tslib\";\r\nimport { msdyn365Commerce } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nvar PriceComponentActions = {};\r\nvar Price = function (props: any) {\r\n if (props.data.price.CustomerContextualPrice === undefined) {\r\n return null;\r\n }\r\n return (React.createElement(\"span\", { className: classnames('msc-price', props.className) }, showStrikethroughPricing(props) ? renderCurrentPriceWithOriginalPrice(props) : renderCurrentPrice(props)));\r\n};\r\nvar showStrikethroughPricing = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n if (originalPrice && props.data.price.CustomerContextualPrice) {\r\n return originalPrice > props.data.price.CustomerContextualPrice;\r\n }\r\n return false;\r\n};\r\nvar getOriginalPrice = function (props: any) {\r\n return Math.max(props.data.price.BasePrice || 0, props.data.price.TradeAgreementPrice || 0, props.data.price.AdjustedPrice || 0);\r\n};\r\nvar renderCurrentPrice = function (props: any) {\r\n var initialPrice = formatCurrency(props, props.data.price.CustomerContextualPrice);\r\n return (React.createElement(\"span\", { className: 'msc-price__actual', itemProp: 'price' }, initialPrice));\r\n};\r\nvar formatCurrency = function (props: any, price: any) {\r\n if (price === undefined) {\r\n return undefined;\r\n }\r\n if (price === 0 && props.freePriceText) {\r\n return props.freePriceText;\r\n }\r\n let returnPrice = `$${price}`;\r\n try {\r\n var formatter = new Intl.NumberFormat(props.context.cultureFormatter.locale, {\r\n style: 'currency',\r\n currency: props.context.cultureFormatter.currencyCode,\r\n currencyDisplay: 'narrowSymbol'\r\n });\r\n returnPrice = formatter.format(price)\r\n\r\n } catch {}\r\n return returnPrice;\r\n};\r\nvar renderCurrentPriceWithOriginalPrice = function (props: any) {\r\n var originalPrice = getOriginalPrice(props);\r\n var initialPrice = formatCurrency(props, originalPrice);\r\n return (React.createElement(React.Fragment, null,\r\n React.createElement(\"span\", { className: 'sr-only' },\r\n ' ',\r\n props.originalPriceText,\r\n ' ',\r\n initialPrice,\r\n ' ',\r\n props.currentPriceText,\r\n ' ',\r\n renderCurrentPrice(props)),\r\n React.createElement(\"span\", { className: 'msc-price__strikethrough', \"aria-hidden\": 'true' }, initialPrice),\r\n React.createElement(\"span\", { \"aria-hidden\": 'true' }, renderCurrentPrice(props)),\r\n props.savingsText && React.createElement(\"span\", { className: 'msc-price__savings' }, props.savingsText)));\r\n};\r\n\r\nconst PriceComponent: React.FunctionComponent = msdyn365Commerce.createComponent(\r\n 'Product',\r\n { component: msdyn365Commerce.createComponent('Price', __assign({ component: Price }, PriceComponentActions)) }\r\n);\r\n\r\nexport default PriceComponent","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n DeliveryOption,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IPickUpInStoreViewProps {\r\n callbacks: {\r\n toggleBopis(isBopisSelected: boolean): void;\r\n };\r\n defaultComponent?: React.ReactNode;\r\n orgUnitName?: string;\r\n isBopisSelected: boolean;\r\n ContainerProps: INodeProps;\r\n deliveryOption?: string;\r\n}\r\n\r\nexport interface IPickUpInStoreProps {\r\n cartline: CartLine;\r\n product: SimpleProduct;\r\n shipitText: string;\r\n pickUpInStoreText: string;\r\n changeStoreText: string;\r\n cartState: ICartState | undefined;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n orgUnitLocations?: OrgUnitLocation[] | undefined;\r\n deliveryOptions?: ProductDeliveryOptions;\r\n pickupDeliveryModeCode?: string;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n retailMulitplePickupFeatureState?: boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\r\n const _onLocationChangedCallback = async (\r\n orgUnitLocation: OrgUnitLocation,\r\n cartState: ICartState | undefined,\r\n cartline: CartLine,\r\n deliveryMode?: string\r\n ) => {\r\n if (!cartState) {\r\n return Promise.resolve();\r\n }\r\n return cartState\r\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n };\r\n\r\n const _toggleBOPIS = (isBopisSelected: boolean) => {\r\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\r\n\r\n if (isBopisSelected) {\r\n if (!storeSelectorStateManager) {\r\n return;\r\n }\r\n storeSelectorStateManager\r\n .openDialog({\r\n id: storeSelectorModuleId,\r\n product,\r\n alreadySelectedLocation: {\r\n OrgUnitNumber: cartline.FulfillmentStoreId\r\n },\r\n deliveryOptions: props.deliveryOptions,\r\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\r\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\r\n }\r\n })\r\n .catch(error => {});\r\n } else {\r\n if (!cartState) {\r\n return;\r\n }\r\n cartline.DeliveryMode = '';\r\n cartline.FulfillmentStoreId = '';\r\n cartline.ShippingAddress = {};\r\n cartState\r\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\r\n .then(result => {\r\n if (result.status === 'SUCCESS') {\r\n props.locationChangedHandler();\r\n }\r\n })\r\n .catch(error => {});\r\n }\r\n };\r\n\r\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n }\r\n return fulfillmentStoreId;\r\n };\r\n\r\n const _renderShippingMethod = (\r\n cartLine: CartLine,\r\n shipItText: string,\r\n pickupInStoretext: string,\r\n changeStoreText: string,\r\n orgUnitLocations: OrgUnitLocation[] | undefined\r\n ): JSX.Element => {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\r\n const bopisSelected = !!cartLine.FulfillmentStoreId;\r\n\r\n const toggleBOPIS = (isBopisSelected: boolean) => {\r\n return () => {\r\n _toggleBOPIS(isBopisSelected);\r\n };\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n {cartLine.FulfillmentStoreId ? (\r\n
\r\n {orgUnitName}\r\n \r\n
\r\n ) : null}\r\n \r\n );\r\n };\r\n\r\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\r\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\r\n return delivery?.Description;\r\n };\r\n\r\n /**\r\n * Method to check if we have atleast one common delivery code between product and channel.\r\n * @param productdeliveryOptions - Product DeliveryOption List.\r\n * @param storePickUpOptionList - Channel DeliveryOption List.\r\n * @returns Boolean flag.\r\n */\r\n const matchDeliveryOptions = (\r\n productdeliveryOptions: DeliveryOption[] | undefined,\r\n storePickUpOptionList: string[] | undefined\r\n ): boolean => {\r\n const deliveryOption: string[] = [];\r\n productdeliveryOptions?.map(delivery => {\r\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\r\n if (pickup) {\r\n deliveryOption.push(pickup);\r\n }\r\n return deliveryOption;\r\n });\r\n\r\n return ArrayExtensions.hasElements(deliveryOption);\r\n };\r\n\r\n // If no delivery options present on the product, or none of the delivery options\r\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\r\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\r\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\r\n return undefined;\r\n }\r\n } else if (\r\n !props.pickupDeliveryModeCode ||\r\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n callbacks: {\r\n toggleBopis: _toggleBOPIS\r\n },\r\n defaultComponent: _renderShippingMethod(\r\n props.cartline,\r\n props.shipitText,\r\n props.pickUpInStoreText,\r\n props.changeStoreText,\r\n props.orgUnitLocations\r\n ),\r\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\r\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\r\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\r\n ContainerProps: {\r\n className: 'msc-cart-line__bopis-container'\r\n }\r\n };\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n AddToOrderTemplateComponent,\r\n AddToWishlistComponent,\r\n CartLineItemComponent,\r\n IAddToOrderTemplateDialogResources,\r\n ICartlineResourceString,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, {\r\n IAny,\r\n ICoreContext,\r\n IGeneric,\r\n IGridSettings,\r\n IImageSettings,\r\n ITelemetry,\r\n TelemetryEvent,\r\n isChannelTypeB2B\r\n} from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n AsyncResult,\r\n CartLine,\r\n CartLineValidationResultsByLineId,\r\n ChannelDeliveryOptionConfiguration,\r\n CommerceList,\r\n Customer,\r\n OrgUnitLocation,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\r\nimport {\r\n ArrayExtensions,\r\n getInvoiceDetailsPageUrlSync,\r\n getProductUrlSync,\r\n IProductInventoryInformation,\r\n ObjectExtensions,\r\n OrderTemplate\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\nimport { IPickUpInStoreViewProps, PickUpInStore } from './citta-cart-pick-up-in-store';\r\n\r\nexport interface ICartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartlinesErrors: CartLineValidationResultsByLineId;\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n catalogs?: ProductCatalog[];\r\n retailMulitplePickupFeatureState?: boolean;\r\n\r\n /* GridSettings for the product image in cartline */\r\n gridSettings: IGridSettings;\r\n\r\n /* ImageSettings for the product image in cartline */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext>;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n addToWishlistButtonText: string;\r\n removeFromWishlistButtonText: string;\r\n shipItText: string;\r\n pickitUpText: string;\r\n changeStoreText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\r\n isStockCheckEnabled: boolean;\r\n wishlists: CommerceList[] | undefined;\r\n defaultWishlistName: string;\r\n maxCartlineQuantity: number;\r\n includeErrors?: boolean;\r\n showShippingChargesForLineItems?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n hasInvoiceLine?: boolean;\r\n storeSelectorModuleId?: string;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\r\n\r\n addToOrderTemplateButtonText: string;\r\n addToOrderTemplateButtonTooltip: string;\r\n addToOrderTemplateMessage: string;\r\n addItemToOrderTemplateError: string;\r\n orderTemplates: OrderTemplate[] | undefined;\r\n customerInformation: Customer | undefined;\r\n shouldIgnoreWarehouse: boolean | undefined;\r\n productAvailability?: AsyncResult;\r\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\r\n hsoConfig?: number;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\r\n locationChangedHandler(): void;\r\n}\r\n\r\nexport interface ICartlinesViewProps {\r\n cartline: React.ReactNode;\r\n pickUpInStore?: IPickUpInStoreViewProps;\r\n remove: React.ReactNode;\r\n addToWishlist: React.ReactNode | undefined;\r\n addToOrderTemplate: React.ReactNode | undefined;\r\n\r\n error?: string;\r\n cartlineId?: string;\r\n hasError?: boolean;\r\n data?: {\r\n product?: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (\r\n isStockCheckEnabled: boolean,\r\n productAvailability: IProductInventoryInformation | undefined\r\n): number => {\r\n if (\r\n !isStockCheckEnabled ||\r\n !productAvailability ||\r\n !productAvailability.ProductAvailableQuantity ||\r\n !productAvailability.IsProductAvailable ||\r\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\r\n ) {\r\n return 0;\r\n }\r\n\r\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxQuantityByConfig: number,\r\n isStockCheckEnabled: boolean,\r\n availableQuantityInStock: number,\r\n isQuantityLimitsFeatureEnabled: boolean,\r\n maxByQuantityLimitsFeature: number\r\n) => {\r\n if (isQuantityLimitsFeatureEnabled) {\r\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\r\n // and consider available qty if stock check enabled and max from config in site settings.\r\n if (!maxByQuantityLimitsFeature) {\r\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n }\r\n\r\n return isStockCheckEnabled\r\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\r\n ? maxByQuantityLimitsFeatureResult\r\n : availableQuantityInStock\r\n : maxByQuantityLimitsFeatureResult;\r\n }\r\n if (isStockCheckEnabled) {\r\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\r\n }\r\n return maxQuantityByConfig;\r\n};\r\n\r\nconst _getErrorMessage = (\r\n availableQuantityInStock: number,\r\n currentQuantity: number,\r\n props: ICartLineItemsProps,\r\n shouldSkipStockCheck: boolean,\r\n cartLine: CartLine,\r\n lineId: string | undefined\r\n): string | undefined => {\r\n const finalErrorMessages: string[] = [];\r\n\r\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\r\n if (isLoadingDeliveryOptions) {\r\n return undefined;\r\n }\r\n\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity.ProductId === cartLine.ProductId &&\r\n productAvailability.InventLocationId === cartLine.WarehouseId\r\n );\r\n });\r\n if (foundProductAvailability === undefined) {\r\n return undefined;\r\n }\r\n }\r\n\r\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\r\n if (availableQuantityInStock <= 0) {\r\n finalErrorMessages.push(props.outOfStockText);\r\n } else if (availableQuantityInStock < currentQuantity) {\r\n if (availableQuantityInStock === 1) {\r\n finalErrorMessages.push(props.outOfRangeOneText);\r\n } else {\r\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\r\n }\r\n }\r\n }\r\n\r\n // Server-side validation\r\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\r\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\r\n if (errorsFoundByLineId !== undefined) {\r\n for (const i of errorsFoundByLineId) {\r\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\r\n i.ValidationFailures.forEach(validation => {\r\n if (validation.ErrorContext !== undefined) {\r\n finalErrorMessages.push(validation.ErrorContext);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\r\n return finalErrorMessages.join(' ');\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n removeItemClickHandler(cartline);\r\n};\r\n\r\n// eslint-disable-next-line complexity -- Auto-suppressed.\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct | undefined,\r\n props: ICartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: IProductInventoryInformation,\r\n productPickUpOptions?: ProductDeliveryOptions\r\n): ICartlinesViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n moveToWishlistSuccessHandler,\r\n addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateDialogResources,\r\n createOrderTemplateDialogResources,\r\n itemAddedToOrderTemplateDialogResources,\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n addToWishlistButtonText,\r\n removeFromWishlistButtonText,\r\n orderTemplates,\r\n customerInformation,\r\n wishlists,\r\n defaultWishlistName,\r\n storeSelectorModuleId,\r\n hsoConfig\r\n } = props;\r\n\r\n const isAuthenticated = context.request.user.isAuthenticated;\r\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\r\n\r\n const maxQuantity =\r\n product &&\r\n _getCartItemMaxQuantity(\r\n props.maxCartlineQuantity,\r\n props.isStockCheckEnabled,\r\n availableQuantityInStock,\r\n props.isQuantityLimitsFeatureEnabled,\r\n product?.Behavior?.MaximumQuantity || 0\r\n );\r\n\r\n // Skip stock check if the cart line is a service item or an invoice line\r\n //const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n let shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\r\n \r\n if (hsoConfig) {\r\n const estimatedDateProperty = availableQuantityInStock\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n let estimatedDate = \"\";\r\n if (estimatedDateValue == undefined) {\r\n estimatedDate = \"\";\r\n } else {\r\n estimatedDate = estimatedDateValue.toString();\r\n }\r\n\r\n const StockThresholdprop = availableQuantityInStock\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && foundProductAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n let StockThreshold = 0;\r\n if (StockThresholdpropval != undefined) {\r\n StockThreshold = StockThresholdpropval;\r\n }\r\n\r\n let onhand = 0;\r\n if (availableQuantityInStock != undefined) {\r\n onhand = Number(availableQuantityInStock);\r\n }\r\n\r\n if (StockThreshold == 0) {\r\n shouldSkipStockCheck = true;\r\n } else {\r\n if (onhand >= StockThreshold) {\r\n shouldSkipStockCheck = true;\r\n } else {\r\n if (estimatedDate != \"\") {\r\n shouldSkipStockCheck = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\r\n ? undefined\r\n : _getErrorMessage(availableQuantityInStock, cartline.Quantity!, props, shouldSkipStockCheck, cartline, cartline.LineId);\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n\r\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n\r\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\r\n const inventoryCode = foundProductAvailability\r\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\r\n : undefined;\r\n const productDimension = 4;\r\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\r\n const isCustomPriceSelected =\r\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\r\n 'Custom';\r\n\r\n let productUrl: string | undefined;\r\n if (product) {\r\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\r\n\r\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\r\n const fullUrl = new URL(productUrl, window.location.href);\r\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\r\n productUrl = fullUrl.href;\r\n }\r\n } else {\r\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\r\n }\r\n\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n cartlineId: cartline.LineId,\r\n error: errorMessage,\r\n hasError: !shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false,\r\n cartline: (\r\n \r\n ),\r\n pickUpInStore: product\r\n ? PickUpInStore({\r\n storeSelectorModuleId,\r\n cartState: props.cartState,\r\n cartline,\r\n product,\r\n shipitText: props.shipItText,\r\n pickUpInStoreText: props.pickitUpText,\r\n changeStoreText: props.changeStoreText,\r\n storeSelectorStateManager: props.storeSelectorStateManager,\r\n orgUnitLocations: props.orgUnitLocations,\r\n deliveryOptions: productPickUpOptions,\r\n pickupDeliveryModeCode:\r\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\r\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\r\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\r\n locationChangedHandler: props.locationChangedHandler\r\n })\r\n : undefined,\r\n remove: (\r\n \r\n ),\r\n addToWishlist:\r\n isAuthenticated && product && !isCustomPriceSelected ? (\r\n \r\n ) : (\r\n undefined\r\n ),\r\n addToOrderTemplate:\r\n isAuthenticated && orderTemplates && product ? (\r\n \r\n ) : (\r\n undefined\r\n )\r\n };\r\n};\r\n\r\nexport const assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[] | null => {\r\n const reactNodes: ICartlinesViewProps[] = [];\r\n\r\n cartlines.map((cartline, index) => {\r\n let product;\r\n if (props.isQuantityLimitsFeatureEnabled) {\r\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n // to check productId and WarehouseId for identification.\r\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n } else {\r\n product = getProductByProductId(cartline.ProductId, products);\r\n }\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n if (props.shouldIgnoreWarehouse) {\r\n return productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId;\r\n }\r\n return (\r\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\r\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\r\n );\r\n });\r\n }\r\n\r\n let productPickUpOptions;\r\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\r\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n * @param props\r\n */\r\nexport const CartLineItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return assembleCartlines(cartlines, products, props);\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport groupBy from 'lodash/groupBy';\r\n\r\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './citta-cart-line-items';\r\n\r\nconst _assembleGroupCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\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 const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\r\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\r\n const groupDelivery = getGroupByDelivery(cartlines);\r\n const cartLinesGroup: CartLine[] = [];\r\n\r\n // 1) Group by store and pick up mode\r\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\r\n // @ts-expect-error\r\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\r\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\r\n });\r\n\r\n // 2) Create cartlines group\r\n Object.keys(cartLinesGroup).forEach(key => {\r\n const cartLines = cartLinesGroup[key];\r\n Object.keys(cartLines).forEach(index => {\r\n const cartLine = cartLines[index];\r\n const carLineViewProps = assembleCartlines(cartLine, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n });\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\nconst _assembleGroupInvoiceCartlines = (\r\n cartLines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: ICartLineItemsProps\r\n): ICartlinesViewProps[][] | null => {\r\n const reactNodes: ICartlinesViewProps[][] = [];\r\n if (cartLines && cartLines.length > 0) {\r\n // Create invoice cartLines group\r\n const carLineViewProps = assembleCartlines(cartLines, products, props);\r\n if (carLineViewProps !== null) {\r\n reactNodes.push(carLineViewProps);\r\n }\r\n }\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLine Group component.\r\n * @param props\r\n */\r\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\r\n const { products, cartlines, hasInvoiceLine } = props;\r\n return hasInvoiceLine\r\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\r\n : _assembleGroupCartlines(cartlines, products, props);\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IPromotionData entity interface.\r\n */\r\nexport interface IPromotionData {\r\n promotionOptions?: CartPromotionLine[];\r\n}\r\n\r\n/**\r\n * Calls the Retail API and returns a promotion data.\r\n * @param ctx\r\n */\r\nexport async function getPromotionData(ctx: IActionContext): Promise {\r\n const promotionData: IPromotionData = {};\r\n\r\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(promotionOptions => {\r\n if (promotionOptions) {\r\n promotionData.promotionOptions = promotionOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n return {};\r\n });\r\n\r\n return promotionData;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n IAddToOrderTemplateDialogResources,\r\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\r\n IItemAddedToOrderTemplateDialogResources,\r\n ILinesAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources,\r\n IWishlistActionSuccessResult,\r\n PromoCodeComponent,\r\n SaveCartToOrderTemplateComponent\r\n} from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync, IImageSettings, isChannelTypeB2B, isOboRequest } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport {\r\n ActiveCartProductsInput,\r\n ArrayExtensions,\r\n getActiveCartProductsAction,\r\n ICartLineInventoryValidationResult,\r\n ObjectExtensions,\r\n ProductPickUpOptionsForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Alert,\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n INodeProps,\r\n IPayLoad,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n Waiting,\r\n updateMaxQuantityForCartLineItem,\r\n urlCheck\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-citta-cartlines';\r\n\r\nimport { ICittaCartData } from './citta-cart.data';\r\nimport { ICittaCartProps, ICittaCartResources } from './citta-cart.props.autogenerated';\r\nimport { CartLineGroupItems } from './components/citta-cart-line-groups';\r\nimport { CartLineItems, ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { cartPromotions, ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-citta-cart';\r\n\r\nimport { validateCartLinesInventory } from './components/hso-validate-cartlines-inventory';\r\n/**\r\n * Cart view props interface.\r\n */\r\nexport interface ICartViewProps extends ICittaCartProps {\r\n className: string;\r\n title?: React.ReactNode;\r\n CartlinesWrapper: INodeProps;\r\n cartlines?: ICartlinesViewProps[];\r\n cartLinesGroup?: ICartlinesViewProps[][];\r\n cart: ICartState | undefined;\r\n orderSummaryHeading: React.ReactNode;\r\n orderSummaryLineitems?: IOrderSummaryLines;\r\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\r\n OrderSummaryWrapper: INodeProps;\r\n OrderSummaryItems: INodeProps;\r\n OrderSummaryErrors?: IOrderSummaryErrors;\r\n checkoutAsGuestButton: React.ReactNode;\r\n checkoutAsSignInUserButton: React.ReactNode;\r\n storeSelector?: React.ReactNode;\r\n expressCheckoutButton?: React.ReactNode[];\r\n ExpressCheckoutSectionWrapper: INodeProps;\r\n backToShoppingButton: React.ReactNode;\r\n waitingComponent: React.ReactNode;\r\n promotionOptions?: ICartLineItemViewProps;\r\n promoCode: React.ReactNode;\r\n cartLoadingStatus: string;\r\n cartDataResult: boolean;\r\n multiplePickUpEnabled?: boolean;\r\n createTemplateFromCartButton: React.ReactNode;\r\n telemetryContent?: ITelemetryContent;\r\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\r\n}\r\n\r\n/**\r\n * Order summary errors interface.\r\n */\r\nexport interface IOrderSummaryErrors {\r\n Wrapper: INodeProps;\r\n header: React.ReactNode;\r\n errors: React.ReactNode[];\r\n}\r\n\r\n/**\r\n * Cart component state interface.\r\n */\r\ninterface ICartComponentState {\r\n showPromotionDialog: boolean;\r\n cartlinesErrors: CartLineValidationResultsByLineId;\r\n promotionData: IPromotionData;\r\n isCartValid: boolean;\r\n productPickUpOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\n/**\r\n * Cart component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass Cart extends React.Component> {\r\n public state: ICartComponentState;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n private _isMounted: boolean = false;\r\n\r\n private readonly promotionPopupId: string = 'cart-promotion-popup';\r\n\r\n public constructor(props: ICittaCartProps) {\r\n super(props);\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.payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\r\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\r\n\r\n this.state = {\r\n showPromotionDialog: false,\r\n promotionData: {},\r\n isCartValid: true,\r\n productPickUpOptions: undefined,\r\n cartlinesErrors: {}\r\n };\r\n }\r\n\r\n /**\r\n * Component did mount function.\r\n */\r\n public async componentDidMount(): Promise {\r\n this._isMounted = true;\r\n const {\r\n config,\r\n context: { actionContext }\r\n } = this.props;\r\n\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this.validateCart();\r\n }\r\n\r\n if (config.showAvailablePromotions) {\r\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n this.setState({ promotionData: await getPromotionData(actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n if (this._isMounted) {\r\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\r\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Component will unmount function.\r\n */\r\n public componentWillUnmount(): void {\r\n this._isMounted = false;\r\n }\r\n\r\n /**\r\n * Should component update function.\r\n * @param nextProps - Next props.\r\n * @param nextState - Next state.\r\n * @returns True if component should update, false otherwise.\r\n */\r\n public shouldComponentUpdate(nextProps: ICittaCartProps, nextState: ICartComponentState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /* eslint-disable complexity -- Disabling complexity for render method */\r\n public render(): JSX.Element | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n products: { result: products }\r\n },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\r\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n const cartLines = this._getCartLines();\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n\r\n \r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n\r\n const validInventoryAcrossCartLines = validateCartLinesInventory(\r\n cart?.cart.CartLines ?? [],\r\n this.props.data.productAvailabilites.result ?? [],\r\n this.props.context.actionContext,\r\n products ?? [],\r\n emailDeliveryModeCode,\r\n HSOConfig\r\n );\r\n\r\n let hasError =\r\n !validInventoryAcrossCartLines?.isValid ||\r\n this._isCheckoutBlockedDueToUnavailableFunds() ||\r\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\r\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\r\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\r\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\r\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n\r\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\r\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\r\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\r\n for (const cartLineGroup of cartLinesGroup) {\r\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\r\n }\r\n }\r\n\r\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\r\n }\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('ms-cart'),\r\n title:

{resources.cartTitle}

,\r\n cart: this.props.data.cart.result,\r\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\r\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\r\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\r\n cartlines: cartLines,\r\n cartLinesGroup,\r\n promoCode: this._getPromoCode(),\r\n promotionOptions: this._getPromotions(),\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry: this.props.telemetry,\r\n id: this.props.id,\r\n multiplePickUpEnabled,\r\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\r\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\r\n cart?.hasInvoiceLine ? (\r\n

{resources.invoiceSummaryTitle}

\r\n ) : (\r\n

{resources.orderSummaryTitle}

\r\n )\r\n ) : null,\r\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\r\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\r\n checkoutAsSignInUserButton: !isCartEmpty ? (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n ) : null,\r\n checkoutAsGuestButton:\r\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n ) : null,\r\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\r\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\r\n backToShoppingButton: (\r\n \r\n {resources.backToShoppingButtonTitle}\r\n \r\n ),\r\n createTemplateFromCartButton:\r\n this._displayAddCartToTemplate() && products ? (\r\n \r\n ) : null,\r\n checkoutBlockedDueToUnavailableFunds: this._isCheckoutBlockedDueToUnavailableFunds() ? (\r\n \r\n \r\n \r\n {resources.checkoutBlockedDueToUnavailableFundsTitle}\r\n {resources.checkoutBlockedDueToUnavailableFundsMessage}\r\n \r\n \r\n ) : null,\r\n storeSelector:\r\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n waitingComponent: ,\r\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\r\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\r\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\r\n telemetryContent: this.telemetryContent\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n /* eslint-enable complexity -- Disabling complexity for render method */\r\n\r\n /**\r\n * Promotion click event handler.\r\n * @param event - The mouse event.\r\n */\r\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\r\n this.setState({\r\n showPromotionDialog: !this.state.showPromotionDialog\r\n });\r\n };\r\n\r\n /**\r\n * Promotion close button click.\r\n */\r\n private readonly promotionCloseButtonclick = () => {\r\n this._hidePromotionDialog();\r\n };\r\n\r\n /**\r\n * Hide promotion dialog.\r\n */\r\n private _hidePromotionDialog(): void {\r\n this.setState({\r\n showPromotionDialog: false\r\n });\r\n }\r\n\r\n /**\r\n * Display add to cart template.\r\n * @returns True if should display, false otherwise.\r\n */\r\n private _displayAddCartToTemplate(): boolean {\r\n const cart = this.props.data.cart?.result;\r\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\r\n return false;\r\n }\r\n\r\n if (\r\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\r\n this.props.data.orderTemplates.result &&\r\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\r\n this.props.data.customerInformation.result\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get promotions.\r\n * @returns React node with the promotions.\r\n */\r\n private _getPromotions(): React.ReactNode {\r\n return (\r\n this.props.config.showAvailablePromotions &&\r\n cartPromotions({\r\n id: this.promotionPopupId,\r\n showPromotionPopup: this.state.showPromotionDialog,\r\n onSeeAllClick: this.promotionLinkClick,\r\n onCloseButtonClick: this.promotionCloseButtonclick,\r\n promotions: this.state.promotionData.promotionOptions,\r\n resources: {\r\n promotionStringHeading: this.props.resources.promotionStringHeading,\r\n promotionLinkText: this.props.resources.promotionLinkText,\r\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\r\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Add error message in cart line in case the quantity exceeds the current inventory.\r\n * @param cartLines - The cart lines.\r\n * @param cartLineInventoryValidationResult - The cart line inventory result.\r\n */\r\n private _updateCartLineErrorForInvalidInventory(\r\n cartLines: ICartlinesViewProps[] | null,\r\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\r\n ) {\r\n const { resources } = this.props;\r\n\r\n if (\r\n ArrayExtensions.hasElements(cartLines) &&\r\n !cartLineInventoryValidationResult.isValid &&\r\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\r\n ) {\r\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\r\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\r\n if (cartLine) {\r\n cartLine.error = resources.outOfStockErrorMessage;\r\n cartLine.hasError = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get order summary errors.\r\n * @param cartLines - The cart lines.\r\n * @returns Order summary errors.\r\n */\r\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\r\n const allErrors =\r\n (cartLines &&\r\n cartLines\r\n .map(cartline => {\r\n // Check if the product is service or not by product type\r\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n if (!isServiceItem && cartline.error) {\r\n const fullError =\r\n cartline.data && cartline.data.product?.Name\r\n ? `${cartline.data.product.Name}: ${cartline.error}`\r\n : cartline.error;\r\n\r\n return (\r\n
\r\n {fullError}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n })\r\n .filter((line): line is JSX.Element => !!line)) ||\r\n [];\r\n\r\n return {\r\n Wrapper: {\r\n tag: Alert,\r\n className: 'msc-alert',\r\n isOpen: allErrors.length > 0,\r\n color: 'danger',\r\n assertive: true,\r\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\r\n },\r\n header: (\r\n \r\n ),\r\n errors: allErrors\r\n };\r\n }\r\n\r\n private _isCheckoutBlockedDueToUnavailableFunds(): boolean {\r\n if (isOboRequest(this.props.context.request)) {\r\n const customerInfo = this.props.data.customerInformation && this.props.data.customerInformation?.result;\r\n return !!customerInfo && (!customerInfo.AllowOnAccountPayment || customerInfo.CreditLimit === 0);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets invoice summary line items.\r\n * @returns Invoice summary lines.\r\n */\r\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n return cart?.hasInvoiceLine\r\n ? InvoiceSummary({\r\n orderTotalLabel: resources.totalAmountLabel,\r\n invoiceLabel: resources.invoiceLabel,\r\n cart: cart.cart,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n telemetry,\r\n id: this.props.id\r\n })\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Gets order summary line items.\r\n * @returns Order summary lines.\r\n */\r\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n channelDeliveryOptionConfig\r\n },\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n const featureState = this.props?.data?.featureState;\r\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\r\n ?.IsEnabled;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\r\n\r\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\r\n ? OrderSummary({\r\n cart: cart!.cart,\r\n subTotalLabel: resources.itemsWithCountLabel,\r\n shippingLabel: resources.estimatedShippingLabel,\r\n otherChargeLabel: resources.otherCharges,\r\n taxLabel: resources.estimatedTaxLabel,\r\n orderTotalLabel: resources.orderTotal,\r\n totalDiscountsLabel: resources.totalDiscountsLabel,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n toBeCalculatedText: resources.yetToBeCalculatedText,\r\n freeText: resources.priceFree,\r\n channelConfiguration,\r\n retailMultiplePickUpOptionEnabled,\r\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\r\n telemetry,\r\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\r\n isShowTaxBreakup: isShowOrHideTaxEnabled\r\n })\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Gets promo code.\r\n * @returns React node with the promo code.\r\n */\r\n private _getPromoCode(): React.ReactNode {\r\n const {\r\n data: {\r\n cart: { result: cart }\r\n },\r\n resources\r\n } = this.props;\r\n\r\n return (\r\n cart && (\r\n \r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Generate add to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IAddToOrderTemplateDialogResources.\r\n */\r\n private _generateAddToOrderTemplateDialogResources(resources: ICittaCartResources): 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\n /**\r\n * Generate item added to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IItemAddedToOrderTemplateDialogResources.\r\n */\r\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICittaCartResources): 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.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n /**\r\n * Generate lines added to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns ILinesAddedToOrderTemplateDialogResources.\r\n */\r\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICittaCartResources): ILinesAddedToOrderTemplateDialogResources {\r\n return {\r\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\r\n continueShoppingButtonText: resources.continueShoppingButtonText,\r\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\r\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\r\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\r\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\r\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\r\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\r\n };\r\n }\r\n\r\n /**\r\n * Generate duplicate items when adding to order template dialog resources.\r\n * @param resources - The resources.\r\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\r\n */\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources: ICittaCartResources\r\n ): 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\n /**\r\n * Generate order template name dialog resources.\r\n * @param resources - The resources.\r\n * @returns IOrderTemplateNameDialogResources.\r\n */\r\n private _generateOrderTemplateNameDialogResources(resources: ICittaCartResources): 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\n /**\r\n * Gets the cart lines view props.\r\n * @returns ICartlinesViewProps [].\r\n */\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this.getImageSettings(config.imageSettings);\r\n\r\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\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 const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n\r\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\r\n ? CartLineItems({\r\n cartlines: cart!.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n catalogs: this.props.data.catalogs?.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\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 retailMulitplePickupFeatureState: multiplePickUpEnabled,\r\n resources: {\r\n sizeString: \"Size:\" || resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n priceEditorResources: {\r\n ...resources\r\n }\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\r\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n productAvailability: this.props.data.productAvailabilites,\r\n hsoConfig: HSOConfig\r\n })\r\n : null;\r\n }\r\n\r\n /**\r\n * Gets the checkout URL.\r\n * @param isAuthenticated - Is authenticated flag.\r\n * @param guestCheckoutUrl - Guest checkout URL.\r\n * @param signInUrl -The sign in URL.\r\n * @returns The checkout URL.\r\n */\r\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n /**\r\n * Gets the image settings.\r\n * @param imageSettings - Image settings.\r\n * @returns IImageSettings.\r\n */\r\n private readonly 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 /**\r\n * Remove item from citta-cart handler.\r\n * @param cartlineToRemove - The cart line to remove.\r\n */\r\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result\r\n .removeCartLines(input)\r\n .then(() => {\r\n this.validateCart().catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Move to wish list handler.\r\n * @param result - The wish list action success result.\r\n * @param cartline - The cart line.\r\n */\r\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this.removeItemFromCartHandler(cartline);\r\n }\r\n };\r\n\r\n /**\r\n * Updates the cart line quantity.\r\n * @param cartlineToUpdate - The cart line.\r\n * @param quantity - The quantity.\r\n * @param lineIndex - The line index.\r\n * @returns True if the cart line was updated, false otherwise.\r\n */\r\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\r\n cartLineQuantityUpdatedAsync(\r\n this.isQuantityLimitsFeatureEnabled,\r\n this.props.data.cart.result,\r\n this.props.telemetry,\r\n this.props.data.products.result,\r\n cartlineToUpdate,\r\n quantity\r\n )\r\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\r\n if (cartActionResult?.status === 'SUCCESS') {\r\n this.validateCart().catch(error => {\r\n this.props.telemetry.warning((error as Error).message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n\r\n return true;\r\n }\r\n\r\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\r\n // Show update line error message.\r\n const lineUpdateFailure: LineValidationResult = {\r\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\r\n ValidationFailures: [\r\n {\r\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\r\n ? cartActionResult.validationResults[0].ErrorContext\r\n : '',\r\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\r\n }\r\n ]\r\n };\r\n\r\n this.setState({\r\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\r\n });\r\n }\r\n\r\n return false;\r\n })\r\n .catch(() => {\r\n return false;\r\n });\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * Fulfillment store id is updated.\r\n */\r\n private readonly fulfillmentStoreIdUpdated = () => {\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n // Refresh products (in props.data) based on latest cart.\r\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\r\n .then(async () => this.validateCart())\r\n .catch((error: Error) => {\r\n this.props.telemetry.warning(error.message);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Validates cart.\r\n * @returns Void promise.\r\n */\r\n private async validateCart(): Promise {\r\n const {\r\n data: { cart },\r\n telemetry,\r\n context\r\n } = this.props;\r\n\r\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(\r\n // this.isQuantityLimitsFeatureEnabled, //version upgrade commented the line as this is not part of validateCartAsync method\r\n cart,\r\n telemetry,\r\n context,\r\n true\r\n );\r\n\r\n const HSOConfigprop = this.props.data.channelConfiguration.result\r\n && this.props.data.channelConfiguration.result.ExtensionProperties\r\n && this.props.data.channelConfiguration.result!.ExtensionProperties.find((property => property.Key === 'HSOConfig'));\r\n\r\n let HSOConfig = HSOConfigprop && HSOConfigprop.Value && HSOConfigprop.Value.IntegerValue;\r\n if (HSOConfig == undefined) {\r\n HSOConfig = 0;\r\n }\r\n if (HSOConfig) {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n if (validationResults) {\r\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\r\n this.setState({\r\n cartlinesErrors: validationResults,\r\n isCartValid: isValid\r\n });\r\n } else {\r\n this.setState({ isCartValid: true });\r\n }\r\n\r\n return AsyncResult.resolve();\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the cart lines group.\r\n * @returns ICartlinesViewProps [][].\r\n */\r\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this.getImageSettings(config.imageSettings);\r\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\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 const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n );\r\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\r\n\r\n return this.props.data.products &&\r\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\r\n cart &&\r\n cart.cart.CartLines &&\r\n cart.cart.CartLines.length > 0 &&\r\n this.props.data.channelDeliveryOptionConfig?.result\r\n ? CartLineGroupItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n catalogs: this.props.data.catalogs?.result,\r\n imageSettings,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n hasInvoiceLine: cart?.hasInvoiceLine || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\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 amountString: resources.productDimensionTypeAmount,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n priceEditorResources: {\r\n ...resources\r\n }\r\n },\r\n telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this.removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\r\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\r\n wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\r\n resources\r\n ),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates,\r\n customerInformation,\r\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\r\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\r\n productAvailability: this.props.data.productAvailabilites,\r\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result\r\n })\r\n : null;\r\n }\r\n}\r\n\r\nexport default Cart;\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 { IActionContext } from '@msdyn365-commerce/core';\r\nimport { CartLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport { ArrayExtensions, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\n/**\r\n * Cart line inventory validation result interface.\r\n */\r\nexport interface ICartLineInventoryValidationResult {\r\n /**\r\n * Define whether the cart lines inventory is valid across multiple cart lines.\r\n */\r\n readonly isValid: boolean;\r\n\r\n /**\r\n * Defines the list of product id with invalid inventory.\r\n */\r\n readonly productIdWithErrors: number[];\r\n}\r\n\r\n/**\r\n * Validates inventory across cart lines.\r\n * @param cartLines - The cart lines.\r\n * @param productAvailabilities - The product availability collection.\r\n * @param actionContext - The action context.\r\n * @param products - The products.\r\n * @param emailDeliveryModeCode - The emailDeliveryModeCode.\r\n * @returns True if all product quantity are available, false otherwise.\r\n */\r\n// eslint-disable-next-line complexity -- existing code.\r\nexport function validateCartLinesInventory(\r\n cartLines: CartLine[],\r\n productAvailabilities: IProductInventoryInformation[],\r\n actionContext: IActionContext,\r\n products?: SimpleProduct[],\r\n emailDeliveryModeCode?: string | undefined,\r\n hsoConfig?: number\r\n): ICartLineInventoryValidationResult {\r\n const cartLineMap = new Map();\r\n const defaultCartLineQuantity = 1;\r\n if (!actionContext.requestContext.app.config.enableStockCheck) {\r\n return {\r\n isValid: true,\r\n productIdWithErrors: []\r\n };\r\n }\r\n const productIdWithErrors = [];\r\n let isValid = true;\r\n\r\n if (ArrayExtensions.hasElements(cartLines) && ArrayExtensions.hasElements(productAvailabilities)) {\r\n // Consolidate products in different cart lines into single entry with the total cart quantity\r\n for (const cartLine of cartLines) {\r\n // Skip validation if is an invoice inline.\r\n if (cartLine.ProductId && !cartLine.IsInvoiceLine && !cartLine.IsGiftCardLine) {\r\n if (!cartLineMap.has(cartLine.ProductId)) {\r\n cartLineMap.set(cartLine.ProductId, cartLine.Quantity ?? defaultCartLineQuantity);\r\n } else {\r\n const cartLineTotal = cartLineMap.get(cartLine.ProductId) ?? 0;\r\n cartLineMap.delete(cartLine.ProductId);\r\n cartLineMap.set(cartLine.ProductId, cartLineTotal + (cartLine.Quantity ?? defaultCartLineQuantity));\r\n }\r\n }\r\n }\r\n\r\n // Hashing product availability object by product ID.\r\n const productAvailabilityMap = new Map();\r\n for (const productAvailability of productAvailabilities) {\r\n if (\r\n productAvailability.ProductAvailableQuantity.ProductId &&\r\n !productAvailabilityMap.has(productAvailability.ProductAvailableQuantity.ProductId)\r\n ) {\r\n productAvailabilityMap.set(productAvailability.ProductAvailableQuantity.ProductId, productAvailability);\r\n }\r\n }\r\n\r\n // Compare total quantity with the available quantity from the inventory API, also validate that the product is available.\r\n for (const productId of Array.from(cartLineMap.keys())) {\r\n const cartLineQty = cartLineMap.get(productId) ?? defaultCartLineQuantity;\r\n const productAvailability = productAvailabilityMap.get(productId);\r\n const availableQuantity = productAvailability?.ProductAvailableQuantity.AvailableQuantity ?? undefined;\r\n\r\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n const cartLine = cartLines.find(line => line.ProductId === productId);\r\n const cartLineProduct = products?.find(product => product.RecordId === productId);\r\n let isStockedItem = true;\r\n if (cartLineProduct) {\r\n isStockedItem = !!cartLineProduct.Behavior?.IsStockedProduct;\r\n }\r\n const isEmailDelivery =\r\n cartLine?.DeliveryMode && cartLine.DeliveryMode !== '' ? cartLine.DeliveryMode === emailDeliveryModeCode : false;\r\n let shouldSkipInventoryCheck = !isStockedItem || isEmailDelivery;\r\n\r\n if (hsoConfig) {\r\n const estimatedDateProperty = availableQuantity\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'EstimatedDate'));\r\n\r\n const estimatedDateValue = estimatedDateProperty && estimatedDateProperty.Value && estimatedDateProperty.Value.StringValue;\r\n\r\n let estimatedDate = \"\";\r\n if (estimatedDateValue == undefined) {\r\n estimatedDate = \"\";\r\n } else {\r\n estimatedDate = estimatedDateValue.toString();\r\n }\r\n\r\n const StockThresholdprop = availableQuantity\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties\r\n && productAvailability?.ProductAvailableQuantity.ExtensionProperties.find((property => property.Key === 'StockThreshold'));\r\n const StockThresholdpropval = StockThresholdprop && StockThresholdprop.Value && StockThresholdprop.Value.IntegerValue;\r\n let StockThreshold = 0;\r\n if (StockThresholdpropval != undefined) {\r\n StockThreshold = StockThresholdpropval;\r\n }\r\n\r\n let onhand = 0;\r\n if (availableQuantity != undefined) {\r\n onhand = Number(availableQuantity);\r\n }\r\n\r\n if (StockThreshold == 0) {\r\n shouldSkipInventoryCheck = true;\r\n } else {\r\n if (onhand >= StockThreshold) {\r\n shouldSkipInventoryCheck = true;\r\n } else {\r\n if (estimatedDate != \"\") {\r\n shouldSkipInventoryCheck = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // If product is non-stocked or cartLine is electronic delivery, then no inventory check\r\n if (shouldSkipInventoryCheck) {\r\n continue;\r\n }\r\n if (!productAvailability?.IsProductAvailable || (availableQuantity && cartLineQty > availableQuantity)) {\r\n productIdWithErrors.push(productId);\r\n isValid = false;\r\n }\r\n }\r\n }\r\n return {\r\n isValid,\r\n productIdWithErrors\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ICartLineItemPromotion {\r\n id: string;\r\n showPromotionPopup: boolean;\r\n promotions: CartPromotionLine[] | undefined;\r\n resources: ICartLineItemPromotionResourceString;\r\n onSeeAllClick(event: React.MouseEvent): void;\r\n onCloseButtonClick(): void;\r\n}\r\n\r\nexport interface ICartLineItemViewProps {\r\n promotionMessageWrapper: INodeProps;\r\n promotionMessage: React.ReactNode;\r\n promotionSeeAllLink: React.ReactElement;\r\n promotionDialog: React.ReactNode;\r\n}\r\n\r\nexport interface ICartLineItemPromotionResourceString {\r\n promotionLinkText: string;\r\n promotionStringHeading: string;\r\n promotionPopupHeading: string;\r\n promotionCloseButtonAriaLabel: string;\r\n}\r\n\r\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\r\n const {\r\n id,\r\n showPromotionPopup,\r\n promotions,\r\n resources: { promotionLinkText, promotionPopupHeading },\r\n onCloseButtonClick,\r\n onSeeAllClick\r\n } = props;\r\n\r\n if (!ArrayExtensions.hasElements(promotions)) {\r\n return;\r\n }\r\n\r\n const titleId = `${id}_title`;\r\n const className = 'msc-cart__promotion';\r\n return {\r\n promotionMessageWrapper: {\r\n className: 'msc-cart__promotion'\r\n },\r\n promotionMessage: (\r\n <>\r\n \r\n {props.resources.promotionStringHeading}\r\n \r\n ),\r\n promotionSeeAllLink: (\r\n \r\n {` `}\r\n {promotionLinkText} {` `}\r\n \r\n ),\r\n promotionDialog: (\r\n \r\n \r\n
\r\n {promotionPopupHeading}\r\n
\r\n
\r\n \r\n
    \r\n {promotions.map(_promotion => {\r\n return (\r\n
  • \r\n {_promotion.Promotion?.OfferName} {` `}\r\n
  • \r\n );\r\n })}\r\n
\r\n
\r\n \r\n
\r\n )\r\n };\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartViewProps, IOrderSummaryErrors } from './citta-cart';\r\nimport { ICartlinesViewProps } from './components/citta-cart-line-items';\r\nimport { ICartLineItemViewProps } from './components/citta-cart-line-items-promotion';\r\n\r\nconst _renderCartlines = (\r\n cartLines: ICartlinesViewProps[] | undefined,\r\n cartEmptyText: string,\r\n CartlinesWrapper: INodeProps,\r\n storeSelector: React.ReactNode | undefined,\r\n backToShoppingButton: React.ReactNode,\r\n waitingComponent: React.ReactNode,\r\n cartLoadingStatus: string,\r\n cartDataResult: boolean\r\n): JSX.Element[] | JSX.Element => {\r\n if (cartLoadingStatus) {\r\n return <>{cartLoadingStatus};\r\n }\r\n if (cartLines) {\r\n return cartLines.map(cartLine => {\r\n return (\r\n
\r\n {cartLine.cartline}\r\n {storeSelector && cartLine.pickUpInStore ? (\r\n {cartLine.pickUpInStore.defaultComponent}\r\n ) : null}\r\n {cartLine.addToOrderTemplate ? (\r\n \r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n {cartLine.addToOrderTemplate}\r\n \r\n ) : (\r\n <>\r\n {cartLine.remove}\r\n {cartLine.addToWishlist}\r\n \r\n )}\r\n
\r\n );\r\n });\r\n }\r\n return cartDataResult ? (\r\n
\r\n

{cartEmptyText}

\r\n {backToShoppingButton}\r\n
\r\n ) : (\r\n <>{waitingComponent}\r\n );\r\n};\r\n\r\n/**\r\n * Method will render error block.\r\n * @param errorData -The order summary errors interface.\r\n * @returns Jsx element.\r\n */\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\r\n return null;\r\n }\r\n return (\r\n \r\n {\"Please review cart errors before proceeding to checkout\"}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render invoice summary lines.\r\n * @param invoiceSummaryLines -The invoicesummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderInvoiceSummarylines = (\r\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!invoiceSummaryLines) {\r\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {invoiceSummaryLines.invoices}\r\n {invoiceSummaryLines.giftCard}\r\n {invoiceSummaryLines.loyalty}\r\n {invoiceSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render order summary lines.\r\n * @param orderSummaryLines -The ordersummary lines interface.\r\n * @param OrderSummaryItems -The order summary items props.\r\n * @param props -The cartview props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderOrderSummarylines = (\r\n orderSummaryLines: IOrderSummaryLines | undefined,\r\n OrderSummaryItems: INodeProps,\r\n props: ICartViewProps\r\n): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\r\n return null;\r\n }\r\n return (\r\n \r\n {props.promoCode}\r\n {orderSummaryLines.subtotal}\r\n {orderSummaryLines.shipping}\r\n {orderSummaryLines.otherCharge}\r\n {orderSummaryLines.tax}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.orderTotal}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cart promotions.\r\n * @param promotions -The cartline item view props.\r\n * @returns Jsx element.\r\n */\r\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\r\n return (\r\n <>\r\n \r\n {promotions.promotionMessage}\r\n {promotions.promotionSeeAllLink}\r\n {promotions.promotionDialog}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines group title.\r\n * @param cartLine -The cartline view props.\r\n * @param titleSeparate -The title separate.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n return (\r\n <>\r\n \r\n {isBopisSelected ? (\r\n

\r\n {cartLine.pickUpInStore?.deliveryOption}\r\n {titleSeparate}\r\n {cartLine.pickUpInStore?.orgUnitName}\r\n

\r\n ) : null}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines groups header title.\r\n * @param pickUpText -The pickup text for group.\r\n * @param shippingText -The shipping text for group.\r\n * @param emailShippingText -The email shipping text for group.\r\n * @param titleSeparate -The title separator.\r\n * @param cartLine -The cartline view props.\r\n * @param emailDeliveryModeCode -The email delivery code from channel.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroupHeader = (\r\n pickUpText: string,\r\n shippingText: string,\r\n emailShippingText: string,\r\n titleSeparate: string,\r\n cartLine: ICartlinesViewProps,\r\n emailDeliveryModeCode?: string\r\n) => {\r\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\r\n let groupTitle: string;\r\n\r\n groupTitle = isBopisSelected ? pickUpText : shippingText;\r\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\r\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n

\r\n

{groupTitle}

\r\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\r\n
\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Method will render cartlines in groups.\r\n * @param props -The cartline.\r\n * @returns Jsx element.\r\n */\r\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\r\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\r\n return (\r\n
\r\n {props.cartLinesGroup.map(cartlines => {\r\n return (\r\n
\r\n {renderCartLinesGroupHeader(\r\n props.resources.pickUpText,\r\n props.resources.shippingText,\r\n props.resources.emailshippingText,\r\n props.resources.titleSeparate,\r\n cartlines[0],\r\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\r\n )}\r\n {_renderCartlines(\r\n cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n return props.cartDataResult ? (\r\n
\r\n
\r\n

{props.resources.emptyCartText}

\r\n {props.backToShoppingButton}\r\n
\r\n
\r\n ) : (\r\n <>{props.waitingComponent}\r\n );\r\n};\r\n\r\nconst CartView: React.FC = (props: ICartViewProps) => (\r\n
\r\n {props.checkoutBlockedDueToUnavailableFunds}\r\n {props.title}\r\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\r\n {props.multiplePickUpEnabled ? (\r\n renderCartLinesGroup(props)\r\n ) : (\r\n \r\n {_renderCartlines(\r\n props.cartlines,\r\n props.resources.emptyCartText,\r\n props.CartlinesWrapper,\r\n props.storeSelector,\r\n props.backToShoppingButton,\r\n props.waitingComponent,\r\n props.cartLoadingStatus,\r\n props.cartDataResult\r\n )}\r\n \r\n )}\r\n {props.orderSummaryHeading && (\r\n \r\n {props.orderSummaryHeading}\r\n {props.cart?.hasInvoiceLine\r\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\r\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\r\n {_renderErrorBlock(props.OrderSummaryErrors)}\r\n {props.checkoutAsSignInUserButton}\r\n {props.checkoutAsGuestButton}\r\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\r\n {props.expressCheckoutButton}\r\n ) : null}\r\n {props.backToShoppingButton}\r\n {props.createTemplateFromCartButton}\r\n \r\n )}\r\n {props.storeSelector}\r\n
\r\n);\r\n\r\nexport default CartView;\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 * ICittaSearchResultContainer 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 one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport const enum expandedMenusOnLoad {\r\n none = 'none',\r\n first = 'first',\r\n all = 'all'\r\n}\r\n\r\nexport interface ICittaSearchResultContainerConfig extends Msdyn365.IModuleConfig {\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 expandedMenusOnLoad?: expandedMenusOnLoad;\r\n refinersToBeHidden?: string;\r\n refinersToBeUpdated?: string;\r\n tagsToIgnore?: string;\r\n salesLineTagKey?: string;\r\n}\r\n\r\nexport interface ICittaSearchResultContainerResources {\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 ICittaSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: ICittaSearchResultContainerResources;\r\n config: ICittaSearchResultContainerConfig;\r\n}\r\n","import * 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\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 { ICittaSearchResultContainerResources } from '../citta-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: ICittaSearchResultContainerResources;\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\r\n return (\r\n\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\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 { ICittaSearchResultContainerResources } from '../citta-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: ICittaSearchResultContainerResources;\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}","import * 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","import * as React from 'react';\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => ( {separator} );","import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\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 dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer;\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(\r\n (refinementCriterion: ProductRefinerValue) => 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 refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) || refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): 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: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\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: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || 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 ((itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text || itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\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): 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}","import { 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 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 }\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 = 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('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\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('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\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 {validationErrorMin}\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n {validationErrorMax}\r\n }\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\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);\r\n const maxPrice = this._formatPrice(max);\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 { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = 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 { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = 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(selected: string | undefined, touched: boolean, validationError: string | undefined): 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 () => {\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}","import { getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } 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 { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\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\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 // @ts-ignore\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(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n 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(value => value.DataTypeValue === productRefinerValue.DataTypeValue);\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 {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n return (\r\n
  • \r\n \r\n \r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: 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 if (productRefinerValue) {\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 () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\r\n );\r\n }\r\n }\r\n}","import { 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 } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
    \r\n {items.length > 0 && label && {label}}\r\n
      \r\n {items.map((item: IRefinerMap, index: number) => {\r\n const listItemProps = {\r\n 'aria-posinset': index,\r\n 'aria-setsize': items.length\r\n };\r\n\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
    • \r\n \r\n {item.key}\r\n \r\n \r\n
    • \r\n );\r\n })}\r\n
    \r\n {items.length > 0 && clearAllText && {clearAllText}}\r\n
    \r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', refinerValueName);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n 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\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\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(selected => (itemClicked.innerText && itemClicked.innerText.trim()) === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","import {\r\n Button,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle():void;\r\n className: string\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\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 (\r\n \r\n {props.resources.modalTitle}\r\n \r\n );\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\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\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 { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\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 } 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 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\r\n if((productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) && (this.props.context.app.config.hideRating)) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context } = this.props;\r\n const isSingleSelect = (productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect) && (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating);\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId))}\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 (productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars) {\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 { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = 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 ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;","import * 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. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {ArrayExtensions, getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getTelemetryObject, ILabeledDropdownOnChangeNotification, ILabeledDropdownOption, IModuleProps, INodeProps, ITelemetryContent, LabeledDropdown, UncontrolledPagination } 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 { format, ProductPrice,ProductRefinerValue, ProjectionDomain, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n getActivePricesAsync\r\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { AffiliationLoyaltyTier, CustomerAffiliation } 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 { buildListPageUrl, getCollectionProducts, getCurrentUrl, GetFullProductsByCollectionInput, parseQueryParam, sortOptions } from './actions';\r\nimport { ICittaSearchResultContainerData } from './citta-search-result-container.data';\r\nimport { expandRefinersCount, ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport {\r\n ErrorMessage, FeatureSearchResultItem, getUpdatedRefinementCriteria, IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultModalViewProps, isMatchingRefinementCriterion,Link, ModalToggle, ProductSearchResultItems, SearchResultModal, Separator, Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\n\r\nexport interface ISearchResultContainerViewProps extends ICittaSearchResultContainerProps {\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 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 toggleModal: Function;\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, 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 { 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: ICittaSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport = 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 {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = 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(this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry);\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 = this.props.context.request.query && (+this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) || 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 [listPageState.activeFilters && listPageState.activeFilters.length, listPageState.currentPageNumber, listPageState.sortingCritera && listPageState.sortingCritera.Columns && listPageState.sortingCritera.Columns.length];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n { Paging: { Top: this.props.config.itemsPerPage, Skip: Math.max((listPageState.pageSize * (listPageState.currentPageNumber || 0)), 0) }, count: true, Sorting: listPageState.sortingCritera || {} },\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 ? this.props.context.request.query.q : this.props.context.request.query?.productId,\r\n this.props && this.props.config && this.props.config.includeAttributes !== undefined && this.props.config.includeAttributes === true ? true : 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 this._getActivePrice().catch(ex=> {throw ex;});\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 }\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 &&\r\n 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 }\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: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? this._getSortingDropDown(): 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: this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ?\r\n (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && (\r\n \r\n ),\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: this.props.data.listPageState.result && (this.props.data.listPageState.result.featureProduct !== null && this.props.data.listPageState.result.featureProduct !== undefined) ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n toggleModal: this._toggleModal\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 = { ChannelId: this.props.context.request.apiSettings.channelId, CatalogId: this.props.context.request.apiSettings.catalogId };\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 = { AffiliationId: affliation.RetailAffiliationId, CustomerId: customer.AccountNumber };\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 ).then((activePricesResponse:ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(activePrice.BasePrice || 0, activePrice.TradeAgreementPrice || 0, activePrice.AdjustedPrice || 0);\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 }).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(`[get Affiliation based price on search result container ]Error executing action`);\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 {\r\n resources:{\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n className: \"tetete\",\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 = (data.category.result && 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 = productCountNumber !== 1 ? format(this.props.resources.numberOfProducts, productCountNumber) : 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 }\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 && categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n\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\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 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 = 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={<div className='msc-pagination__prev'><span className='ms-search-result__pagination-left' aria-hidden='true'/><span className='prev-text'>{previousText}</span></div>}\r\n nextText={<div className='msc-pagination__next'><span className='next-text'>{nextText}</span><span className='ms-search-result__pagination-right' aria-hidden='true'/></div>}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\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 = data.refiners.result && 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 = validRefiners && 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 />\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\r\n private _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-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 />\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 ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), undefined, [this._getSortColumnFromSelectedOption(notification.selectedOption)], undefined));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = { Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)] };\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) => { return searchConfiguration.key === option.key; });\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 (mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName) &&\r\n (mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending);\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\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters || []);\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(itemToggleNotification, this.props.data.listPageState.result.activeFilters || []);\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 },\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.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n }\r\n\r\n}\r\n","import { IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Types of product refiner values\r\n */\r\nexport const enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price\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 */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners\r\n */\r\nexport const enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n */\r\nexport const 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 * 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(\r\n (refinementCriterion: ProductRefinerValue) => 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 (refinementCriterion.DataTypeValue === ProductRefinerValueDataTypeValue.Range ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]): 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: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || selectedCriterion.RightValueBoundString,\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\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: itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}` || itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString: itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}` || 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 ((itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.List || itemToggleNotification.productRefinerValue.DataTypeValue === ProductRefinerValueDataTypeValue.Boolean) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) => isMatchingRefinementCriterion(child, criterion));\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): 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 }).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}","import { 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 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<IRangeRefineItemProps, IRangeRefineItemState> {\r\n private _formattedPriceReverseLookup: Map<string, string> = new Map();\r\n\r\n private minInput: React.RefObject<HTMLInputElement>;\r\n private maxInput: React.RefObject<HTMLInputElement>;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\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<HTMLInputElement>();\r\n this.maxInput = React.createRef<HTMLInputElement>();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || '0';\r\n const initialMax = 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('Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy');\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('{0}', (parentProductRefinerHierarchy.KeyName || ''));\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${validationErrorMin ? 'refine-submenu__input-range--error' : ''}`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${validationErrorMax ? 'refine-submenu__input-range--error' : ''}`;\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 <form className='ms-refine-submenu__input-range-refiner' {...formAttrs}>\r\n <label className={minLabelClassName}>\r\n {refineItemCommonProps.minLabel}\r\n <input\r\n className={minInputClassName}\r\n onChange={this._changeMin}\r\n onFocus={this._changeMin}\r\n onBlur={this._finishChangeMin}\r\n value={formattedSelectedMin}\r\n ref={this.minInput}\r\n />\r\n </label>\r\n <label className={maxLabelClassName}>\r\n {refineItemCommonProps.maxLabel}\r\n <input\r\n className={maxInputClassName}\r\n placeholder={formattedSelectedMax ? undefined : refineItemCommonProps.placeholderTextMax}\r\n onChange={this._changeMax}\r\n onFocus={this._changeMax}\r\n onBlur={this._finishChangeMax}\r\n value={formattedSelectedMax}\r\n ref={this.maxInput}\r\n />\r\n </label>\r\n {validationErrorMin &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-min-error-text'>{validationErrorMin}</span>\r\n }\r\n {validationErrorMax && validationErrorMin !== validationErrorMax &&\r\n <span className='ms-refine-submenu__input-range-error-text refine-submenu__input-range-max-error-text'>{validationErrorMax}</span>\r\n }\r\n </form>\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, productRefinerValue, parentProductRefinerHierarchy, selectedRefinementCriterion } = this.props;\r\n const min = productRefinerValue.LeftValueBoundString;\r\n const max = productRefinerValue.RightValueBoundString;\r\n const selectedMin = selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString || productRefinerValue.LeftValueBoundString || '0';\r\n const selectedMax = selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString || productRefinerValue.RightValueBoundString || max;\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);\r\n const maxPrice = this._formatPrice(max);\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n\r\n return (\r\n <Slider\r\n className={'ms-refine-submenu__range-refiner'}\r\n key={sliderId}\r\n id={sliderId}\r\n inForm={false}\r\n min={min && Number(min) || undefined}\r\n max={max && Number(max) || undefined}\r\n step={1}\r\n orientation={'horizontal'}\r\n labels={[\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ]}\r\n showLabels={true}\r\n showTooltip={true}\r\n sliderThumbs={[\r\n {\r\n id: `${sliderId}_slider_thumb_start`,\r\n value: selectedMin && Number(selectedMin) || 0,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ]}\r\n onChangeEnd={this._onRangeUpdateEnd}\r\n onChange={debounce(this._onRangeUpdate, 500)}\r\n handleTooltipText={this._handleRangeTooltipText}\r\n {...ariaAttributes}\r\n />\r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent<HTMLInputElement>): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent<HTMLInputElement>, 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<HTMLInputElement>): 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 { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = 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<HTMLInputElement>): 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 { onToggle, parentProductRefinerHierarchy, productRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = 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(selected: string | undefined, touched: boolean, validationError: string | undefined): 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 if (this.props.productRefinerValue!.LeftValueBoundString === '0' && this.props.productRefinerValue!.RightValueBoundString === '0') {\r\n return result.slice(2);\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);\r\n if (!!element) {\r\n setTimeout(\r\n () => {\r\n element.focus();\r\n },\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}","import { IRefineItemCommonProps, IRefineItemToggleNotification } from '@msdyn365-commerce-modules/search-result-container';\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 { ProductRefinerSource, ProductRefinerTypeValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties\r\n */\r\nexport interface IRefineItemProps {\r\n\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n keyId: number;\r\n context: ICoreContext;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): 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<IRefineItemProps, IRefineItemState> {\r\n private anchorType: React.RefObject<HTMLAnchorElement>;\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 }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n // @ts-ignore\r\n children,\r\n onToggle,\r\n context,\r\n keyId,\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(`[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`);\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\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 role = isSingleSelect ? 'radio' : undefined;\r\n itemTypeClassName = !!selectedRefinementCriterion ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n return (\r\n <li\r\n className='ms-refine-submenu-item'\r\n role='radio'\r\n aria-checked='false'\r\n id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n >\r\n <a\r\n href={this._getRefinerUrl()}\r\n aria-label={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundLocalizedString}`}\r\n onClick={this._onClick}\r\n >\r\n <RatingComponent\r\n avgRating={parseInt(productRefinerValue.LeftValueBoundString, 10)}\r\n ratingCount={productRefinerValue.LeftValueBoundLocalizedString ? productRefinerValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString}\r\n hideCount={false}\r\n readOnly={true}\r\n ariaLabel=''\r\n context={context}\r\n id={this.props.moduleId}\r\n typeName={this.props.moduleTypeName}\r\n data={{}}\r\n />\r\n <span className='refine-submenu-item__rating'>{productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}</span>\r\n </a>\r\n </li>\r\n );\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return (\r\n <li className='ms-refine-submenu-item' role={role} id={`${parentProductRefinerHierarchy.KeyName!}_${productRefinerValue.LeftValueBoundString}_${keyId}`}>\r\n <a\r\n key={!!selectedRefinementCriterion ? 'true' : 'false'}\r\n ref={this.anchorType}\r\n href={this._getRefinerUrl()}\r\n tabIndex={0}\r\n onClick={this._onClick}\r\n className={itemTypeClassName}\r\n role={inputType}\r\n aria-checked={!!selectedRefinementCriterion}\r\n {...attrs}\r\n >\r\n <span className='checkmark'/>\r\n <span className='ms-refine-submenu-item__label'>\r\n {productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}\r\n </span>\r\n </a>\r\n </li>\r\n );\r\n }\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy: 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<HTMLAnchorElement | HTMLInputElement>): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy: parentProductRefinerHierarchy,\r\n productRefinerValue: productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(\r\n () => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n },\r\n 0\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 { findMatchingRefinementCriterion, IRefineItemCommonProps, IRefineItemToggleNotification, RangeRefineItemType } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button, Collapse } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport RangeRefineItem from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { ProductRefinerTypeValue, ProductRefinerValueDataTypeValue } 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 sortingCriteraValues?: string[];\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 refinersToBeUpdated: string;\r\n onUpdateRefiners(notfication: Readonly<IRefineItemToggleNotification>): 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<IRefineSubmenuProps>}\r\n */\r\nclass RefineSubmenu extends React.Component<IRefineSubmenuProps, IRefineSubmenuState> {\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 let 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, refinersToBeUpdated } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n const refinersLists = refinersToBeUpdated && refinersToBeUpdated.split(',');\r\n let refinerName = productRefinerHierarchy.KeyName || '';\r\n refinersLists && refinersLists.map((refiners: string) => {\r\n if (refiners.split('|').length > 1 && refiners.split('|')[0].toLowerCase() === refinerName?.toLowerCase()) {\r\n refinerName = refiners.split('|')[1] && refiners.split('|')[1] || refinerName;\r\n }\r\n });\r\n\r\n return (\r\n <div className='ms-refine-submenu list-group'>\r\n <Button\r\n className={this.state.expanded ? 'ms-refine-submenu__toggle_expanded' : 'ms-refine-submenu__toggle_collapsed'}\r\n aria-label={refinerName || 'refiner.Name'}\r\n onClick={this._onToggleSubmenu}\r\n aria-expanded={this.state.expanded}\r\n >\r\n {refinerName}\r\n </Button>\r\n <Collapse isOpen={this.state.expanded} timeout={350}>\r\n {this._renderChildItems(productRefinerHierarchy)}\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n switch (productRefinerHierarchy.DataTypeValue) {\r\n case ProductRefinerValueDataTypeValue.Range:\r\n case ProductRefinerValueDataTypeValue.RangeInput:\r\n return this._renderRange(productRefinerHierarchy);\r\n default:\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, sortingCriteraValues, context } = this.props;\r\n const isSingleSelect = productRefinerHierarchy.RefinerTypeValue === ProductRefinerTypeValue.Single;\r\n const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n // const refinerValuesList = (productRefinerHierarchy.Values || []);\r\n const refinerValuesList = (productRefinerHierarchy.Values || []).sort(function (a:ProductRefinerValue,b:ProductRefinerValue){\r\n if(a.LeftValueBoundString && b.LeftValueBoundString){ return a.LeftValueBoundString.localeCompare(b.LeftValueBoundString)}\r\n return 0;\r\n });\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 let selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n if (child.RightValueBoundString && sortingCriteraValues && sortingCriteraValues?.indexOf(child.RightValueBoundString) !== -1) {\r\n selectedRefinementCriterion = child;\r\n }\r\n return (\r\n <RefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\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 context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n );\r\n });\r\n return (\r\n <ul className='ms-refine-submenu__list' {...role} aria-label={productRefinerHierarchy.KeyName}>\r\n {listItems}\r\n </ul>\r\n );\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const { isDisabled, refineItemCommonProps, selectedRefinerValues, context, minValueSliderThumbAriaLabel, maxValueSliderThumbAriaLabel } = 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 // TODO BUGBUG 22424559 determine only from the DataTypeValue once live example is working (can test with the tempRangeTypeTODO derived from QSP until then)\r\n const rangeType = (productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.RangeInput || this.props.tempRangeTypeTODO === 'input') ?\r\n 'input' :\r\n 'slider';\r\n const key = selectedRefinementCriterion ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}` : `not-selected-${index}`;\r\n return (\r\n <li className={`${submenuClassNamePrefix}--range`} key={index}>\r\n <RangeRefineItem\r\n parentProductRefinerHierarchy={productRefinerHierarchy}\r\n productRefinerValue={child}\r\n selectedRefinementCriterion={selectedRefinementCriterion}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n rangeType={rangeType}\r\n key={key}\r\n context={context}\r\n minValueSliderThumbAriaLabel={minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={maxValueSliderThumbAriaLabel}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n keyId = {index}\r\n />\r\n </li>\r\n );\r\n });\r\n return <ul className='ms-refine-submenu__list list-unstyled'>{listItems}</ul>;\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 * 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 MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText]\r\n */\r\nconst compressedRefinerKeys = ['DataTypeValue', 'LeftValueBoundString', 'RefinerRecordId', 'RefinerSourceValue', 'RightValueBoundString', 'UnitText'];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL\r\n * @param fullUrl The full URL of the page\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || !compressedRefinerArray.length) {\r\n return [];\r\n }\r\n\r\n return <ProductRefinerValue[]>compressedRefinerArray.map((compressedRefiner) => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n // @ts-ignore: This line is intentionally not typesafe\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch (e) {\r\n return undefined;\r\n }\r\n }).filter(Boolean);\r\n};\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\nexport const 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/**\r\n * Method which creates a URL contiaining serialized active refiners\r\n * @param fullUrl The Current URL of the page\r\n * @param refiners The refiners which should be added to the URL\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (!refiners.length) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(refiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (!sortingColumns.length) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context\r\n * @param key The query parameter key\r\n * @param requestContext The request context\r\n */\r\nexport const parseQueryParam = <T>(key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return <T>JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context\r\n * @param requestContext The request context\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n } else {\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n } else {\r\n return new URL(<string><unknown>(requestContext.url.requestUrl));\r\n }\r\n }\r\n};\r\n","import { getUpdatedRefinementCriteria, IRefineItemCommonProps, IRefineItemToggleNotification, ISearchResultContainerViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Button,ILabeledDropdownOption, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { transaction } from 'mobx';\r\nimport * as React from 'react';\r\nimport { ICittaSearchResultContainerProps } from '../../modules/citta-search-result-container/citta-search-result-container.props.autogenerated';\r\nimport RefineSubmenu from './refine-submenu';\r\nimport { buildListPageUrl, getCurrentUrl } from './url-utils';\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport interface ISortByProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n}\r\n\r\nexport interface ISortByOptionsState {\r\n sortingState: ISortByCollectionState;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n dropdownOpen: boolean;\r\n pending: boolean;\r\n}\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refinersHeader: React.ReactNode;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nconst sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc'\r\n};\r\n\r\nexport interface IRefinerProps {\r\n props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>;\r\n toggleModal: Function;\r\n}\r\n/** This component will be used to render Refiners on Citta category and search results page */\r\nexport default class CittaRefiners extends React.PureComponent<IRefinerProps> {\r\n private _refineItemCommonProps: IRefineItemCommonProps;\r\n \r\n private sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.props.resources.sortByOptionPriceDesc },\r\n ];\r\n\r\n\r\n constructor(props: IRefinerProps) {\r\n super(props);\r\n const {\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat\r\n } = props.props.resources;\r\n\r\n const locale = props.props.context.request.locale;\r\n const telemetry = props.props.telemetry;\r\n const validationErrorNaN = props.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = props.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\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n dropdownOpen: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n };\r\n\r\n this._renderRefiners = this._renderRefiners.bind(this);\r\n this._onClearRefiners = this._onClearRefiners.bind(this);\r\n this._getSortColumnFromSelectedOption = this._getSortColumnFromSelectedOption.bind(this);\r\n this._getSortingRefiner = this._getSortingRefiner.bind(this);\r\n\r\n }\r\n public render(): JSX.Element | null {\r\n const refineMenu: IRefineMenuViewProps = this._renderRefiners();\r\n const sortRefiner = this._getSortingRefiner();\r\n\r\n if (refineMenu.refiners) {\r\n return (\r\n \r\n <Node {...refineMenu.RefinerSectionContainer}>\r\n <Node {...refineMenu.RefineMenuContainer}>\r\n {refineMenu.refinersHeader}\r\n {sortRefiner.sortByDropDown}\r\n {refineMenu.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\n private _onClearRefiners = (): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(requestContext), []));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = [];\r\n });\r\n }\r\n\r\n private _getSortingRefiner = (): ISortByViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const sortingCritera = (data.listPageState.result && data.listPageState.result.sortingCritera) || undefined;\r\n \r\n let sortByValues:string[] = [];\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (data.searchConfiguration.result) {\r\n if (sortingCritera && sortingCritera.Columns?.length) {\r\n data.searchConfiguration!.result!.forEach((searchConfiguration) => { \r\n sortingCritera.Columns!.forEach (sortingC => {\r\n if (searchConfiguration.sortColumn.ColumnName === sortingC.ColumnName && searchConfiguration.sortColumn.IsDescending === sortingC.IsDescending) {\r\n sortByValues.push(searchConfiguration.key);\r\n }\r\n })\r\n });\r\n }\r\n }\r\n\r\n let sortByDropdownOptions = [\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionRelevanceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionRelevanceDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionNameDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionNameDesc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceAsc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceAsc\r\n },\r\n {\r\n RefinerSourceValue: 1,\r\n DataValueType: 5,\r\n Count: 8,\r\n RowNumber: 0,\r\n RefinerRecordId: 0,\r\n UnitText: 'Sort By',\r\n RightValueBoundString: sortOptions.sortByOptionPriceDesc,\r\n LeftValueBoundString: this.props.props.resources.sortByOptionPriceDesc\r\n }\r\n ];\r\n\r\n let sortBy: IProductRefinerHierarchy = {\r\n KeyName: 'SortBy',\r\n Values: sortByDropdownOptions\r\n } ;\r\n const dropdown = (\r\n <RefineSubmenu\r\n productRefinerHierarchy={sortBy}\r\n sortingCriteraValues={sortByValues}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={'sort-by-1'}\r\n onUpdateRefiners={this._updateDropDown}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={false}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\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 _updateDropDown = (notification: IRefineItemToggleNotification): void => {\r\n let sortColumn = this._getSortColumnFromSelectedOption(notification.productRefinerValue.RightValueBoundString || '')\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), undefined, [sortColumn], undefined));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.sortingCritera = { Columns: [sortColumn] };\r\n });\r\n\r\n this.setState({\r\n sortingState: {\r\n dropdownOpen: false,\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n }\r\n });\r\n }\r\n\r\n private _getSortColumnFromSelectedOption = (type: string): SortColumn => {\r\n const { data } = this.props.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) => { return searchConfiguration.key === type; });\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 _renderRefiners = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props.props;\r\n\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners = data.refiners.result && data.refiners.result.filter(refiner => {\r\n return refiner.Values.length > 0;\r\n });\r\n const expandedMenusOnLoad = config.expandedMenusOnLoad || 'all';\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinersHeader =\r\n (\r\n <div className='refine-menu-header'>\r\n <div className='refine-menu-close'>\r\n <Button\r\n className={'refine-menu-close-button'}\r\n // @ts-ignore\r\n onClick={this.props.toggleModal}\r\n >{'x'}\r\n </Button>\r\n </div>\r\n\r\n <div className='refine-menu-header-text'>Refine</div>\r\n <div className='refine-menu-header-action'>\r\n <Button\r\n className={'refine-menu-header-action-link'}\r\n aria-label={'Clear'}\r\n // tslint:disable-next-line: react-this-binding-issue\r\n onClick={this._onClearRefiners}\r\n >{'Clear'}\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n\r\n \r\n let orderedRefiners: IProductRefinerHierarchy[] = [];\r\n\r\n if (validRefiners && validRefiners.length){\r\n let refinerCat = validRefiners.find(refiner => refiner.KeyName === 'Refiner Category');\r\n refinerCat && orderedRefiners.push(refinerCat)\r\n \r\n validRefiners.forEach(refiner => {\r\n \r\n if (refiner.KeyName !== 'Refiner Category') {\r\n orderedRefiners.push(refiner)\r\n }\r\n })\r\n }\r\n const subMenus = orderedRefiners && orderedRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n const hiddenRefinersList = config.refinersToBeHidden && config.refinersToBeHidden.toLowerCase().split(',');\r\n if (productRefinerHierarchy.KeyName !== 'Category' && (hiddenRefinersList ? (hiddenRefinersList.indexOf(productRefinerHierarchy.KeyName!.toLowerCase()) === -1 && productRefinerHierarchy.KeyName!.toLowerCase() !== 'rating') : true)) {\r\n let isExpanded: boolean;\r\n switch (expandedMenusOnLoad) {\r\n case 'none':\r\n isExpanded = false;\r\n break;\r\n case 'first':\r\n isExpanded = index === 0;\r\n break;\r\n case 'all':\r\n default:\r\n isExpanded = true;\r\n }\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n if (productRefinerHierarchy.KeyName === \"Refiner Category\") {\r\n isExpanded = true;\r\n }\r\n }\r\n\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={isExpanded}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.props.id}\r\n moduleTypeName={this.props.props.typeName}\r\n refinersToBeUpdated={config.refinersToBeUpdated || ''}\r\n />\r\n );\r\n } else {\r\n return undefined;\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 refinersHeader: refinersHeader,\r\n refiners: subMenus\r\n };\r\n }\r\n\r\n private _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.props.context.request), newRefinementCriteria);\r\n } else {\r\n this.props.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 _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(itemToggleNotification, this.props.props.data.listPageState.result && this.props.props.data.listPageState.result.activeFilters || []);\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n }\r\n}\r\n","import { IGridSettings, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nexport type PictureLoadFailureBehavior = 'default' | 'hide' | 'empty';\r\n\r\nexport interface IPictureState extends React.ComponentState {\r\n showHoverImg: boolean;\r\n}\r\nexport interface IPictureProps {\r\n loadFailureBehavior?: PictureLoadFailureBehavior;\r\n image1?: string;\r\n image2?: string;\r\n emptyImageUrl?: string;\r\n altText?: string;\r\n gridSettings: IGridSettings;\r\n imageSettings?: IImageSettings;\r\n className?: string;\r\n}\r\n/** The Picture component will return picture tag for an image based on ImageResize properties and settings needed to resize the image */\r\nexport default class CittaPicture extends React.PureComponent<IPictureProps, IPictureState> {\r\n\r\n public render(): JSX.Element | null {\r\n const { image1 = '', image2 = '', altText, gridSettings, imageSettings } = this.props;\r\n const img1: IImageData = {\r\n src: image1,\r\n altText: altText ? altText : ''\r\n };\r\n const img2: IImageData = {\r\n src: image2,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings: gridSettings,\r\n imageSettings: imageSettings\r\n };\r\n return (\r\n <div className='images-container'>\r\n <Image\r\n {...img1}\r\n {...imageProps}\r\n loadFailureBehavior='empty'\r\n className={classnames('image1', this.props.className)}\r\n onMouseOver={this.handleMoveHover}\r\n />\r\n <Image\r\n {...img2}\r\n {...imageProps}\r\n loadFailureBehavior='hide'\r\n className={classnames((this.state?.showHoverImg ? 'image2 hoverImg ' : 'image2 hoverImg hideImg '), this.props.className)}\r\n onMouseOut={this.handleMoveOut}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private handleMoveHover = () => {\r\n this.setState({ showHoverImg: true });\r\n }\r\n\r\n private handleMoveOut = () => {\r\n this.setState({ showHoverImg: false });\r\n }\r\n}\r\n","import { generateImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format } from '@msdyn365-commerce-modules/utilities';\r\nimport { RatingComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, ICoreContext, IGridSettings, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaPicture from '../../../components/citta-picture';\r\n\r\nimport PriceComponent from '../../../components/price-component';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n salesLineTagKey?: string;\r\n tagsToIgnore?: string;\r\n}\r\n\r\n/**\r\n *\r\n * The ProductComponent renders the products.\r\n * @extends {React.PureComponent<IProductComponentProps>}\r\n */\r\nclass ProductComponent extends React.Component<IProductComponentProps> {\r\n\r\n constructor(props: IProductComponentProps) {\r\n super(props);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const product = this.props.data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n let imageOrientation: string = '';\r\n let onlineTags: string = '';\r\n let salesLineTag: string = '';\r\n let productImage1: string = '';\r\n let productImage2: string = '';\r\n let stockAvailabilityPropertyText: string = '';\r\n let stockAvailabilities: any[] = [];\r\n\r\n if (product.ExtensionProperties!.length > 0) {\r\n product.ExtensionProperties!.map(property => {\r\n if (property.Key === 'ProductImage1') {\r\n productImage1 = property.Value!.StringValue!;\r\n } else if (property.Key === 'ProductImage2') {\r\n productImage2 = property.Value!.StringValue!;\r\n }\r\n else if (property.Key === 'ProductAvailability') {\r\n stockAvailabilities.push({name: property.Value?.StringValue, value: property.Value?.IntegerValue});\r\n }\r\n });\r\n }\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n } else if (property.Name === 'Online Tags' || property.Name === \"Online Tags B2BN\" || property.Name === \"Online Tags B2BA\" || property.Name === \"Online Tags B2BI\") {\r\n onlineTags = property.TextValue!;\r\n if (this.props.tagsToIgnore && onlineTags) {\r\n let tags = this.props.tagsToIgnore.split('|');\r\n if (tags.includes(onlineTags)) {\r\n onlineTags = '';\r\n }\r\n }\r\n } else if (property.Name === this.props.salesLineTagKey) {\r\n salesLineTag = property.TextValue!;\r\n }\r\n });\r\n }\r\n\r\n const image1 = generateImageUrl(productImage1, this.props.context.request.apiSettings);\r\n const image2 = generateImageUrl(productImage2, this.props.context.request.apiSettings);\r\n\r\n const productUrl = getProductPageUrlSync(product.Name || '', product.RecordId, this.props.context && this.props.context.actionContext, undefined);\r\n\r\n // Construct telemetry attribute to render\r\n const attribute = this.props.context\r\n && this.props.context.telemetry\r\n && this.props.context.telemetry.setTelemetryAttribute\r\n && this.props.context.telemetry.setTelemetryAttribute(product.RecordId.toString(), {\r\n pid: product.RecordId,\r\n pname: product.Name,\r\n mname: this.props.id\r\n }\r\n );\r\n const productImageSettings = imageOrientation === 'Landscape' ? this._getLandscapeImageSettings(this.props.imageSettings) : this.props.imageSettings;\r\n return (\r\n <a href={productUrl} aria-label={this._renderLabel(product.Name, this.props.context.cultureFormatter.formatCurrency(product.Price), product.AverageRating, this.props.ratingAriaLabel)} className='msc-product' {...attribute}>\r\n <div className={(onlineTags && onlineTags !== '') ? 'product-placement__item-imagetag' : 'product-placement__item-imagetagnone'} style={onlineTags.toLocaleLowerCase().includes('essentials') ? {backgroundColor: '#96999b'}: {}}>{onlineTags}</div>\r\n <div className='msc-product__image'>\r\n {this._renderProductPlacementImage(productImageSettings, this.props.context.request.gridSettings, product.PrimaryImageUrl, image1, image2, product.Name)}\r\n </div>\r\n <div className='msc-product__details'>\r\n <h4 className='msc-product__title'>{product.Name}</h4>\r\n {this._renderPrice(this.props.context, this.props.typeName, this.props.id, product.BasePrice, product.Price, this.props.savingsText, this.props.freePriceText, this.props.originalPriceText, this.props.currentPriceText)}\r\n {this._renderSalesLineTag(salesLineTag)}\r\n {this._renderDescription(product.Description)}\r\n {!this.props.context.app.config.hideRating && this._renderRating(this.props.context, this.props.typeName, this.props.id, product.AverageRating, product.TotalRatings, this.props.ratingAriaLabel)}\r\n {stockAvailabilityPropertyText}\r\n <div className=\"msc-product__availabilities\">\r\n {this._renderAvailabilities(stockAvailabilities)}\r\n </div>\r\n </div>\r\n </a>\r\n );\r\n }\r\n\r\n private _renderAvailabilities(stockAvailabilities: any[]) {\r\n return stockAvailabilities && stockAvailabilities.map(sA => <div className=\"msc-product__availabilities_product\">\r\n <span className={sA.value > 0 ? 'in-stock' : 'out-of-stock'}>{sA.name.match(/\\b(\\w)/g).join('')}</span>\r\n </div>\r\n )\r\n }\r\n\r\n private _renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n let ratingLabel = '';\r\n\r\n name = name || '';\r\n price = price || '';\r\n\r\n if (rating) {\r\n const roundedRating = rating.toFixed(2);\r\n ratingLabel = format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n\r\n return (`${name} ${price} ${ratingLabel}`);\r\n }\r\n\r\n private _renderSalesLineTag(salesLineTag?: string): JSX.Element | null {\r\n if (salesLineTag! && salesLineTag !== '') {\r\n return (\r\n <div className='product-placement__item-saleslinetag'>{salesLineTag}</div>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n }\r\n\r\n private _renderRating(context: ICoreContext, typeName: string, id: string, avgRating?: number, totalRatings?: number, ariaLabel?: string): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numRatings = totalRatings && totalRatings.toString() || undefined;\r\n\r\n return (\r\n <RatingComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n avgRating={avgRating}\r\n ratingCount={numRatings}\r\n readOnly={true}\r\n ariaLabel={ariaLabel || ''}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n private _renderPrice(context: ICoreContext, typeName: string, id: string, basePrice?: number, adjustedPrice?: number, savingsText?: string, freePriceText?: string, originalPriceText?: string, currentPriceText?: string): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n\r\n return (\r\n <PriceComponent\r\n context={context}\r\n id={id}\r\n typeName={typeName}\r\n data={{ price: price }}\r\n // @ts-ignore\r\n savingsText={savingsText}\r\n freePriceText={freePriceText}\r\n originalPriceText={originalPriceText}\r\n />\r\n );\r\n }\r\n\r\n private _renderProductPlacementImage(imageSettings?: IImageSettings, gridSettings?: IGridSettings, imageUrl?: string, image1?: string, image2?: string, altText?: string): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n return (\r\n <CittaPicture\r\n className='product-placement__item-image'\r\n image1={image1 ? image1 : imageUrl}\r\n image2={image2 ? image2 : ''}\r\n altText={altText}\r\n gridSettings={gridSettings}\r\n imageSettings={imageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n );\r\n }\r\n\r\n private _getLandscapeImageSettings(cmsImageSettings?: IImageSettings): IImageSettings {\r\n // tslint:disable-next-line: no-unnecessary-local-variable\r\n const landscapeImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=735&h=481&q=80&m=6&f=jpg', w: 735, h: 481 },\r\n sm: { q: 'w=467&h=303&q=80&m=6&f=jpg', w: 467, h: 303 },\r\n md: { q: 'w=563&h=366&q=80&m=6&f=jpg', w: 563, h: 366 },\r\n lg: { q: 'w=636&h=451&q=80&m=6&f=jpg', w: 636, h: 451 },\r\n xl: { q: 'w=974&h=693&q=80&m=6&f=jpg', w: 974, h: 693 }\r\n },\r\n disableLazyLoad: cmsImageSettings && cmsImageSettings.disableLazyLoad,\r\n lazyload: cmsImageSettings && cmsImageSettings.lazyload\r\n };\r\n\r\n return landscapeImageSettings;\r\n }\r\n}\r\n\r\nexport default ProductComponent;\r\n","import { ICategoryHierarchyViewProps, ISearchResultContainerViewProps, ITitleViewProps, ISearchResultModalViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport * as React from 'react';\r\nimport CittaRefiners from '../../components/citta-search-result/citta-refiners';\r\n// import CittaSortByOptions from '../../components/citta-search-result/citta-sortbyoptions';\r\nimport { ICittaSearchResultContainerProps } from './citta-search-result-container.props.autogenerated';\r\nimport ProductComponent from './components/product-component';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductsContainer,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n categoryHierarchy,\r\n errorMessage,\r\n // @ts-ignore\r\n toggleModal\r\n } = props;\r\n\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n <div className=\"filter-button-container\">\r\n {modalToggle}\r\n </div>\r\n {createSearchResultModal(searchResultModal, props, toggleModal)}\r\n {renderTitle(TitleViewProps)}\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {renderProducts(props)}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n );\r\n};\r\n\r\nfunction renderProducts(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element | null {\r\n const { config, context, resources } = props;\r\n const liClass = 'ms-product-search-result__item';\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n const products = (isB2B ? props.data.listPageState.result && props.data.listPageState.result.activeProducts && props.data.listPageState.result.activeProducts.filter((item) => item.ItemId !==\"GiftCard\") : props.data.listPageState.result && props.data.listPageState.result.activeProducts) || [];\r\n if (!products || products.length === 0) {\r\n return null;\r\n }\r\n return (\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className={`${liClass} ${getImageOrientation(product) === 'Landscape' ? 'product-placement__item-limage' : 'product-placement__item-pimage'}`} key={index} >\r\n <ProductComponent\r\n context={context}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n id={props.id}\r\n salesLineTagKey={config.salesLineTagKey}\r\n typeName={props.typeName}\r\n data={{ product: product }}\r\n tagsToIgnore={config.tagsToIgnore}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n}\r\n\r\nfunction getImageOrientation(product: ProductSearchResult): string {\r\n let imageOrientation: string = '';\r\n if (product.AttributeValues!.length > 0) {\r\n product.AttributeValues!.map(property => {\r\n if (property.Name === 'Image Orientation') {\r\n imageOrientation = property.TextValue!;\r\n }\r\n });\r\n }\r\n return imageOrientation;\r\n}\r\n\r\nconst createSearchResultModal = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element => {\r\n return React.cloneElement(modalProps.modal, {className: \"category-refiner\"}, null, createModalBody(modalProps, props, toggleModal))\r\n};\r\n\r\nconst createModalBody = (modalProps: ISearchResultModalViewProps, props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element | null => {\r\n return React.cloneElement(modalProps.modalBody, {}, null, renderRefineMenu(props, toggleModal));\r\n};\r\n\r\nfunction renderRefineMenu(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>, toggleModal: Function): JSX.Element {\r\n return (\r\n <CittaRefiners\r\n props={props}\r\n toggleModal={toggleModal}\r\n />\r\n );\r\n}\r\n\r\n// function renderSort(props: ISearchResultContainerViewProps & ICittaSearchResultContainerProps<{}>): JSX.Element {\r\n// return (\r\n// <CittaSortByOptions\r\n// props={props}\r\n// />\r\n// );\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 <label style={{display: 'none'}} className=\"hide emarsys-collection-name\">{title.titleText}</label>\r\n <h2>\r\n {title.titleCount}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const 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// <label className=\"hide emarsys-collection-name\">{title.titleText}</label>\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;","/*---------------------------------------------------------------------------------------------\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 {\r\n ICartlinesViewProps,\r\n ICartResources,\r\n ICartViewProps,\r\n IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent<ICartViewProps>}\r\n */\r\nexport class CartView extends React.PureComponent<ICartViewProps & ICartProps<{}>, ICartViewState> {\r\n private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n public state: ICartViewState = {\r\n cartlinesErrors: []\r\n };\r\n\r\n private createLogMessage = (message: string): string => {\r\n const url: string = decodeURI(window.location.search);\r\n const origin = window.location.origin;\r\n const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n return logMessage;\r\n }\r\n\r\n private logMessage = (message: string): void => {\r\n this.cittaTelemetry.trace(this.createLogMessage(message));\r\n }\r\n\r\n // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n constructor(props: ICartViewProps & ICartProps<{}>) {\r\n super(props);\r\n\r\n this._renderCartlines = this._renderCartlines.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n // if (this.isQuantityLimitsFeatureEnabled) {\r\n // await this._validateCart();\r\n // }\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n this.logMessage('landed on cart page');\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n return (\r\n <div className={this.props.className} id={this.props.id} {...this.props.renderModuleAttributes(this.props)}>\r\n {this.props.title}\r\n <Node {...this.props.CartlinesWrapper}>\r\n {this._renderCartlines()}\r\n </Node>\r\n {this.props.orderSummaryHeading &&\r\n < Node {...this.props.OrderSummaryWrapper}>\r\n {this.props.orderSummaryHeading}\r\n {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n {_renderGIftCardError(this.props)}\r\n {this.props.config.freightCalculationText ? <div className='cart-freight-asterix'>{this.props.config.freightCalculationText}</div> : null}\r\n <div className={'cart-checkout-button'}>\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null : <div className='cart-checkout-button-option'>{this.props.resources.orLabel}</div>}\r\n <div className={'cart-checkout-button-back-guest'}>\r\n {_renderBackToShoppingButton(this.props.resources)}\r\n {this.props.checkoutAsGuestButton}\r\n </div>\r\n </div>\r\n </Node>\r\n }\r\n {this.props.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n const { emptyCartText } = this.props.resources;\r\n\r\n if (this.props.cartLoadingStatus) {\r\n return <>{this.props.cartLoadingStatus}</>;\r\n }\r\n const cartLines = this._getCartLines();\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n <div className='msc-cart-lines-item' key={index}>\r\n {cartLine.cartline}\r\n {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n <div className='msc-cart-lines-item-buttons'>\r\n {cartLine.addToWishlist}\r\n {cartLine.remove}\r\n </div>\r\n </div>\r\n );\r\n });\r\n } else {\r\n return (this.props.cartDataResult ?\r\n (\r\n <div className='msc-cart__empty-cart'>\r\n <p className='msc-cart-line'>{emptyCartText}</p>\r\n {this.props.backToShoppingButton}\r\n </div>\r\n ) : <>{this.props.waitingComponent}</>\r\n );\r\n }\r\n }\r\n\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\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 return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors: cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\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: \"Colour:\" || resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.props.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates: orderTemplates,\r\n customerInformation: customerInformation\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n }\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\r\n .then(() => {\r\n this._validateCart()\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n return true;\r\n }\r\n return false;\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _fulfillmentStoreIdUpdated = () => {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n private async _validateCart(retry: boolean = true): Promise<void> {\r\n if (!this.isQuantityLimitsFeatureEnabled) {\r\n return AsyncResult.resolve();\r\n }\r\n\r\n const {\r\n data: { cart: cart }\r\n } = this.props;\r\n let cartResult: ICartState;\r\n try {\r\n cartResult = await cart;\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n return AsyncResult.resolve();\r\n }\r\n const cartVersion = cartResult.cart?.Version;\r\n if (cartVersion) {\r\n try {\r\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n return AsyncResult.resolve();\r\n } catch (error) {\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n try {\r\n await cartResult.refreshCart({});\r\n } catch (refreshError) {\r\n this.props.telemetry.warning(refreshError);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n return AsyncResult.resolve();\r\n }\r\n try {\r\n await this._validateCart(false);\r\n return AsyncResult.resolve();\r\n } catch (validateError) {\r\n this.props.telemetry.warning(validateError);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n } else {\r\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): 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\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): 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.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): 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\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): 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\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n return (\r\n <Button\r\n className={'msc-cart__btn-backtoshopping'}\r\n onClick={_goToPreviousPage}\r\n >\r\n {resources.backToShoppingButtonTitle}\r\n </Button>\r\n );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n if (!cartLine.pickUpInStore || !storeSelector) {\r\n return null;\r\n }\r\n\r\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n const toggleBopis = (event: React.MouseEvent<HTMLElement>) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n const changeStore = (event: React.MouseEvent<HTMLElement>) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n return (\r\n <Node {...cartLine.pickUpInStore.ContainerProps}>\r\n <div className='msc-cart-line__bopis-method'>\r\n {isBopisSelected ? <span className='pick-up'>{pickUpAtStoreWithLocationText}</span> : <span className='ship'>{shipToAddressDisplayText}</span>}\r\n </div>\r\n {\r\n isBopisSelected &&\r\n <div className='msc-cart-line__bopis-fullfilment'>\r\n <span className='msc-cart-line__bopis-fullfilment-store'>{cartLine.pickUpInStore.orgUnitName}</span>\r\n <Button className='msc-cart-line__bopis-changestore' onClick={changeStore}>{changeStoreDisplayText}</Button>\r\n </div>\r\n }\r\n <Button className='msc-cart-line__bopis-btn' onClick={toggleBopis}>{isBopisSelected ? shipInsteadDisplayText : pickItUpDisplayText}</Button>\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || errorData.errors.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Node {...errorData.Wrapper}>\r\n {\"Please review cart errors before proceeding to checkout\"}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderGIftCardError = (props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n function checkAvailability(arr:any, val:string) {\r\n return arr.some(function(arrVal:any) {\r\n return val === arrVal.data?.product?.ItemId;\r\n });\r\n }\r\n let hasGiftCard = checkAvailability(props.cartlines, \"GiftCard\");\r\n let cartlinesLength = props.cartlines?.length || 0;\r\n if(hasGiftCard && cartlinesLength > 1) {\r\n return (\r\n <div className='giftCardError'>\r\n {props.config.giftCardErrorMessage || \"At this stage, we cannot process gift cards with product. Please purchase gift cards in a separate transaction.\"}\r\n </div>\r\n );\r\n } else {\r\n return null\r\n }\r\n};\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n return (\r\n <Node {...OrderSummaryItems}>\r\n {props.promoCode}\r\n {_renderSubTotal(props)}\r\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\r\n {orderSummaryLines.shipping}\r\n {props.config.hideTaxLine ? null : orderSummaryLines.tax}\r\n {_renderAmountDue(props)}\r\n {/* {_renderTotalSavings(props)} */}\r\n </Node>\r\n );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const OrderSubTotal = props.data.cart.result?.cart?.NetPrice;\r\n return (\r\n <p className={`msc-order-summary__line-sub-total`}>\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n <span className='msc-order-summary__label'>{props.resources.subTotalHeadingLabel}</span>\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: OrderSubTotal }\r\n }}\r\n freePriceText={undefined}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n </>\r\n ) : null}\r\n </p>\r\n );\r\n}\r\n\r\n// function _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n// const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n// const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n// return (\r\n// <p className={`msc-order-summary__line-amount-tax`}>\r\n// <span className='msc-order-summary__label'>{taxLabel}</span>\r\n// {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n// <PriceComponent\r\n// data={{\r\n// price: { CustomerContextualPrice: props.data.cart.result?.cart?.TaxAmount }\r\n// }}\r\n// freePriceText={props.resources.priceFree}\r\n// context={props.context}\r\n// id={props.id}\r\n// typeName={props.typeName}\r\n// className={'msc-order-summary__value'}\r\n// />\r\n// ) : (\r\n// <span className='msc-order-summary__value'>{props.resources.yetToBeCalculatedText}</span>\r\n// )}\r\n// </p>\r\n// );\r\n// }\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n return (\r\n <p className={`msc-order-summary__line-amount-due`}>\r\n <span className='msc-order-summary__label'>{props.resources.totalAmountLabel}</span>\r\n {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: props.data.cart.result?.cart?.TotalAmount }\r\n }}\r\n freePriceText={props.resources.priceFree}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n ) : (\r\n <span className='msc-order-summary__value'>{props.resources.yetToBeCalculatedText}</span>\r\n )}\r\n </p>\r\n );\r\n}\r\n\r\n// function _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n// const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n// return (\r\n// <p className={`msc-order-summary__line-total-savings`}>\r\n// {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n// <>\r\n// <span className='msc-order-summary__label'>{props.resources.totalSavings}</span>\r\n// <PriceComponent\r\n// data={{\r\n// price: { CustomerContextualPrice: DiscountAmountWithoutTax }\r\n// }}\r\n// freePriceText={props.resources.priceFree}\r\n// context={props.context}\r\n// id={props.id}\r\n// typeName={props.typeName}\r\n// className={'msc-order-summary__value'}\r\n// />\r\n// </>\r\n// ) : null}\r\n// </p>\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 {\r\n ICartlinesViewProps,\r\n ICartResources,\r\n ICartViewProps,\r\n IOrderSummaryErrors\r\n} from '@msdyn365-commerce-modules/cart';\r\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\r\nimport { Button, INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport {\r\n IAddToOrderTemplateDialogResources, IDuplicateItemsWhenAddingToOrderTemplateDialogResources, IItemAddedToOrderTemplateDialogResources,\r\n IOrderTemplateNameDialogResources, IWishlistActionSuccessResult, PriceComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport { AsyncResult, CartLine, CartLineValidationResults, LineDataValidationFailure } from '@msdyn365-commerce/retail-proxy';\r\nimport { validateForCheckoutAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport * as React from 'react';\r\nimport { CartLineItems } from '../../../components/citta-cart/cart-line-items';\r\nimport { ICartProps } from '../definition-extensions/cart.ext.props.autogenerated';\r\n\r\nimport CittaTelemetry from '../../../common/telemetry/citta-telemetry';\r\n// import PriceComponent from '../../../components/price-component'\r\n\r\ninterface ICartViewState {\r\n cartlinesErrors: LineDataValidationFailure[];\r\n}\r\n\r\n/**\r\n *\r\n * CartView\r\n * @extends {React.PureComponent<ICartViewProps>}\r\n */\r\nexport class CartView extends React.PureComponent<ICartViewProps & ICartProps<{}>, ICartViewState> {\r\n private cittaTelemetry: CittaTelemetry = new CittaTelemetry(this.props.context.app.config.cittaInstrumentationKey);\r\n\r\n public state: ICartViewState = {\r\n cartlinesErrors: []\r\n };\r\n\r\n private createLogMessage = (message: string): string => {\r\n const url: string = decodeURI(window.location.search);\r\n const origin = window.location.origin;\r\n const logMessage = `${message} Url: - ${url} - Origin: ${origin}`;\r\n return logMessage;\r\n }\r\n\r\n private logMessage = (message: string): void => {\r\n this.cittaTelemetry.trace(this.createLogMessage(message));\r\n }\r\n\r\n // private isQuantityLimitsFeatureEnabled: boolean = true;\r\n private isQuantityLimitsFeatureEnabled: boolean = false;\r\n\r\n\r\n constructor(props: ICartViewProps & ICartProps<{}>) {\r\n super(props);\r\n\r\n this._renderCartlines = this._renderCartlines.bind(this);\r\n }\r\n\r\n public async componentDidMount(): Promise<void> {\r\n // if (this.isQuantityLimitsFeatureEnabled) {\r\n // await this._validateCart();\r\n // }\r\n this.isQuantityLimitsFeatureEnabled = await this.getOrderQuantityLimitsFeatureFlag();\r\n if (this.isQuantityLimitsFeatureEnabled) {\r\n await this._validateCart();\r\n }\r\n\r\n this.logMessage('landed on cart page');\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n return (\r\n <div className={this.props.className} id={this.props.id} {...this.props.renderModuleAttributes(this.props)}>\r\n {this.props.title}\r\n <Node {...this.props.CartlinesWrapper}>\r\n {this._renderCartlines()}\r\n </Node>\r\n {this.props.orderSummaryHeading &&\r\n < Node {...this.props.OrderSummaryWrapper}>\r\n {this.props.orderSummaryHeading}\r\n {_renderOrderSummarylines(this.props.orderSummaryLineitems, this.props.OrderSummaryItems, this.props)}\r\n {this.state.cartlinesErrors.length > 0 ? _renderErrorBlock(this.props.OrderSummaryErrors) : null}\r\n {_renderUnder200sError(this.props)}\r\n {this.props.config.freightCalculationText ? <div className='cart-freight-asterix'>{this.props.config.freightCalculationText}</div> : null}\r\n <div className={'cart-checkout-button'}>\r\n {this.props.checkoutAsSignInUserButton}\r\n {this.props.context.request && this.props.context.request.user && this.props.context.request.user.isAuthenticated ? null : <div className='cart-checkout-button-option'>{this.props.resources.orLabel}</div>}\r\n <div className={'cart-checkout-button-back-guest'}>\r\n {_renderBackToShoppingButton(this.props.resources)}\r\n {this.props.checkoutAsGuestButton}\r\n </div>\r\n </div>\r\n </Node>\r\n }\r\n {this.props.storeSelector}\r\n </div>\r\n );\r\n }\r\n\r\n private _renderCartlines(): JSX.Element[] | JSX.Element {\r\n const { emptyCartText } = this.props.resources;\r\n\r\n if (this.props.cartLoadingStatus) {\r\n return <>{this.props.cartLoadingStatus}</>;\r\n }\r\n const cartLines = this._getCartLines();\r\n if (cartLines) {\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n <div className='msc-cart-lines-item' key={index}>\r\n {cartLine.cartline}\r\n {_renderBOPISBlock(cartLine, this.props.resources, this.props.storeSelector)}\r\n <div className='msc-cart-lines-item-buttons'>\r\n {cartLine.addToWishlist}\r\n {cartLine.remove}\r\n </div>\r\n </div>\r\n );\r\n });\r\n } else {\r\n return (this.props.cartDataResult ?\r\n (\r\n <div className='msc-cart__empty-cart'>\r\n <p className='msc-cart-line'>{emptyCartText}</p>\r\n {this.props.backToShoppingButton}\r\n </div>\r\n ) : <>{this.props.waitingComponent}</>\r\n );\r\n }\r\n }\r\n\r\n private _getCartLines(): ICartlinesViewProps[] | null {\r\n const {\r\n data: {\r\n cart: { result: cart },\r\n wishlists: { result: wishlists },\r\n orderTemplates: { result: orderTemplates },\r\n customerInformation: { result: customerInformation }\r\n },\r\n context: {\r\n request: {\r\n channel: {\r\n PickupDeliveryModeCode\r\n } = { PickupDeliveryModeCode: undefined }\r\n }\r\n },\r\n config: config,\r\n telemetry,\r\n resources,\r\n modules\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n\r\n const cartlinesErrors: LineDataValidationFailure[] = this.state.cartlinesErrors;\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 return this.props.data.products && this.props.data.products.result && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0 ? (\r\n CartLineItems({\r\n cartlines: cart.cart.CartLines,\r\n storeSelectorModuleId: storeSelectorId,\r\n cartlinesErrors: cartlinesErrors,\r\n products: this.props.data.products.result,\r\n productAvailabilites: this.props.data.productAvailabilites.result,\r\n productDeliveryOptions: this.props.data.deliveryOptions.result,\r\n imageSettings: imageSettings,\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: \"Size:\" || resources.productDimensionTypeSize,\r\n colorString: \"Colour:\" || resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\r\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\r\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\r\n discountStringText: resources.discountStringText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText,\r\n shippingChargesText: resources.shippingCharges\r\n },\r\n telemetry: telemetry,\r\n addToWishlistButtonText: resources.addToWishlistButtonText,\r\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\r\n removeButtonText: resources.removeCartButtonText,\r\n shipItText: resources.shipInsteadDisplayText,\r\n pickitUpText: resources.pickItUpDisplayText,\r\n changeStoreText: resources.changeStoreDisplayText,\r\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\r\n outOfStockText: resources.outOfStockErrorMessage,\r\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\r\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\r\n cartState: this.props.data.cart.result,\r\n orgUnitLocations: this.props.data.orgUnitLocations.result,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n moveToWishlistSuccessHandler: this._moveToWishlistSuccessHandler,\r\n updateCartLinesQuantitySuccessHandler: this._updateCartlineQuantity,\r\n locationChangedHandler: this._fulfillmentStoreIdUpdated,\r\n wishlists: wishlists,\r\n defaultWishlistName: resources.defaultWishlistName,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n includeErrors: config.showOutOfStockErrors,\r\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\r\n telemetryContent: this.props.telemetryContent,\r\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\r\n\r\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\r\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\r\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\r\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources),\r\n\r\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\r\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\r\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\r\n orderTemplates: orderTemplates,\r\n customerInformation: customerInformation\r\n })\r\n ) : null;\r\n }\r\n\r\n private _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\r\n return imageSettings || {\r\n viewports: {\r\n xs: { q: `w=80&h=94&m=6`, w: 0, h: 0 },\r\n sm: { q: `w=148&h=174&m=6`, w: 0, h: 0 },\r\n lg: { q: `w=148&h=174&m=6`, w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n }\r\n\r\n private _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input)\r\n .then(() => {\r\n this._validateCart()\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n }\r\n\r\n private _moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\r\n if (result.status === 'ADDED' && cartline) {\r\n this._removeItemFromCartHandler(cartline);\r\n }\r\n }\r\n\r\n private _updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number): boolean => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineId: cartlineToUpdate.LineId!.toString(),\r\n newQuantity: quantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: this.isQuantityLimitsFeatureEnabled }\r\n };\r\n this.props.data.cart.result.updateCartLineQuantity(input)\r\n .then((result: ICartActionResult) => {\r\n if (result.status === 'SUCCESS') {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n return true;\r\n }\r\n return false;\r\n })\r\n .catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to update Cart Line quantity');\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _fulfillmentStoreIdUpdated = () => {\r\n this._validateCart().catch((error) => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n });\r\n }\r\n\r\n /**\r\n * Get order quantity limit feature flag.\r\n * @returns True if flag is enabled, false otherwise.\r\n */\r\n private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n return false;\r\n }\r\n\r\n try {\r\n const featureStatuses = await this.props.data.featureState;\r\n const isQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\r\n )?.IsEnabled || false;\r\n if (!isQuantityLimitsFeatureEnabledInHq) {\r\n return false;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n return false;\r\n }\r\n\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n return true;\r\n }\r\n try {\r\n const customerInfo = await this.props.data.customerInformation;\r\n return (\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\r\n );\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get customer info');\r\n return false;\r\n }\r\n }\r\n\r\n private async _validateCart(retry: boolean = true): Promise<void> {\r\n if (!this.isQuantityLimitsFeatureEnabled) {\r\n return AsyncResult.resolve();\r\n }\r\n\r\n const {\r\n data: { cart: cart }\r\n } = this.props;\r\n let cartResult: ICartState;\r\n try {\r\n cartResult = await cart;\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get cart');\r\n return AsyncResult.resolve();\r\n }\r\n const cartVersion = cartResult.cart?.Version;\r\n if (cartVersion) {\r\n try {\r\n const validationResult: CartLineValidationResults = await validateForCheckoutAsync({ callerContext: this.props.context.actionContext }, cartResult?.cart?.Id, cartVersion);\r\n this.setState({ cartlinesErrors: validationResult.ValidationFailuresByCartLines || [] });\r\n return AsyncResult.resolve();\r\n } catch (error) {\r\n if (retry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\r\n try {\r\n await cartResult.refreshCart({});\r\n } catch (refreshError) {\r\n this.props.telemetry.warning(refreshError);\r\n this.props.telemetry.debug('Unable to refresh Cart');\r\n return AsyncResult.resolve();\r\n }\r\n try {\r\n await this._validateCart(false);\r\n return AsyncResult.resolve();\r\n } catch (validateError) {\r\n this.props.telemetry.warning(validateError);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to validate Cart');\r\n return AsyncResult.resolve();\r\n }\r\n } else {\r\n this.props.telemetry.warning('Cart version not found for Cart validation request.');\r\n return AsyncResult.resolve();\r\n }\r\n }\r\n\r\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): 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\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): 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.freePriceText,\r\n originalPriceText: resources.originalPriceText,\r\n currentPriceText: resources.currentPriceText\r\n };\r\n }\r\n\r\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(resources: ICartResources): 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\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): 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\nexport default CartView;\r\n\r\nfunction _renderBackToShoppingButton(resources: ICartResources): JSX.Element | null {\r\n return (\r\n <Button\r\n className={'msc-cart__btn-backtoshopping'}\r\n onClick={_goToPreviousPage}\r\n >\r\n {resources.backToShoppingButtonTitle}\r\n </Button>\r\n );\r\n}\r\n\r\nfunction _goToPreviousPage(): void {\r\n window.history.back();\r\n}\r\n\r\nconst _renderBOPISBlock = (cartLine: ICartlinesViewProps, resources: ICartResources, storeSelector: React.ReactNode | undefined): JSX.Element | null => {\r\n if (!cartLine.pickUpInStore || !storeSelector) {\r\n return null;\r\n }\r\n\r\n const { shipInsteadDisplayText, shipToAddressDisplayText, pickItUpDisplayText, pickUpAtStoreWithLocationText, changeStoreDisplayText } = resources;\r\n\r\n const isBopisSelected = cartLine.pickUpInStore.isBopisSelected;\r\n const toggleBopis = (event: React.MouseEvent<HTMLElement>) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(!isBopisSelected); };\r\n const changeStore = (event: React.MouseEvent<HTMLElement>) => { return cartLine.pickUpInStore && cartLine.pickUpInStore.callbacks.toggleBopis(true); };\r\n\r\n return (\r\n <Node {...cartLine.pickUpInStore.ContainerProps}>\r\n <div className='msc-cart-line__bopis-method'>\r\n {isBopisSelected ? <span className='pick-up'>{pickUpAtStoreWithLocationText}</span> : <span className='ship'>{shipToAddressDisplayText}</span>}\r\n </div>\r\n {\r\n isBopisSelected &&\r\n <div className='msc-cart-line__bopis-fullfilment'>\r\n <span className='msc-cart-line__bopis-fullfilment-store'>{cartLine.pickUpInStore.orgUnitName}</span>\r\n <Button className='msc-cart-line__bopis-changestore' onClick={changeStore}>{changeStoreDisplayText}</Button>\r\n </div>\r\n }\r\n <Button className='msc-cart-line__bopis-btn' onClick={toggleBopis}>{isBopisSelected ? shipInsteadDisplayText : pickItUpDisplayText}</Button>\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\r\n if (!errorData || errorData.errors.length === 0) {\r\n return null;\r\n }\r\n return (\r\n <Node {...errorData.Wrapper}>\r\n {\"Please review cart errors before proceeding to checkout\"}\r\n </Node>\r\n );\r\n};\r\n\r\nconst _renderUnder200sError = (props:any): JSX.Element | null => {\r\n const OrderSubTotal = props.data.cart.result?.cart?.SubtotalAmount;\r\n const { request } = props.context;\r\n const market = request && request.apiSettings && request.apiSettings.oun;\r\n const isB2BI = market && market === \"B2BI\";\r\n let minimumOrder = 200;\r\n const discountLevel = props.data.customerInformation.result!.LineDiscountGroup;\r\n if(isB2BI) {\r\n switch(discountLevel){\r\n case \"Level 1\":\r\n minimumOrder = 1500;\r\n break;\r\n case \"Level 4\":\r\n minimumOrder = 500;\r\n break;\r\n case \"Level 5\":\r\n minimumOrder = 500;\r\n break;\r\n default:\r\n minimumOrder = 200;\r\n }\r\n }\r\n let isGiftCardOnly = props.data.cart.result?.cart && props.data.cart.result?.cart.CartLines && props.data.cart.result?.cart.CartLines.length === 1 && props.data.cart.result?.cart.CartLines[0].ItemId === \"GiftCard\";\r\n if(!isGiftCardOnly && OrderSubTotal < minimumOrder) {\r\n return (\r\n <div className='msc-alert msc-alert msc-alert-danger'>\r\n <div>Your order must be a minimum of ${minimumOrder}. Please update your cart to place an order.</div>\r\n </div>\r\n );\r\n }\r\n return null\r\n};\r\n\r\nconst _renderOrderSummarylines = (orderSummaryLines: IOrderSummaryLines | undefined, OrderSummaryItems: INodeProps, props: ICartViewProps & ICartProps<{}>): JSX.Element | null => {\r\n if (!orderSummaryLines) {\r\n return null;\r\n }\r\n const isB2B = props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits === 'b2b';\r\n return (\r\n <Node {...OrderSummaryItems}>\r\n {isB2B? null : props.promoCode}\r\n {isB2B? orderSummaryLines.subtotal : _renderSubTotal(props)}\r\n {props.config.hideTaxLine ? null : _renderTax(props)}\r\n {isB2B ? orderSummaryLines.subtotal : (orderSummaryLines.totalDiscounts ? orderSummaryLines.subtotal : null)}\r\n {isB2B? null : _renderAmountDue(props)}\r\n {isB2B? null : _renderTotalSavings(props)}\r\n </Node>\r\n );\r\n};\r\n\r\nfunction _renderSubTotal(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const OrderSubTotal = props.data.cart.result?.cart?.NetPrice;\r\n return (\r\n <p className={`msc-order-summary__line-sub-total`}>\r\n {OrderSubTotal && OrderSubTotal > 0 ? (\r\n <>\r\n <span className='msc-order-summary__label'>{props.resources.subTotalHeadingLabel}</span>\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: OrderSubTotal }\r\n }}\r\n freePriceText={undefined}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n </>\r\n ) : null}\r\n </p>\r\n );\r\n}\r\n\r\nfunction _renderTax(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n const discountAmount = props.cart && props.cart.cart.DiscountAmount || 0;\r\n const taxLabel = discountAmount > 0? props.resources.estimatedShippingLabel : props.resources.estimatedTaxLabel;\r\n return (\r\n <p className={`msc-order-summary__line-amount-tax`}>\r\n <span className='msc-order-summary__label'>{taxLabel}</span>\r\n {props.data.cart.result?.cart?.TaxAmount && props.data.cart.result?.cart?.TaxAmount > 0 ? (\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: props.data.cart.result?.cart?.TaxAmount }\r\n }}\r\n freePriceText={props.resources.priceFree}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n ) : (\r\n <span className='msc-order-summary__value'>{props.resources.yetToBeCalculatedText}</span>\r\n )}\r\n </p>\r\n );\r\n}\r\n\r\nfunction _renderAmountDue(props: ICartViewProps & ICartProps<{}>): JSX.Element | null {\r\n return (\r\n <p className={`msc-order-summary__line-amount-due`}>\r\n <span className='msc-order-summary__label'>{props.resources.amountDueLabel}</span>\r\n {props.data.cart.result?.cart?.TotalAmount || props.data.cart.result?.cart?.TotalAmount === 0 ? (\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: props.data.cart.result?.cart?.TotalAmount }\r\n }}\r\n freePriceText={props.resources.priceFree}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n ) : (\r\n <span className='msc-order-summary__value'>{props.resources.yetToBeCalculatedText}</span>\r\n )}\r\n </p>\r\n );\r\n}\r\n\r\nfunction _renderTotalSavings(props: ICartViewProps): JSX.Element | null {\r\n\r\n const DiscountAmountWithoutTax = props.data.cart.result?.cart?.DiscountAmountWithoutTax;\r\n return (\r\n <p className={`msc-order-summary__line-total-savings`}>\r\n {DiscountAmountWithoutTax && DiscountAmountWithoutTax > 0 ? (\r\n <>\r\n <span className='msc-order-summary__label'>{props.resources.totalSavings}</span>\r\n <PriceComponent\r\n data={{\r\n price: { CustomerContextualPrice: DiscountAmountWithoutTax }\r\n }}\r\n freePriceText={props.resources.priceFree}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className={'msc-order-summary__value'}\r\n />\r\n </>\r\n ) : null}\r\n </p>\r\n );\r\n}","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult<ICartState>,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise<CartLineValidationResultsByLineId | undefined> {\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise<boolean> {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise<ICartActionResult | undefined> {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ActiveCartProductsInput,\n getActiveCartProductsAction,\n getAvailabilitiesForCartLineItems,\n getDeliveryOptionsForCartLineItems,\n IProductInventoryInformation,\n ProductAvailabilitiesForCartLineItems,\n ProductDeliveryOptionsForCartLineItems\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IMiniCartData entity interface.\n */\nexport interface IMiniCartData {\n products?: SimpleProduct[];\n productAvailabilites?: IProductInventoryInformation[];\n deliveryOptions?: ProductDeliveryOptions[];\n}\n\nexport const createInput = () => {\n return new ActiveCartProductsInput();\n};\n\n/**\n * Calls the Retail API and returns a mini cart data.\n * @param ctx\n * @param cartState\n */\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise<IMiniCartData> {\n const miniCartData: IMiniCartData = {};\n\n const cart = cartState.cart;\n\n // If there are cart lines, make call to get products\n // If there are invocie linese, then there is no products, so don't make call to get products\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\n .then(products => {\n if (products) {\n miniCartData.products = products;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(availableQuantity => {\n if (availableQuantity) {\n miniCartData.productAvailabilites = availableQuantity;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(deliveryOptions => {\n if (deliveryOptions) {\n miniCartData.deliveryOptions = deliveryOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\n });\n }\n\n return miniCartData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n CartLineValidationResultsByLineId,\n OrgUnitLocation\n} from '@msdyn365-commerce/retail-proxy';\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n ITelemetryContent,\n TelemetryConstant,\n UncontrolledTooltip,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\n\nimport { ICartIconData } from './cart-icon.data';\nimport { cartLinesSortOrder, ICartIconProps } from './cart-icon.props.autogenerated';\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\n\nexport interface IMiniCartState {\n miniCartData: IMiniCartData;\n orgUnitLocations?: OrgUnitLocation[];\n isQuantityLimitsFeatureEnabled: boolean;\n isCartValid: boolean;\n}\n\nexport interface ICartIconViewProps extends ICartIconProps<ICartIconData> {\n className: string;\n cartIcon: React.ReactNode;\n FlyoutContainer?: INodeProps;\n CartlinesWrapper: INodeProps;\n miniCartWrapper: INodeProps;\n miniCartItemWrapper: INodeProps;\n cartlines?: IFlyoutCartLineItemViewProps[];\n flyoutTitle: React.ReactNode;\n totalPrice: React.ReactNode;\n checkoutAsGuestButton?: React.ReactNode;\n checkoutAsSignInUserButton?: React.ReactNode;\n goToCartButton?: React.ReactNode;\n waitingComponent?: React.ReactNode;\n isCartLoading: boolean;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\n/**\n *\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass CartIcon extends React.Component<ICartIconProps<ICartIconData>, IMiniCartState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly checkoutBySignInAttributes: IDictionary<string> | undefined;\n\n private readonly checkoutByGuestAttributes: IDictionary<string> | undefined;\n\n private readonly viewShoppingBagAttributes: IDictionary<string> | undefined;\n\n private retailMultiplePickUpOptionEnabled?: boolean = false;\n\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n private lastValidatedCartVersion: number | undefined;\n\n constructor(props: ICartIconProps<ICartIconData>) {\n super(props);\n this.state = {\n miniCartData: {},\n isCartValid: true,\n isQuantityLimitsFeatureEnabled: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\n }\n\n public async componentDidMount(): Promise<void> {\n const context = this.props.context.actionContext;\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n this.setState({\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\n });\n }\n );\n await this._setQuantityLimitsFeatureFlag();\n\n this.setState({\n orgUnitLocations: this.props.data.orgUnitLocations?.result\n });\n\n this._validateCart();\n }\n\n public componentDidUpdate(prevProps: ICartIconProps<ICartIconData>): void {\n this._validateCart();\n }\n\n public shouldComponentUpdate(nextProps: ICartIconProps<ICartIconData>, nextState: IMiniCartState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n config: { enableHoverCart, isAnonymousCheckout },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n context,\n resources\n } = this.props;\n\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\n const shouldShowMiniCart =\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\n const hasInvoiceLine = cart?.hasInvoiceLine;\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const cartLines = this._getCartLines();\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.state.miniCartData.productAvailabilites ?? [],\n this.props.context.actionContext,\n this.state.miniCartData.products ?? [],\n emailDeliveryModeCode\n );\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\n const flyoutTitle = resources.flyoutTitle;\n const flyoutTooltip = {\n tag: UncontrolledTooltip,\n shouldShowMiniCart,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__flyout-container',\n trigger: 'hover',\n displayMode: 'FLYOUT',\n target: id,\n shouldShowCloseButton: true,\n cartPageUrl: cartUrl,\n hideAriaHidden: true\n };\n\n // If there are invoice lines, don't update mini cart price\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\n const priceString = price\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\n : '';\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\n feature => feature.Name === multiplePickupStoreSwitchName\n )?.IsEnabled;\n\n const viewProps = {\n ...this.props,\n cartIcon: (\n <CartIconComponent\n cartLabel={resources.cartLabel}\n cartQtyLabel={resources.cartQtyLabel}\n context={context}\n id={id}\n typeName={typeName}\n data={{ cart }}\n telemetryContent={this.telemetryContent}\n />\n ),\n cartlines: cartLines,\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\n CartlinesWrapper: {\n className: 'ms-cart-icon__cart-lines'\n },\n miniCartWrapper: {\n className: classnames('ms-cart-icon'),\n id: this.props.id\n },\n miniCartItemWrapper: {\n className: classnames('msc-cart-lines-item')\n },\n\n // If there are invoice lines, don't update mini cart checkout button\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\n checkoutAsSignInUserButton:\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\n <Button\n disabled={hasError}\n className='ms-cart-icon__btn-checkout'\n href={checkoutURL}\n title={resources.checkoutButtonTitle}\n {...this.checkoutBySignInAttributes}\n >\n {resources.checkoutButtonTitle}\n </Button>\n ) : null,\n checkoutAsGuestButton:\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\n <Button\n disabled={hasError}\n className='ms-cart-icon__btn-guestcheckout'\n href={guestCheckoutUrl}\n title={resources.guestCheckoutButtonTitle}\n {...this.checkoutByGuestAttributes}\n >\n {resources.guestCheckoutButtonTitle}\n </Button>\n ) : null,\n goToCartButton: (\n <Button\n className='ms-cart-icon__btn-gotocart'\n href={cartUrl}\n title={goToCartButtonText}\n {...this.viewShoppingBagAttributes}\n >\n {goToCartButtonText}\n </Button>\n ),\n checkoutBlockedDueToUnavailableFunds: null,\n flyoutTitle: <span className='ms-cart-icon__flyout-title'>{flyoutTitle}</span>,\n totalPrice: <div className='ms-cart-icon__subtotal'>{priceString}</div>\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _validateCart(): void {\n const {\n data: { cart }\n } = this.props;\n const cartVersion = cart.result?.cart?.Version ?? undefined;\n if (this.lastValidatedCartVersion === cartVersion) {\n return;\n }\n\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\n\n if (this.state.isQuantityLimitsFeatureEnabled) {\n validateCartAsync(cart, this.props.telemetry, this.props.context)\n .then((result: CartLineValidationResultsByLineId | undefined) => {\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\n })\n .catch(() => {\n this.setState({ isCartValid: false });\n });\n } else {\n this.setState({ isCartValid: true });\n }\n }\n\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Sort cartline items.\n * @param cartlines - Cartlines to be sorted.\n * @param sortOrder - Ascending or descending.\n * @returns - Sorted cartlines.\n */\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\n const lines: CartLine[] = [...cartlines];\n const zero: number = 0;\n\n if (sortOrder === cartLinesSortOrder.descending) {\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\n }\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\n };\n\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\n const {\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources\n } = this.props;\n\n const imageSettings = this._getImageSettings(config.imageSettings);\n const cart = this.props.data.cart && this.props.data.cart.result;\n\n // Cart-icon could be placed in each page\n // so we check cart content to reduce number of RS calls\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\n ? FlyoutCartLineItems({\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\n products: this.state.miniCartData.products,\n productAvailabilites: this.state.miniCartData.productAvailabilites,\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\n imageSettings,\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n quantityDisplayString: resources.quantityDisplayText,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n inputQuantityAriaLabel: '', // Not used\n discountStringText: '', // Not used\n originalPriceText: '',\n currentPriceText: '',\n shippingChargesText: '',\n shippingText: resources.shippingText\n },\n telemetry,\n removeButtonText: resources.removeCartButtonText,\n outOfStockText: '', // Not used\n outOfRangeOneText: '', // Not used\n outOfRangeFormatText: '', // Not used\n cartState: cart,\n orgUnitLocations: this.state.orgUnitLocations,\n removeItemClickHandler: this._removeItemFromCartHandler,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n telemetryContent: this.telemetryContent,\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\n catalogs: this.props.data.catalogs?.result\n })\n : null;\n }\n\n private readonly _getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result.removeCartLines(input).catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n private async _setQuantityLimitsFeatureFlag(): Promise<void> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n return;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n\n try {\n const featureStatuses = await this.props.data.featureState;\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n this.setState({ isQuantityLimitsFeatureEnabled: false });\n return;\n }\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n this.setState({ isQuantityLimitsFeatureEnabled: true });\n } else {\n this.props.data.customerInformation\n .then(customerInfo => {\n const result =\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\n this.setState({ isQuantityLimitsFeatureEnabled: result });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n });\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n this.setState({ isQuantityLimitsFeatureEnabled: !(cartConfiguration?.IgnoreOrderSettings ?? false) });\n return;\n }\n }\n}\n\nexport default CartIcon;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLineItemComponent, ICartlineResourceString } from '@msdyn365-commerce/components';\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n ProductAvailableQuantity,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\n\nexport interface IFlyoutCartLineItemsProps {\n cartlines: CartLine[];\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n\n /**\n * GridSettings for the product image in cartline\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartline\n */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n removeButtonText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n maxCartlineQuantity: number;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isQuantityLimitsFeatureEnabled: boolean;\n\n outOfStockThreshold: number;\n isStockCheckEnabled: boolean;\n telemetryContent?: ITelemetryContent;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n}\n\nexport interface IFlyoutCartLineItemViewProps {\n cartline: React.ReactNode;\n remove: React.ReactNode;\n storeLocation: React.ReactNode;\n hasError: boolean;\n\n data: {\n product: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n outOfStockThreshold: number,\n productAvailability?: ProductAvailableQuantity\n): number => {\n if (isStockCheckEnabled) {\n if (\n !productAvailability ||\n !productAvailability.AvailableQuantity ||\n productAvailability.AvailableQuantity <= 0 ||\n productAvailability.AvailableQuantity <= outOfStockThreshold\n ) {\n return 0;\n }\n return productAvailability.AvailableQuantity - outOfStockThreshold;\n }\n\n return 0;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct,\n props: IFlyoutCartLineItemsProps,\n index: number,\n foundProductAvailability?: ProductAvailableQuantity,\n foundProductDeliveryOptions?: ProductDeliveryOptions\n): IFlyoutCartLineItemViewProps => {\n const { imageSettings, gridSettings, id, typeName, context, resources, removeButtonText, removeItemClickHandler } = props;\n\n const availableQuantityInStock = _getCartItemAvailableQuantity(\n props.isStockCheckEnabled,\n props.outOfStockThreshold,\n foundProductAvailability\n );\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Check if the product is service or not by product type\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n\n return {\n data: {\n product,\n cartline\n },\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n product,\n catalogs: props.catalogs\n }}\n currentQuantity={cartline.Quantity}\n maxQuantity={maxQuantity}\n isOutOfStock={!isServiceItem && props.isStockCheckEnabled ? availableQuantityInStock <= 0 : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={productUrl}\n context={context}\n resources={resources}\n key={`${index}-${productUrl}`}\n isQuantityEditable={false}\n primaryImageUrl={product.PrimaryImageUrl}\n displayMode='COMPACT'\n telemetryContent={props.telemetryContent}\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n deliveryLocation={_renderDeliveryLocation(cartline, props)}\n />\n ),\n remove: (\n <Button\n className='msc-cart-line__remove-item'\n onClick={onRemoveClickHandler}\n title={removeButtonText}\n {...removeCartItemAttribute}\n >\n {removeButtonText}\n </Button>\n ),\n storeLocation: _renderStoreLocation(cartline, props)\n };\n};\n\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\n let deliverylocation;\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartLine.ProductId;\n });\n }\n const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\n const location = delivery?.Description;\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n if (location) {\n deliverylocation = `${location}, ${orgUnitName}`;\n } else {\n deliverylocation = `${orgUnitName}`;\n }\n } else {\n deliverylocation = props.resources.shippingText;\n }\n return deliverylocation;\n};\n\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\n if (cartLine && cartLine.FulfillmentStoreId) {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\n\n if (orgUnitName) {\n return (\n <div className='msc-cart-line__bopis-method'>\n <span className='pick-up'>{orgUnitName}</span>\n </div>\n );\n }\n }\n\n return null;\n};\n\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n};\n\nconst _assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: IFlyoutCartLineItemsProps\n): IFlyoutCartLineItemViewProps[] | null => {\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\n\n if (!products || products.length === 0) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\n });\n }\n let foundProductDeliveryOption;\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n if (product) {\n reactNodes.push(\n _assembleNode(\n cartline,\n product,\n props,\n index,\n foundProductAvailability?.ProductAvailableQuantity,\n foundProductDeliveryOption\n )\n );\n }\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n */\n\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\n const { products, cartlines } = props;\n return _assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n ActiveCartProductsInput,\n QueryResultSettingsProxy,\n buildCacheKey,\n getActiveCartProductsAction\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Input class for pickup delivery options for items in cart.\n */\nexport class ProductPickUpOptionsForCartLineItems implements IActionInput {\n public readonly apiSettings: ICommerceApiSettings;\n\n public constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => buildCacheKey('ActiveCartLineItemsPickUpOptions', this.apiSettings);\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ActiveCartLineItemsPickUpOptions';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetPickUpOptionCartLineItems method.\n * @param inputData - The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nconst createInput = (inputData: ICreateActionContext<IGeneric<IAny>>) => {\n return new ProductPickUpOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetPickUpOptionCartLineItems data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Order Template object.\n */\nexport async function getPickUpOptionsForCartLineItems(\n input: ProductPickUpOptionsForCartLineItems,\n context: IActionContext\n): Promise<ProductDeliveryOptions[]> {\n // If no input is provided fail out\n if (!input.apiSettings.channelId) {\n throw new Error('[getPickUpOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(context);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), context);\n const filterOption = 4;\n const response: ProductDeliveryOptions[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code.\n if (cart === undefined || !ArrayExtensions.hasElements(products)) {\n return Promise.resolve(response);\n }\n\n const pickupoptions = await ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n products.map(product => product.RecordId),\n {},\n filterOption\n );\n\n return pickupoptions;\n}\n\n/**\n * The GetPickupOptionCartLineItems Data Action\n * Returns pickup options.\n */\nexport const getPickUpOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-pickup-options-for-cartlines',\n action: getPickUpOptionsForCartLineItems as IAction<ProductDeliveryOptions[]>,\n input: createInput\n});\n\nexport default getPickUpOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n });\n\n return reactNodes;\n};\n\nconst _assembleGroupInvoiceCartlines = (\n cartLines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (cartLines && cartLines.length > 0) {\n // Create invoice cartLines group\n const carLineViewProps = assembleCartlines(cartLines, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n }\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines, hasInvoiceLine } = props;\n return hasInvoiceLine\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\n : _assembleGroupCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise<IPromotionData> {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n ILinesAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult,\n PromoCodeComponent,\n SaveCartToOrderTemplateComponent\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, getUrlSync, IImageSettings, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\nimport { FeatureState, ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory,\n ProductPickUpOptionsForCartLineItems,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant,\n Waiting,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-cartlines';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps<ICartData> {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode[];\n ExpressCheckoutSectionWrapper: INodeProps;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: CartLineValidationResultsByLineId;\n promotionData: IPromotionData;\n isCartValid: boolean;\n productPickUpOptions?: ProductDeliveryOptions[];\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent<ICartProps<ICartData>>}\n */\n@observer\nclass Cart extends React.Component<ICartProps<ICartData>> {\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps<ICartData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n\n this.state = {\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true,\n productPickUpOptions: undefined,\n cartlinesErrors: {}\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise<void> {\n this._isMounted = true;\n const {\n config,\n context: { actionContext }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled =\n (await this.getOrderQuantityLimitsFeatureFlag()) || (await this._isChannelLimitsFeatureEnabled());\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\n }\n }\n );\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps<ICartData>, nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode\n );\n\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title: <h1 className='msc-cart__heading'>{resources.cartTitle}</h1>,\n cart: this.props.data.cart.result,\n CartlinesWrapper: { className: 'msc-cartline-wraper' },\n OrderSummaryWrapper: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary-wrapper' : 'msc-order-summary-wrapper' },\n OrderSummaryItems: { className: cart?.hasInvoiceLine ? 'msc-invoice-summary__items' : 'msc-order-summary__items' },\n cartlines: cartLines,\n cartLinesGroup,\n promoCode: this._getPromoCode(),\n promotionOptions: this._getPromotions(),\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry: this.props.telemetry,\n id: this.props.id,\n multiplePickUpEnabled,\n removePromoAriaLabelFormat: resources.removePromoAriaLabelFormat,\n orderSummaryHeading: ArrayExtensions.hasElements(cart?.cart.CartLines) ? (\n cart?.hasInvoiceLine ? (\n <h2 className='msc-invoice-summary__heading'>{resources.invoiceSummaryTitle}</h2>\n ) : (\n <h2 className='msc-order-summary__heading'>{resources.orderSummaryTitle}</h2>\n )\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: !isCartEmpty ? (\n <Button\n disabled={hasError}\n className='msc-cart__btn-checkout'\n href={checkoutURL}\n title={resources.checkoutButtonTitle}\n {...checkoutBySignInAttributes}\n >\n {resources.checkoutButtonTitle}\n </Button>\n ) : null,\n checkoutAsGuestButton:\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\n <Button\n disabled={hasError}\n className='msc-cart__btn-guestcheckout'\n href={guestCheckoutUrl}\n title={resources.guestCheckoutButtonTitle}\n {...checkoutByGuestAttributes}\n >\n {resources.guestCheckoutButtonTitle}\n </Button>\n ) : null,\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: (\n <Button\n className='msc-cart__btn-backtoshopping'\n {...backtoShoppingAttributes}\n href={backToShoppingUrl}\n title={resources.backToShoppingButtonTitle}\n >\n {resources.backToShoppingButtonTitle}\n </Button>\n ),\n createTemplateFromCartButton:\n this._displayAddCartToTemplate() && products ? (\n <SaveCartToOrderTemplateComponent\n addToOrderTemplateDialogResources={this._generateAddToOrderTemplateDialogResources(resources)}\n createOrderTemplateDialogResources={this._generateOrderTemplateNameDialogResources(resources)}\n linesAddedToOrderTemplateDialogResources={this._generateLinesAddedToOrderTemplateDialogResources(resources)}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n )}\n createOrderTemplateFromCartButton={resources.createOrderTemplateFromCartButton}\n createOrderTemplateFromCartButtonTooltip={resources.createOrderTemplateFromCartButtonTooltip}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled || false}\n catalogId={currentCatalogId}\n data={{\n orderTemplates: this.props.data.orderTemplates.result!,\n cartLines: this.props.data.cart.result!.cart.CartLines!,\n customerInformation: this.props.data.customerInformation.result\n }}\n />\n ) : null,\n checkoutBlockedDueToUnavailableFunds: null,\n storeSelector:\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: <Waiting className='msc-waiting-circular msc-waiting-lg' />,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n if (\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\n this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\n this.props.data.customerInformation.result\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null,\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\n ) {\n const { resources } = this.props;\n\n if (\n ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\n ) {\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors =\n (cartLines &&\n cartLines\n .map(cartline => {\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError =\n cartline.data && cartline.data.product?.Name\n ? `${cartline.data.product.Name}: ${cartline.error}`\n : cartline.error;\n\n return (\n <div key={fullError} className='msc-alert__line'>\n {fullError}\n </div>\n );\n }\n\n return null;\n })\n .filter((line): line is JSX.Element => !!line)) ||\n [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n <div className='msc-alert__header' aria-hidden='true'>\n <span className='msi-exclamation-triangle' />\n <span>{this.props.resources.outOfStockErrorMessageHeader}</span>\n </div>\n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine\n ? InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\n ? OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry,\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n })\n : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return (\n cart && (\n <PromoCodeComponent\n cart={cart}\n promoCodeHeadingText={resources.promoCodeHeadingText}\n promoPlaceholderText={resources.promoPlaceholderText}\n promoCodeApplyButtonText={resources.promoCodeApplyButtonText}\n appliedPromoCodeHeadingText={resources.appliedPromoCodeHeadingText}\n collapseTimeOut={350}\n removePromoAriaLabelFormat={resources.removePromoAriaLabelFormat}\n removePromoText={resources.removePromoText}\n invalidPromoCodeErrorText={resources.invalidPromoCodeErrorText}\n failedToAddPromoCodeErrorText={resources.failedToAddPromoCodeErrorText}\n failedToRemovePromoCodeErrorText={resources.failedToRemovePromoCodeErrorText}\n duplicatePromoCodeErrorText={resources.duplicatePromotionErrorText}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n telemetryContent={this.telemetryContent}\n />\n )\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: ICartResources\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n this.props.data.featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled ||\n false;\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\n ? CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\n */\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\n */\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\n */\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result\n .removeCartLines(input)\n .then(() => {\n this.validateCart().catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity\n )\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch(error => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n this.setState({\n cartlinesErrors: {}\n });\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineValidationResult = {\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\n ValidationFailures: [\n {\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\n ? cartActionResult.validationResults[0].ErrorContext\n : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n ]\n };\n\n this.setState({\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise<void> {\n if (!this.isQuantityLimitsFeatureEnabled) {\n this.setState({ cartlinesErrors: {}, isCartValid: true });\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(cart, telemetry, context, true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ cartlinesErrors: {}, isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n try {\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n\n try {\n const customerInfo = await this.props.data.customerInformation;\n return (\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise<boolean> {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const { featureState } = this.props.data;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n return this.props.data.products &&\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\n cart &&\n cart.cart.CartLines &&\n cart.cart.CartLines.length > 0 &&\n this.props.data.channelDeliveryOptionConfig?.result\n ? CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n hasInvoiceLine: cart?.hasInvoiceLine || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites,\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n}\n\nexport default Cart;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (\n cartLines: ICartlinesViewProps[] | undefined,\n cartEmptyText: string,\n CartlinesWrapper: INodeProps,\n storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode,\n waitingComponent: React.ReactNode,\n cartLoadingStatus: string,\n cartDataResult: boolean\n): JSX.Element[] | JSX.Element => {\n if (cartLoadingStatus) {\n return <>{cartLoadingStatus}</>;\n }\n if (cartLines) {\n return cartLines.map(cartLine => {\n return (\n <div className='msc-cart-lines-item' key={`${cartLine.cartlineId ?? ''}-${MsDyn365.isBrowser.toString()}`}>\n {cartLine.cartline}\n {storeSelector && cartLine.pickUpInStore ? (\n <Node {...cartLine.pickUpInStore.ContainerProps}>{cartLine.pickUpInStore.defaultComponent}</Node>\n ) : null}\n {cartLine.addToOrderTemplate ? (\n <Node className='msc-cart-line__extra-actions'>\n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n </Node>\n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n </>\n )}\n </div>\n );\n });\n }\n return cartDataResult ? (\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>{cartEmptyText}</p>\n {backToShoppingButton}\n </div>\n ) : (\n <>{waitingComponent}</>\n );\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n <Node {...errorData.Wrapper}>\n {errorData.header}\n {errorData.errors}\n </Node>\n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (\n orderSummaryLines: IOrderSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n <Node {...promotions.promotionMessageWrapper}>\n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n <Node className='msc-cart-lines-group-wraper__bopis-heading-title'>\n {isBopisSelected ? (\n <p className='msc-cart-lines-group-wraper__bopis-heading-title-st'>\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n </p>\n ) : null}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (\n pickUpText: string,\n shippingText: string,\n emailShippingText: string,\n titleSeparate: string,\n cartLine: ICartlinesViewProps,\n emailDeliveryModeCode?: string\n) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n }\n\n return (\n <>\n <div className='msc-cart-lines-group-wraper__bopis-heading'>\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}-icon`} />\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}`}>{groupTitle}</p>\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n </div>\n </>\n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n <div className='msc-cart-lines-group'>\n {props.cartLinesGroup.map(cartlines => {\n return (\n <div key={cartlines[0].cartlineId} className='msc-cart-lines-group-wraper'>\n {renderCartLinesGroupHeader(\n props.resources.pickUpText,\n props.resources.shippingText,\n props.resources.emailshippingText,\n props.resources.titleSeparate,\n cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\n )}\n {_renderCartlines(\n cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n </div>\n );\n })}\n </div>\n );\n }\n return props.cartDataResult ? (\n <div className='msc-cartline-wraper'>\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>{props.resources.emptyCartText}</p>\n {props.backToShoppingButton}\n </div>\n </div>\n ) : (\n <>{props.waitingComponent}</>\n );\n};\n\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => (\n <div className={props.className} id={props.id} {...props.renderModuleAttributes(props)}>\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? (\n renderCartLinesGroup(props)\n ) : (\n <Node {...props.CartlinesWrapper}>\n {_renderCartlines(\n props.cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n </Node>\n )}\n {props.orderSummaryHeading && (\n <Node {...props.OrderSummaryWrapper}>\n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\n <Node {...props.ExpressCheckoutSectionWrapper}>{props.expressCheckoutButton}</Node>\n ) : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n </Node>\n )}\n {props.storeSelector}\n </div>\n);\n\nexport default CartView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent<HTMLElement>): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: { promotionLinkText, promotionPopupHeading },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n <span className='msi-promotion-icon' />\n <span> {props.resources.promotionStringHeading}</span>\n </>\n ),\n promotionSeeAllLink: (\n <a className='msc-cart__promotion_link' tabIndex={0} role='link' onClick={onSeeAllClick}>\n {` `}\n {promotionLinkText} {` `}\n </a>\n ),\n promotionDialog: (\n <Modal isOpen={showPromotionPopup} className={`${className}`} toggle={onCloseButtonClick}>\n <ModalHeader className={`${className}__dialog__header`} toggle={onCloseButtonClick}>\n <h5 id={titleId} className='msc-cart__promotion-popup_title'>\n {promotionPopupHeading}\n </h5>\n </ModalHeader>\n <ModalBody className={`${className}__dialog__body`}>\n <ul>\n {promotions.map(_promotion => {\n return (\n <li className='msc-cart__promotion-popup_name' key={_promotion.LineId}>\n {_promotion.Promotion?.OfferName} {` `}\n </li>\n );\n })}\n </ul>\n </ModalBody>\n <ModalFooter className={`${className}__dialog__footer`} />\n </Modal>\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 {\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n CartLineItemComponent,\n IAddToOrderTemplateDialogResources,\n ICartlineResourceString,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult\n} from '@msdyn365-commerce/components';\nimport MsDyn365, {\n IAny,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageSettings,\n ITelemetry,\n TelemetryEvent,\n isChannelTypeB2B\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResultsByLineId,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n isCartLineItemPickUpType,\n ObjectExtensions,\n OrderTemplate,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: CartLineValidationResultsByLineId;\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n retailMulitplePickupFeatureState?: boolean;\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext<IGeneric<IAny>>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n hasInvoiceLine?: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult<IProductInventoryInformation[]>;\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogId?: number;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n productAvailability: IProductInventoryInformation | undefined\n): number => {\n if (\n !isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\n ) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\nconst _getErrorMessage = (\n availableQuantityInStock: number,\n currentQuantity: number,\n props: ICartLineItemsProps,\n shouldSkipStockCheck: boolean,\n cartLine: CartLine,\n lineId: string | undefined,\n foundProductAvailability?: IProductInventoryInformation\n): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n // check availability passed as prop for each cartline\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n if (foundProductAvailability === undefined) {\n finalErrorMessages.push(props.outOfStockText);\n return finalErrorMessages.toString();\n }\n }\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\n if (errorsFoundByLineId !== undefined) {\n for (const i of errorsFoundByLineId) {\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\n i.ValidationFailures.forEach(validation => {\n if (validation.ErrorContext !== undefined) {\n finalErrorMessages.push(validation.ErrorContext);\n }\n });\n }\n }\n }\n\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n productPickUpOptions?: ProductDeliveryOptions\n): ICartlinesViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler,\n moveToWishlistSuccessHandler,\n addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources,\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText,\n removeFromWishlistButtonText,\n orderTemplates,\n customerInformation,\n wishlists,\n defaultWishlistName,\n storeSelectorModuleId,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\n\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\n ? undefined\n : _getErrorMessage(\n availableQuantityInStock,\n cartline.Quantity!,\n props,\n shouldSkipStockCheck,\n cartline,\n cartline.LineId,\n foundProductAvailability\n );\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\n : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected =\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\n 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError:\n (!shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false) ||\n (!ObjectExtensions.isNullOrUndefined(errorMessage) && !StringExtensions.isNullOrEmpty(errorMessage)),\n cartline: (\n <CartLineItemComponent\n data={{\n cartLine: cartline,\n cartState: props.cartState,\n product,\n catalogs: props.catalogs\n }}\n currentQuantity={cartline.Quantity}\n maxQuantity={maxQuantity}\n isOutOfStock={!shouldSkipStockCheck && props.isStockCheckEnabled ? availableQuantityInStock <= 0 : false}\n gridSettings={gridSettings}\n imageSettings={imageSettings}\n id={id}\n typeName={typeName}\n productUrl={productUrl}\n context={context}\n resources={resources}\n key={`${index}-${productUrl}`}\n lineIndex={index}\n isQuantityEditable={!ObjectExtensions.isNullOrUndefined(product)}\n quantityOnChange={props.updateCartLinesQuantitySuccessHandler}\n primaryImageUrl={product?.PrimaryImageUrl}\n errorMessage={errorMessage}\n inventoryInformationLabel={inventoryLbl}\n inventoryLabelClassName={inventoryCode}\n isCartStateReady={props.cartState?.status === 'READY'}\n showShippingChargesForLineItems={props.showShippingChargesForLineItems}\n telemetryContent={props.telemetryContent}\n channelDeliveryOptionConfig={props.channelDeliveryOptionConfig}\n priceCurrency={context.request.channel?.Currency}\n />\n ),\n pickUpInStore: product\n ? PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: productPickUpOptions,\n pickupDeliveryModeCode:\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\n locationChangedHandler: props.locationChangedHandler\n })\n : undefined,\n remove: (\n <Button className='msc-cart-line__remove-item' onClick={onRemoveClickHandler} title={removeButtonText} {...attributes}>\n {removeButtonText}\n </Button>\n ),\n addToWishlist:\n isAuthenticated && product && !isCustomPriceSelected ? (\n <AddToWishlistComponent\n className='msc-cart-line__add-to-wishlist'\n addToWishlistButtonText={addToWishlistButtonText}\n removeFromWishlistButtonText={removeFromWishlistButtonText}\n context={context}\n id={id}\n key={cartline.LineId}\n typeName={typeName}\n nameOfWishlist={nameOfWishlist}\n cartline={cartline}\n showButtonText\n showStatusMessage={false}\n showRemoveButton={false}\n showButtonTooltip={false}\n ariaRole='button'\n data={{\n wishlists,\n product\n }}\n onSuccess={moveToWishlistSuccessHandler}\n />\n ) : (\n undefined\n ),\n addToOrderTemplate:\n isAuthenticated && orderTemplates && product ? (\n <AddToOrderTemplateComponent\n className={classnames('msc-cart-line__add-to-order-template', isCustomPriceSelected ? 'disabled' : '')}\n addToOrderTemplateButtonText={addToOrderTemplateButtonText}\n addToOrderTemplateButtonTooltip={addToOrderTemplateButtonTooltip}\n addToOrderTemplateDialogResources={addToOrderTemplateDialogResources}\n createOrderTemplateDialogResources={createOrderTemplateDialogResources}\n itemAddedToOrderTemplateDialogResources={itemAddedToOrderTemplateDialogResources}\n duplicateItemsWhenAddingToOrderTemplateDialogResources={duplicateItemsWhenAddingToOrderTemplateDialogResources}\n data={{ product, quantity: cartline.Quantity || 1, orderTemplates, customerInformation }}\n context={context}\n showButtonText\n shouldShowButtonFailedTooltip={isCustomPriceSelected}\n disableButton={isCustomPriceSelected}\n id={id}\n typeName={typeName}\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value\n showButtonTooltip={!props.context.app.config.disableTooltip || false}\n imageSettings={props.imageSettings !== undefined ? props.imageSettings : undefined}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogFeatureEnabledInHq || false}\n catalogId={cartline.CatalogId}\n />\n ) : (\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n\n // check if cartlineitem is pickup item\n const isPickUpItem = isCartLineItemPickUpType(\n cartline,\n props.retailMulitplePickupFeatureState,\n props.channelDeliveryOptionConfig,\n props.pickupDeliveryModeCode\n );\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n if (!props.shouldIgnoreWarehouse && isPickUpItem) {\n // check warehouse only if siteBuilder setting is not \"Based on aggregate for shipping and pickup warehouses\" and cartlineitem is pickupitem\n return (\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\n );\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartline.ProductId;\n });\n }\n\n let productPickUpOptions;\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n DeliveryOption,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n retailMulitplePickupFeatureState?: boolean;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (\n orgUnitLocation: OrgUnitLocation,\n cartState: ICartState | undefined,\n cartline: CartLine,\n deliveryMode?: string\n ) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager\n .openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined\n ): JSX.Element => {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n <label className='msc-cart-line__bopis-shipping'>\n <input\n id={`ms-cart-bopis-ship-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(false)}\n value={shipItText}\n checked={!bopisSelected}\n aria-checked={!bopisSelected}\n key={`${cartLine.LineId}-shipit`}\n />\n {shipItText}\n </label>\n <label className='msc-cart-line__bopis-store-pickup'>\n <input\n id={`ms-cart-bopis-pickup-option-${cartLine.LineId}`}\n type='radio'\n name={`shippingType ${cartLine.LineId}`}\n onChange={toggleBOPIS(true)}\n value={pickupInStoretext}\n checked={bopisSelected}\n aria-checked={bopisSelected}\n key={`${cartLine.LineId}-pickup`}\n />\n {pickupInStoretext}\n </label>\n {cartLine.FulfillmentStoreId ? (\n <div className='msc-cart-line__bopis__fullfilment'>\n <span className='msc-cart-line__bopis__fullfilment-store'>{orgUnitName}</span>\n <button className='msc-cart-line__bopis-changestore btn' onClick={toggleBOPIS(true)}>\n {changeStoreText}\n </button>\n </div>\n ) : null}\n </>\n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n /**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\n const matchDeliveryOptions = (\n productdeliveryOptions: DeliveryOption[] | undefined,\n storePickUpOptionList: string[] | undefined\n ): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(\n props.cartline,\n props.shipitText,\n props.pickUpInStoreText,\n props.changeStoreText,\n props.orgUnitLocations\n ),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\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 { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IInvoiceSummaryProps {\n orderTotalLabel: string;\n invoiceLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n id: string;\n typeName: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n}\n\nexport interface IInvoiceSummaryLines {\n orderTotal: React.ReactNode;\n invoices: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IInvoiceSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\nconst InvoiceSummaryLine: React.FC<IInvoiceSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n <p className={`msc-invoice-summary__line-${cssLabel}`}>\n <span className=\"msc-invoice-summary__label\">{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className=\"msc-invoice-summary__value\"\n />\n ) : (\n <span className=\"msc-invoice-summary__value\">{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\n <InvoiceSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nexport const InvoiceSummary = (props: IInvoiceSummaryProps) => {\n const { TotalAmount, CartLines } = props.cart;\n const invoiceLines = CartLines?.filter(cartLine => cartLine.IsInvoiceLine);\n const reactNodes: IInvoiceSummaryLines = {\n invoices: invoiceLines?.map((invoiceLine: CartLine) => {\n return _buildPaymentSummarySection(\n props,\n invoiceLine.InvoiceAmount,\n format(props.invoiceLabel, invoiceLine.InvoiceId),\n 'invoice'\n );\n }),\n orderTotal: _buildPaymentSummarySection(props, TotalAmount, props.orderTotalLabel, 'total')\n };\n\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildPaymentSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildPaymentSummarySection(\n props,\n -giftCardAmount,\n props.giftcardLabel || 'Gift card amount',\n 'gift-card'\n );\n }\n\n reactNodes.orderTotal = _buildPaymentSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n props.orderTotalLabel,\n 'total'\n );\n }\n\n return reactNodes;\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 { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isTaxIncludedInPrice?: boolean;\n isShowTaxBreakup?: boolean;\n customerAccountLabel?: string;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n customerAccount?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n priceCurrency?: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC<IOrderSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel,\n priceCurrency\n}) => {\n return (\n <p className={`msc-order-summary__line-${cssLabel}`}>\n <span className=\"msc-order-summary__label\">{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className=\"msc-order-summary__value\"\n currencyCode={priceCurrency}\n />\n ) : (\n <span className=\"msc-order-summary__value\">{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\n <OrderSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n priceCurrency={props.channelConfiguration.Currency}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computedCustomerAccountAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.customerAccountAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (\n cart: Cart,\n channelConfiguration: ChannelConfiguration,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n retailMultiplePickUpOptionEnabled?: boolean,\n isTaxIncludedInPrice?: boolean,\n isShowTaxBreakup?: boolean\n): IShippingOrderLine => {\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n const taxOnShippingCharge = cart.TaxOnShippingCharge !== undefined ? cart.TaxOnShippingCharge : 0;\n const shippingChargeAmount = cart.ShippingChargeAmount !== undefined ? cart.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True shippingChargeAmount\n // True True shippingChargeAmount\n // True false shippingChargeAmount + taxOnShippingCharge\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n let freightFee: number | undefined = 0;\n if (isTaxIncludedInPrice === undefined || isShowTaxBreakup === undefined) {\n freightFee = cart.ShippingChargeAmount;\n } else {\n freightFee = isTaxIncludedInPrice && !isShowTaxBreakup ? shippingChargeAmount + taxOnShippingCharge : cart.ShippingChargeAmount;\n }\n const canShip = deliveryModes.some(\n deliveryMode =>\n !(\n deliveryMode !== '' &&\n (deliveryMode ===\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) ||\n deliveryMode === emailDeliveryModeCode)\n )\n );\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(\n deliveryMode =>\n !!deliveryMode &&\n deliveryMode !==\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) &&\n deliveryMode !== emailDeliveryModeCode\n );\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (\n deliveryMode?: string,\n featureSate: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n};\n\n// eslint-disable-next-line complexity\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const {\n SubtotalAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n SubtotalAmountWithoutTax,\n TaxAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n TaxOnNonShippingCharges,\n DiscountAmount = 0,\n TotalAmount,\n OtherChargeAmount\n } = props.cart;\n\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(\n props.cart,\n props.channelConfiguration,\n props.channelDeliveryOptionConfig,\n props.retailMultiplePickUpOptionEnabled,\n props.isTaxIncludedInPrice,\n props.isShowTaxBreakup\n );\n\n let reactNodes: IOrderSummaryLines;\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n if (props.isTaxIncludedInPrice === undefined || props.isShowTaxBreakup === undefined) {\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n } else {\n const otherChargeAmount = OtherChargeAmount !== undefined ? OtherChargeAmount : 0;\n const taxOnNonShippingCharges = TaxOnNonShippingCharges !== undefined ? TaxOnNonShippingCharges : 0;\n const isTaxGreaterThanZero = TaxAmount !== undefined && TaxAmount > 0;\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True otherChargeAmount\n // True True otherChargeAmount\n // True false otherChargeAmount+TaxOnNonShippingCharges\n\n const otherChargeAmountTotal =\n props.isTaxIncludedInPrice && !props.isShowTaxBreakup ? otherChargeAmount + taxOnNonShippingCharges : otherChargeAmount;\n\n const subtotalAmountActual = props.isTaxIncludedInPrice && props.isShowTaxBreakup ? SubtotalAmountWithoutTax : SubtotalAmount;\n\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, subtotalAmountActual, 'sub-total', props.subTotalLabel),\n tax: props.isShowTaxBreakup\n ? _buildOrderSummarySection(\n props,\n hasDeliveryMethod || isTaxGreaterThanZero ? TaxAmount : undefined,\n 'tax-amount',\n props.taxLabel\n )\n : '',\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, otherChargeAmountTotal, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n }\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const customerAccountAmount = _computedCustomerAccountAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount - customerAccountAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n if (customerAccountAmount > 0) {\n reactNodes.customerAccount = _buildOrderSummarySection(\n props,\n -customerAccountAmount,\n 'customer-credit-amount',\n props.customerAccountLabel || 'Customer Credit amount'\n );\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n 'total',\n props.orderTotalLabel\n );\n }\n\n if (DiscountAmount > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmount, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\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 { AttributeDataType, DisplayTemplate, 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 { getIntegerRangeName, isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n rangeDisplayType?: number | undefined;\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, index) => {\n const rangeParentDisplay = refinerHierarchy.filter(p => p.RecordId === selectedRefiner.RefinerRecordId);\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner,\n // parameter to store Display Template type\n rangeDisplayType: rangeParentDisplay[0]?.DisplayTemplateValue || undefined\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 // Get range value for Range display and integer type only (not for Integer with TextBox(4) display)\n const rangeInteger =\n item.value.DataTypeValue === AttributeDataType.Integer &&\n item.rangeDisplayType &&\n item.rangeDisplayType === DisplayTemplate.Range &&\n item.value.RefinerRecordId !== 0;\n const newIntRange = rangeInteger\n ? item.key\n : item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString || item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString;\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 {newIntRange}\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, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n let parent: IProductRefinerHierarchy | undefined;\n if (refinerHierarchy && refinerHierarchy.find) {\n 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(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\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 // Adding integer range format\n if (\n productRefinerValue.DataTypeValue === AttributeDataType.Integer &&\n parent?.DisplayTemplateValue === DisplayTemplate.Range &&\n productRefinerValue.RefinerRecordId !== 0\n ) {\n refinerValueName = getIntegerRangeName(productRefinerValue);\n return refinerValueName;\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\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(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\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 * 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 { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isUndefined } from 'lodash';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { IRefineItemState } from './refine-item';\nimport { isCustomRangeTypeIntegerSelected } from './utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\nexport type RangeRefineItemInputType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemInputProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n rangeType: RangeRefineItemInputType;\n\n /**\n * The telemetry content\n */\n onToggle(notfication: Readonly<IRefineItemToggleNotification>): void;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemInputState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n invalidData: boolean | undefined;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItemInput extends React.Component<IRangeRefineItemInputProps, IRangeRefineItemInputState> {\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 public constructor(props: IRangeRefineItemInputProps) {\n super(props);\n this._changeMinInputRange = this._changeMinInputRange.bind(this);\n this._changeMaxInputRange = this._changeMaxInputRange.bind(this);\n this._applyCustom = this._applyCustom.bind(this);\n\n this.minInput = React.createRef<HTMLInputElement>();\n this.maxInput = React.createRef<HTMLInputElement>();\n let initialMin = '';\n let initialMax = '';\n const { selectedRefinementCriterion, parentProductRefinerHierarchy } = this.props;\n if (selectedRefinementCriterion) {\n initialMin = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.LeftValueBoundString || '';\n initialMax = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.RightValueBoundString || '';\n }\n\n this.state = {\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n invalidData: !(initialMin && initialMax),\n isChecked: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemInputProps, nextState: IRangeRefineItemInputState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n nextState.invalidData = !(nextState.selectedMin && nextState.selectedMax);\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemInputProps): void {\n if (previousProps !== this.props) {\n this.updateInputRangerProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n return undefined;\n }\n\n // /**\n // * Function to update slider props.\n // */\n private updateInputRangerProps(): void {\n const selectedMin = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.LeftValueBoundString;\n const selectedMax = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.RightValueBoundString;\n this.setState({ selectedMin, selectedMax });\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { 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 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 return (\n <li className='ms-refine-submenu-item list-group-item refine-submenu__item--range--custom'>\n <form className={`ms-refine-submenu__input-range-refiner`} {...formAttrs}>\n <div>\n <input\n className={minInputClassName}\n placeholder={'Min'}\n onChange={this._changeMinInputRange}\n value={this.state.selectedMin}\n ref={this.minInput}\n />\n <span>{' - '}</span>\n <input\n className={maxInputClassName}\n placeholder={'Max'}\n onChange={this._changeMaxInputRange}\n value={this.state.selectedMax}\n ref={this.maxInput}\n />\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 </div>\n <div>\n <Button title={'Apply'} className='applyBtn' onClick={this._applyCustom} disabled={this.state.invalidData}>\n {'Apply'}\n </Button>\n </div>\n </form>\n </li>\n );\n }\n\n private _applyCustom(event: React.MouseEvent<HTMLElement>): void {\n const selectedMinValue = this._getInputWithoutFormatting(this.state.selectedMin || '');\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy } = this.props;\n const max = this.state.selectedMax;\n\n const maxNum = max ? Number(max) : undefined;\n const productRefinerValue: ProductRefinerValue = {\n RefinerRecordId: parentProductRefinerHierarchy.Values[0].RefinerRecordId,\n LeftValueBoundString: this.state.selectedMin,\n RightValueBoundString: this.state.selectedMax,\n DataTypeValue: parentProductRefinerHierarchy.DataTypeValue,\n RefinerSourceValue: parentProductRefinerHierarchy.Values[0].RefinerSourceValue\n };\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true\n });\n }\n }\n\n private _changeMinInputRange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({\n selectedMin: event.target.value.trim()\n });\n }\n\n private _changeMaxInputRange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({\n selectedMax: event.target.value.trim()\n });\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 _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","/*!\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 {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} 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';\nimport { getIntegerRangeName, isSingleSelectRangeTypeIntegerSelected } from './utilities';\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 if (\n parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n const rangeValue = getIntegerRangeName(productRefinerValue);\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={\n isSingleSelectRangeTypeIntegerSelected(selectedRefinementCriterion!, productRefinerValue)\n ? `ms-refine-submenu-item ${itemTypeClassName}-selected`\n : `ms-refine-submenu-item ${itemTypeClassName}-range`\n }\n role='radio'\n aria-label={refineMenuItemAriaLabel}\n aria-checked={!!selectedRefinementCriterion}\n {...attribute}\n {...attrs}\n >\n <span className='ms-refine-submenu-item__label' aria-hidden='true'>\n {rangeValue}\n {productRefinerValue.Count !== undefined && ` (${productRefinerValue.Count})`}\n </span>\n </a>\n </li>\n );\n } else {\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\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 {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} 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, isRangeTypeForInteger } from './utilities';\nimport RangeRefineItemInput from './range-refine-item-input';\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 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 (\n productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n // Check if is of integer range type\n if (isRangeTypeForInteger(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 let selectedRefinementCriterion: ProductRefinerValue | 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 selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\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 {productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range && (\n <RangeRefineItemInput\n parentProductRefinerHierarchy={productRefinerHierarchy}\n selectedRefinementCriterion={selectedRefinementCriterion}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n isDisabled={isDisabled}\n rangeType={'input'}\n key={productRefinerHierarchy.KeyName}\n />\n )}\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 { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\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\nexport interface IRefineItemData {\n sourceValue?: number;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n refinerItemId: number;\n dataTypeValue?: number;\n name: string;\n label: string;\n count?: number;\n isChecked: boolean;\n refineItemUrl?: string;\n minValue?: string;\n maxValue?: string;\n dimensionType?: DimensionTypes;\n rowNumber?: number;\n unitText?: string;\n updatedSliderMaxValue?: string;\n updatedSliderMinValue?: string;\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 dataTypeValue === AttributeDataType.Currency || dataTypeValue === AttributeDataType.Decimal;\n}\n\n/**\n * Checks if the data type value corresponds to a range type integer.\n * @param dataTypeValue\n */\nexport function isRangeTypeForInteger(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Checks if the data type value corresponds to a custom input box Range.\n * @param dataTypeValue\n */\nexport function isCustomRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy\n): boolean {\n return (\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion?.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n );\n}\n\n/**\n * Checks if the selectedRefinementCriterion is siingle type with API va;ues or custom type.\n * If custom type then RowNumber is null\n * @param dataTypeValue\n */\nexport function isSingleSelectRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n productRefinerValue: ProductRefinerValue\n): boolean {\n return (\n productRefinerValue.LeftValueBoundString === selectedRefinementCriterion?.LeftValueBoundString &&\n productRefinerValue.RightValueBoundString === selectedRefinementCriterion?.RightValueBoundString &&\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion !== undefined\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(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue,\n parent?: IProductRefinerHierarchy\n): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n // Distinguish by displaytype also\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n ((parent?.DisplayTemplateValue === DisplayTemplate.Range\n ? isRangeType(refinementCriterion.DataTypeValue)\n : isRangeTypeForInteger(refinementCriterion.DataTypeValue)) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getIntegerRangeName(productRefinerValue: ProductRefinerValue): string {\n let rangeValue = '';\n\n if (productRefinerValue.LeftValueBoundString === '' && productRefinerValue.RightValueBoundString !== '') {\n rangeValue = `< ${productRefinerValue.RightValueBoundLocalizedString || productRefinerValue.RightValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString === '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `> ${productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString !== '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `${productRefinerValue.LeftValueBoundLocalizedString ||\n productRefinerValue.LeftValueBoundString} - ${productRefinerValue.RightValueBoundString ||\n productRefinerValue.RightValueBoundString}`;\n }\n return rangeValue;\n}\n\n/**\n * Get input without formatting.\n * @param input - Input string.\n * @returns - Returns number.\n */\nexport function getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNumber = Number(input);\n if (!Number.isNaN(inputAsNumber)) {\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 = formattedPriceReverseLookup.get(input);\n // return reverseLookupResult || input;\n return input;\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n\n // Keeping only itemToggled value for integer-range type in currentRefinementCriteria\n if (\n itemToggleNotification.parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n itemToggleNotification.parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n currentRefinementCriteria = currentRefinementCriteria.filter(r => {\n return r.RefinerRecordId !== itemToggleNotification.productRefinerValue.RefinerRecordId;\n });\n }\n\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (\n isMatchingRefinementCriterion(\n itemToggleNotification.productRefinerValue,\n selectedCriterion,\n itemToggleNotification.parentProductRefinerHierarchy\n )\n ) {\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, itemToggleNotification.parentProductRefinerHierarchy)\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 {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput,\n ObjectExtensions\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 { action, 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 productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\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 channelInventoryConfiguration?: ChannelInventoryConfiguration;\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 private _isMounted: 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 channelInventoryConfiguration: undefined\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 this._isMounted = true;\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 const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\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 channelInventoryConfiguration\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 await this._updateVariantAvailability();\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 channelInventoryConfiguration\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 await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\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 productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): 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 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 /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n @action\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?.skip &&\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 = !ObjectExtensions.isNullOrUndefined(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 const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.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={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\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"],"names":["_assembleCartlines","cartlines","products","props","reactNodes","length","map","cartline","index","product","_getProduct","productId","undefined","find","RecordId","ProductId","foundProductAvailability","foundProductDeliveryOption","productAvailabilites","productAvailability","_productAvailability$","ProductAvailableQuantity","productDeliveryOptions","deliveryOption","push","_assembleNode","foundProductDeliveryOptions","_product$Behavior","_props$context","_product$Behavior2","_foundProductAvailabi","_props$cartState","imageSettings","gridSettings","id","typeName","context","resources","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateDialogResources","createOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","orderTemplates","customerInformation","wishlists","defaultWishlistName","storeSelectorModuleId","isAuthenticated","request","user","nameOfWishlist","Name","maxQuantity","_getCartItemMaxQuantity","maxCartlineQuantity","isStockCheckEnabled","productMaxQuantity","lineMaxQuantity","IsProductAvailable","AvailableQuantity","isQuantityLimitsFeatureEnabled","Behavior","MaximumQuantity","isServiceItem","ItemTypeValue","eoqQuantity","app","platform","enableDefaultOrderQuantityLimits","MultipleOfQuantity","errorMessage","_getErrorMessage","currentQuantity","lineIndex","finalErrorMessage","includeErrors","outOfStockText","outOfRangeOneText","outOfRangeFormatText","replace","toString","eoqErrorMessage","cartlinesErrors","filter","i","LineIndex","forEach","_i$DataValidationFail","_i$DataValidationFail2","_i$DataValidationFail3","DataValidationFailure","ErrorResourceId","ErrorContext","join","Quantity","payload","getPayloadObject","TelemetryEvent","RemoveFromCart","telemetryContent","attributes","getTelemetryAttributes","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","toLowerCase","data","error","React","CartLineItemComponent","cartLine","isOutOfStock","productUrl","getProductUrlSync","actionContext","key","isQuantityEditable","quantityOnChange","updateCartLinesQuantitySuccessHandler","primaryImageUrl","PrimaryImageUrl","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","cartState","status","showShippingChargesForLineItems","pickUpInStore","PickUpInStore","shipitText","shipItText","pickUpInStoreText","pickitUpText","changeStoreText","storeSelectorStateManager","orgUnitLocations","deliveryOptions","pickupDeliveryModeCode","locationChangedHandler","remove","Button","Object","assign","className","onClick","event","title","addToWishlist","AddToWishlistComponent","LineId","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","onSuccess","addToOrderTemplate","AddToOrderTemplateComponent","quantity","telemetry","CartLineItems","showStrikethroughPricing","originalPrice","getOriginalPrice","price","CustomerContextualPrice","Math","max","BasePrice","TradeAgreementPrice","AdjustedPrice","renderCurrentPrice","initialPrice","formatCurrency","itemProp","freePriceText","returnPrice","Intl","NumberFormat","cultureFormatter","locale","style","currency","currencyCode","currencyDisplay","format","_unused","renderCurrentPriceWithOriginalPrice","originalPriceText","currentPriceText","savingsText","msdyn365Commerce","createComponent","component","__assign","classnames","_toggleBOPIS","isBopisSelected","openDialog","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","onLocationSelected","async","orgUnitLocation","deliveryMode","updateCartLinePickupLocation","cartLineId","location","then","result","catch","Promise","resolve","_onLocationChangedCallback","DeliveryMode","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","retailMulitplePickupFeatureState","channelDeliveryOptionConfig","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","delivery","pickup","deliveryCode","Code","ArrayExtensions","hasElements","PickupDeliveryModeCodes","option","callbacks","toggleBopis","defaultComponent","_renderShippingMethod","pickupInStoretext","orgUnitName","bopisSelected","toggleBOPIS","type","name","onChange","value","checked","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","Description","ContainerProps","productPickUpOptions","_product$Dimensions","addToOrderTemplateButtonTooltip","hsoConfig","availableQuantityInStock","_getCartItemAvailableQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","shouldSkipStockCheck","ReleasedProductType","Service","IsInvoiceLine","estimatedDateProperty","ExtensionProperties","property","Key","estimatedDateValue","Value","StringValue","estimatedDate","StockThresholdprop","StockThresholdpropval","IntegerValue","StockThreshold","onhand","Number","ObjectExtensions","isNullOrUndefined","lineId","_props$productAvailab","finalErrorMessages","shouldIgnoreWarehouse","InventLocationId","WarehouseId","checkForErrors","ValidationResultsPairs","errorsFoundByLineId","ValidationFailures","validation","onRemoveClickHandler","onRemoveClickFunction","isCustomPriceSelected","Dimensions","dimension","DimensionTypeValue","DimensionValue","MsDyn365","isBrowser","isChannelTypeB2B","requestContext","_cartline$CatalogId","fullUrl","URL","window","href","searchParams","set","CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","hasError","catalogs","ariaRole","shouldShowButtonFailedTooltip","disableButton","config","disableTooltip","assembleCartlines","getProductByProductIdAndWarehouse","getProductByProductId","_productAvailability$2","_productAvailability$3","_cartline$WarehouseId","toUpperCase","CartLineGroupItems","hasInvoiceLine","_assembleGroupInvoiceCartlines","cartLines","carLineViewProps","_assembleGroupCartlines","getGroupByStorePickup","items","groupBy","item","groupDelivery","cartLinesGroup","entries","_ref","deliveryType","groupByDeliveryType","keys","getPromotionData","ctx","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","apiSettings","promotionOptions","exception","Cart","constructor","super","_isMounted","promotionPopupId","promotionLinkClick","this","setState","showPromotionDialog","state","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","removeItemFromCartHandler","cartlineToRemove","cart","input","cartLineIds","removeCartLines","validateCart","warning","debug","updateCartlineQuantity","cartlineToUpdate","cartLineQuantityUpdatedAsync","cartActionResult","message","_cartActionResult$err","lineUpdateFailure","validationResults","LocalizedMessage","errorDetails","fulfillmentStoreIdUpdated","getActiveCartProductsAction","ActiveCartProductsInput","getTelemetryObject","telemetryPageName","friendlyName","payLoad","bind","isCartValid","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","showAvailablePromotions","CartLines","reaction","_this$props$data$cart2","_this$props$data$cart3","ProductPickUpOptionsForCartLineItems","getPickUpOptionsForCartLineItems","componentWillUnmount","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$r","_cart$cart$CartLines","_this$props$data$prod","_this$props$data$feat","signInUrl","guestCheckoutUrl","getUrlSync","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","emailDeliveryModeCode","channel","EmailDeliveryModeCode","HSOConfigprop","channelConfiguration","HSOConfig","validInventoryAcrossCartLines","productAvailabilities","cartLineMap","Map","enableStockCheck","isValid","productIdWithErrors","IsGiftCardLine","has","_cartLineMap$get","_cartLine$Quantity2","cartLineTotal","get","delete","_cartLine$Quantity","productAvailabilityMap","Array","from","_cartLineMap$get2","cartLineQty","availableQuantity","line","cartLineProduct","isStockedItem","_cartLineProduct$Beha","IsStockedProduct","isEmailDelivery","shouldSkipInventoryCheck","validateCartLinesInventory","_isCheckoutBlockedDueToUnavailableFunds","some","RetailMultiplePickupFeatureState","featureState","multiplePickUpEnabled","IsEnabled","getCartLinesGroup","contentAction","etext","TelemetryConstant","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","viewProps","_objectSpread","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","disabled","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","slots","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","_generateOrderTemplateNameDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","checkoutBlockedDueToUnavailableFunds","checkoutBlockedDueToUnavailableFundsTitle","checkoutBlockedDueToUnavailableFundsMessage","storeSelector","waitingComponent","Waiting","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","renderView","_this$props$data$cart4","_cart$cart","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","promotionStringHeading","promotionSeeAllLink","tabIndex","role","promotionDialog","Modal","isOpen","toggle","ModalHeader","ModalBody","_promotion","_promotion$Promotion","Promotion","OfferName","ModalFooter","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithError","element","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","Wrapper","tag","Alert","color","assertive","outOfStockErrorMessageHeader","header","errors","isOboRequest","_this$props$data$cust","customerInfo","AllowOnAccountPayment","CreditLimit","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_this$props","_featureState$result","_this$props$context$r2","retailMultiplePickUpOptionEnabled","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","otherCharges","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","priceFree","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","_this$props$data$feat2","_this$props$data$cata","PickupDeliveryModeCode","modules","storeSelectorId","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","warehouseAggregation","sizeString","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","amountString","productDimensionTypeAmount","quantityDisplayString","quantityDisplayText","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","discountStringText","shippingChargesText","shippingCharges","salesAgreementPricePrompt","priceEditorResources","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","urlCheck","returnURL","origin","includes","validateCartAsync","AsyncResult","_this$props$context","defaultOrderQuantityLimitsFeatureConfig","_featureStatuses$find","featureStatuses","IsB2b","_this$props$data$feat3","_this$props$data$chan","_this$props$data$cata2","_this$props$data$chan2","_this$props$data$cart5","productDimensionTypeSize","cartLinesPickUpOptions","__decorate","observer","_renderCartlines","cartEmptyText","_cartLine$cartlineId","Node","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","groupTitle","StringExtensions","isNullOrEmpty","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","_props$cart","_props$cart2","errorData","renderModuleAttributes","_props$context$action","emailshippingText","emptyCartText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","giftCard","loyalty","_renderOrderSummarylines","orderSummaryLines","subtotal","shipping","otherCharge","tax","totalDiscounts","expandRefinersCount","expandedMenusOnLoad","Link","text","ariaLabel","ProductSearchResultItems","moduleType","moduleId","allowBackNavigation","ProductComponent","ratingAriaLabel","allowBack","FeatureSearchResultItem","productName","productRecordId","getProductPageUrlSync","fallbackImage","getFallbackImageUrl","ItemId","attribute","onTelemetryClick","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","featureSimilarLooksTitle","Title","Separator","separator","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","RangeRefineItem","_formattedPriceReverseLookup","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","isChecked","validationErrorMin","validationErrorMax","selectedMin","selectedMax","touchedMin","touchedMax","UnitText","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","isDisabled","formAttrs","rangeNameFormat","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onFocus","onBlur","ref","maxLabel","placeholder","placeholderTextMax","min","sliderId","ariaAttributes","minPrice","_formatPrice","maxPrice","selectedMinPrice","selectedMaxPrice","Slider","inForm","step","orientation","labels","labelId","labelString","labelPositioning","showLabels","showTooltip","sliderThumbs","minValueSliderThumbAriaLabel","ariaValueText","maxValueSliderThumbAriaLabel","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","currentTarget","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","selected","touched","validationError","validationErrorRange","amount","trace","priceAmount","minimumFractionDigits","e","formatPrice","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","document","getElementById","tooltip","computed","RefineItem","_onClick","preventDefault","anchorType","children","attrs","_objectWithoutProperties","_excluded","JSON","stringify","isSingleSelect","itemTypeClassName","SourceValue","Rating","LeftValueBoundLocalizedString","_getRefinerUrl","Count","_this$props$selectedR","_productRefinerValue$","refinerRating","parseInt","ratingRefiner","selectedRefinerValues","selectedRating","ratingComponentClass","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","urlBuilder","ChoiceSummary","closeButtonGlyph","stopPropagation","target","clearAll","getAttribute","indexOf","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedRefinersMap","selectedChoices","_getKeyForRefinerValue","clearAllText","label","classNames","choiceAriaLabel","clearAllAttributes","listItemProps","choiceFormat","choiceRangeValueFormat","refinerHierarchy","overallFormat","rangeFormat","refinerValueName","refinerName","parent","hierarchy","_get","innerText","trim","ModalToggle","innerRef","modalNode","autoFocus","applicationNode","returnFocusRef","returnRef","onModalToggle","zIndex","modalHeaderNode","modalTitle","modalFooterNode","modalCloseButtonText","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","ErrorMessage","SearchResultContainer","SearchResultContainer_1","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","_pageType","urlTokens","pageType","expandrefinerCount","_getActivePrice","listPageState","activeProducts","productRecIds","prod","projectDomain","ChannelId","channelId","catalogId","affliations","customerInput","GetCustomerInput","customer","getCustomer","CustomerAffiliations","affliation","aff","AffiliationId","RetailAffiliationId","CustomerId","AccountNumber","getActivePricesAsync","callerContext","queryResultSettings","Date","activePricesResponse","productPrices","activePrice","_activePrice$Customer","Price","Error","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","query","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","totalProductCount","count","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","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","itemsPerPage","skipCount","currentPageNumber","skip","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","url","qsp","startingItem","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","refiners","refiner","activeRefiners","activeFilters","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_getChoiceSummary","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","sortingCritera","Columns","searchConfiguration","mappedConfiguration","sortColumn","sortCriteria","activeSortColumn","parseQueryParam","activeMappedConfig","mappedSearchConfig","ColumnName","IsDescending","dropdownOption","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","_viewport","device","Type","_updateViewport","pending","validationErrorNotNumber","validationErrorNotRange","querySorting","sorting","parse","decodeURIComponent","pageSize","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","itemId","includeAttributes","getCollectionProducts","productResults","ex","featureProduct","listPageStateFeature","isMobile","static","nameTranslations","nameTranslation","Language","componentDidMount","_this$props$context$a","addEventListener","enableAffiliationBasedPricing","removeEventListener","searchProduct","errorText","breaCrumbType","breadcrumbType","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","FeatureSearchContainer","similarLookProduct","toggleModal","_getViewport","innerWidth","md","observable","slice","keyId","Single","refinersToBeUpdated","refinersLists","split","_refinerName","RangeInput","sortingCriteraValues","sort","a","b","localeCompare","compressedRefinerKeys","sortingColumns","compressedRefiners","compressedRefiner","refinerKey","compressRefiners","requestUrl","CittaRefiners","_onClearRefiners","_getSortingRefiner","sortByValues","_sortingCritera$Colum","sortingC","sortBy","DataValueType","RowNumber","_updateDropDown","dropdownOpen","_renderRefiners","refinersHeader","orderedRefiners","refinerCat","hiddenRefinersList","refinersToBeHidden","sortRefiner","submenu","CittaPicture","handleMoveHover","showHoverImg","handleMoveOut","_this$state","image1","image2","img1","img2","onMouseOver","onMouseOut","imageOrientation","onlineTags","salesLineTag","productImage1","productImage2","stockAvailabilities","_property$Value","_property$Value2","AttributeValues","TextValue","tagsToIgnore","salesLineTagKey","generateImageUrl","setTelemetryAttribute","pid","pname","mname","productImageSettings","_getLandscapeImageSettings","_renderLabel","AverageRating","toLocaleLowerCase","backgroundColor","_renderProductPlacementImage","_renderPrice","_renderSalesLineTag","_renderDescription","_renderRating","TotalRatings","_renderAvailabilities","sA","match","rating","ratingLabel","roundedRating","toFixed","description","totalRatings","numRatings","basePrice","adjustedPrice","PriceComponent","cmsImageSettings","xl","disableLazyLoad","getImageOrientation","createSearchResultModal","modalProps","createModalBody","renderRefineMenu","renderCategoryHierarchy","renderTitle","display","Module","liClass","renderProducts","CartView","cittaTelemetry","CittaTelemetry","cittaInstrumentationKey","createLogMessage","decodeURI","search","logMessage","_getImageSettings","_removeItemFromCartHandler","_validateCart","_moveToWishlistSuccessHandler","_updateCartlineQuantity","newQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","updateCartLineQuantity","_fulfillmentStoreIdUpdated","_renderErrorBlock","_renderGIftCardError","freightCalculationText","orLabel","_goToPreviousPage","_renderBOPISBlock","_cartResult$cart","retry","arguments","cartResult","cartVersion","Version","_cartResult","validationResult","validateForCheckoutAsync","Id","ValidationFailuresByCartLines","refreshCart","refreshError","validateError","back","shipToAddressDisplayText","pickUpAtStoreWithLocationText","_props$cartlines","hasGiftCard","arr","val","arrVal","_arrVal$data","cartlinesLength","giftCardErrorMessage","_props$data$cart$resu","OrderSubTotal","NetPrice","subTotalHeadingLabel","_renderSubTotal","hideTaxLine","_props$data$cart$resu2","_props$data$cart$resu3","_props$data$cart$resu4","TotalAmount","_renderAmountDue","_renderUnder200sError","_props$data$cart$resu5","SubtotalAmount","market","oun","isB2BI","minimumOrder","discountLevel","LineDiscountGroup","isB2B","_props$data$cart$resu6","_props$data$cart$resu7","_props$data$cart$resu8","_props$data$cart$resu9","DiscountAmount","TaxAmount","_renderTax","_props$data$cart$resu10","_props$data$cart$resu11","_props$data$cart$resu12","amountDueLabel","_props$data$cart$resu13","DiscountAmountWithoutTax","totalSavings","_renderTotalSavings","propsContext","shouldRetry","_validationResult$Val","CartsDataActions","bypassCache","ValidationResultsByLineId","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","updateLineResult","warehouseId","targetWarehouseValue","InventoryLocationId","getMiniCartData","miniCartData","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","CartIcon","getSortedCartLines","sortOrder","lines","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","CheckOut","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","_setQuantityLimitsFeatureFlag","componentDidUpdate","prevProps","_this$state$miniCartD","_this$state$miniCartD2","enableHoverCart","isAnonymousCheckout","cartUrl","_getCheckoutURL","shouldShowMiniCart","isProductAddedToCart","addToCartBehavior","AddToCartBehavior","showMiniCart","includeFlyout","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","flyoutTitle","flyoutTooltip","UncontrolledTooltip","placement","hideArrow","trigger","displayMode","shouldShowCloseButton","cartPageUrl","hideAriaHidden","priceString","totalPriceFormatString","feature","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","miniCartWrapper","miniCartItemWrapper","goToCartButton","totalPrice","_cart$result$cart$Ver","_cart$result","lastValidatedCartVersion","FlyoutCartLineItems","cartLinesSortOrder","outOfStockThreshold","_featureStatuses$find2","_featureStatuses$find3","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_renderDeliveryLocation","deliverylocation","_foundProductDelivery","_renderStoreLocation","RemoveCartItem","removeCartItemAttribute","deliveryLocation","storeLocation","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","getCartState","response","ProductsDataActions","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","createObservableDataAction","action","inputData","_isChannelLimitsFeatureEnabled","isMultipleCatalogsFeatureEnabled","currentCatalogId","getCatalogId","validateCatalogId","isMultipleCatalogFeatureEnabledInHq","_featureState$result2","isChannelLimitsFeatureEnabledInHq","_this$props$data$feat4","_featureState$result3","_context$request$chan","priceCurrency","isPickUpItem","isCartLineItemPickUpType","InvoiceSummaryLine","cssLabel","_buildPaymentSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","reduce","giftCardCounter","Balance","totalAmountAfterGiftCard","loyaltyLabel","giftcardLabel","OrderSummaryLine","_buildOrderSummarySection","getDeliveryMode","_channelDeliveryOptio","featureSate","pickupDeliveryMode","dM","SubtotalAmountWithoutTax","TaxOnNonShippingCharges","OtherChargeAmount","canShip","hasDeliveryMethod","hasShippingMethod","freightFee","getDeliveryConfiguration","deliveryModes","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","ShippingChargeAmount","otherChargeAmount","taxOnNonShippingCharges","isTaxGreaterThanZero","otherChargeAmountTotal","subtotalAmountActual","customerAccountAmount","customerAccount","customerAccountLabel","channelInventoryConfigurationId","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","_rangeParentDisplay$","rangeParentDisplay","p","rangeDisplayType","closeAriaLabel","newIntRange","_parent","refinerValues","filterValue","getIntegerRangeName","_context$request$app","recommendation","OmniChannelMedia","heading","featureSimilarDescriptionTitle","getInventoryLabel","inventoryAttribute","quickviewSlot","productComparisonButton","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","isCustomRangeTypeIntegerSelected","invalidData","previousProps","updateInputRangerProps","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","_isUndefined","_selectedRefinementCr","_ref2","getLabels","getSliderThumbs","sliderKey","_this$props$minValueS","_this$props$maxValueS","String","minValue","maxValue","sliderKeyString","updateSliderProps","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","_this$props$parentPro","_this$props$parentPro2","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","productText","productCount","refineMenuItemAriaLabel","dimensionType","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","rangeValue","isSingleSelectRangeTypeIntegerSelected","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","defaultChkProductCount","productCountAriaLabelValue","isMobileView","isRangeTypeForInteger","RightValueBoundLocalizedString","r","_props$context$reques","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","defaultPageNumber","isListPageStateUpdated","_updateVariantAvailability","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","_getProductsDimensionsAvailabilities","_updateListPageState","_this$props$config$it","_this$props$config$it2","_this$props$context$r3","hydrateRefinersFromUrl","_this$props$data$list","_this$props$data$list2","productsList","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_this$props$context$r4","_getAllSortByOptions","_renderPrev","_renderNext","updateRefinerPanel","_shouldHideFromRefiners","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_this$props$data$refi","_getProducts","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","quickview","isPriceMinMaxFeatureState","_getSortCriteriaColumn","_this$props$data$list5","queryColumns","mappedSearchConfiguration","validValues","_this$props$data$list6","paginationPreviousText","paginationNextText","_nameTranslation","_this$props$context$a2","StoreOperationsDataActions","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","newListPageState","recordId","Recommendation","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","_this$props$context$r9","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","_listPageState$result","_listPageState$result2","_this$props$context$r10","_this$props$data$list7","_this$props$data$list8","productCollection","variant","VariantType","Browser","Viewport","isRecoSearchPage","renderSort","renderRefiner","renderTitleCount"],"sourceRoot":""}