{"version":3,"file":"static/js/8.1d7f7cce026060a95882.chunk.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-cart-icon/krannich-c-cart-icon.props.autogenerated.ts?95f0","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-cart-icon/components/flyout-cart-line-items.tsx?82f7","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-cart-icon/utils/get-products-in-mini-cart.ts?cc07","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-cart-icon/krannich-c-cart-icon.tsx?5d09","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-cart-icon/krannich-c-cart-icon.view.tsx?50c9","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-order-template-list/components/krannich-c-order-template-list.tsx?5696","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-order-template-list/components/create-order-template.tsx?972a","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-order-template-list/krannich-c-order-template-list.props.autogenerated.ts?5d56","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-order-template-list/krannich-c-order-template-list.tsx?a426","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-order-template-list/krannich-c-order-template-list.view.tsx?8e89","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-product-collection/krannich-c-product-collection.props.autogenerated.ts?c573","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-product-collection/krannich-c-product-collection.tsx?0b8e","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-product-collection/krannich-c-product-collection.view.tsx?6614","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-quick-order/components/krannich-c-quick-order-drawer.tsx?ef3f","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-quick-order/components/krannich-c-quick-order-form.tsx?44d4","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-quick-order/components/krannich-c-quick-order-product.ts?b17b","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-quick-order/components/krannich-c-quick-order-table/components/krannich-c-quick-order-table-header-component.tsx?110d","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-quick-order/components/krannich-c-quick-order-table/components/krannich-c-quick-order-table-row-component.tsx?e3c3","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-quick-order/components/krannich-c-quick-order-table/krannich-c-quick-order-table-component.tsx?e102","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-quick-order/krannich-c-quick-order.tsx?62bd","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-quick-order/krannich-c-quick-order.view.tsx?0a9b","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/productCard.component.tsx?3701","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/utilities.ts?64f7","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/choice-summary.tsx?3d5d","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/error-message.tsx?d13a","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/feature-search-result-item.tsx?b6fb","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/link.tsx?b094","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/modal.tsx?23a3","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/product-search-result-items.tsx?a5bf","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/range-refine-item.tsx?923e","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/refine-item.tsx?059b","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/refine-submenu.tsx?eb71","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/separator.tsx?8420","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/components/title.tsx?0724","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/krannich-c-search-result-container.props.autogenerated.ts?5353","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/krannich-c-search-result-container.tsx?02b1","webpack://Msdyn365.Commerce.Online/./src/modules/krannich-c-search-result-container/krannich-c-search-result-container.view.tsx?5f89","webpack://Msdyn365.Commerce.Online/./src/themes/krannich/views/components/addtocart.component.tsx?6961","webpack://Msdyn365.Commerce.Online/./src/themes/krannich/views/components/product.component.tsx?34e9","webpack://Msdyn365.Commerce.Online/./src/utils/atp-utils.tsx?854b","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.tsx?9fd5","webpack://Msdyn365.Commerce.Online/./src/modules/bulk-purchase/bulk-purchase.view.tsx?feac","webpack://Msdyn365.Commerce.Online/./src/modules/cart-icon/cart-icon.view.tsx?f9dd","webpack://Msdyn365.Commerce.Online/./src/modules/fabrikam/views/components/cartlineitem.component.tsx?eb8c","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/header-preferred-store.tsx?ee9c","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/logo.tsx?f27e","webpack://Msdyn365.Commerce.Online/./src/modules/header/components/nav-icon.tsx?2475","webpack://Msdyn365.Commerce.Online/./src/modules/header/header.tsx?e91a","webpack://Msdyn365.Commerce.Online/./src/modules/header/header.view.tsx?cf0f","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.tsx?4008","webpack://Msdyn365.Commerce.Online/./src/modules/product-collection/product-collection.view.tsx?5d36","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison-preview/product-comparison-preview.tsx?39f6","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison-preview/product-comparison-preview.view.tsx?28cb","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/base/product-specification.tsx?75ed","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/base/remove-from-comparison-button.tsx?1d8c","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/product-comparison.tsx?4f74","webpack://Msdyn365.Commerce.Online/./src/modules/product-comparison/product-comparison.view.tsx?a0a9","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/links.tsx?2587","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/components/text.tsx?782b","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://Msdyn365.Commerce.Online/./src/modules/promo-banner/promo-banner.view.tsx?7f77","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/add-to-list/add-to-cart-selected-items.tsx?de21","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-actions.tsx?ca97","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-drawer.tsx?8701","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-form.tsx?5cbb","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-product.ts?187e","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-header-component.tsx?69b3","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/components/quick-order-grid-table-row-component.tsx?cd92","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/components/quick-order-grid-table/quick-order-grid-table-component.tsx?7cbc","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/quick-order-grid.tsx?fddf","webpack://Msdyn365.Commerce.Online/./src/modules/quick-order-grid/quick-order-grid.view.tsx?f941","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/component/components.tsx?f324","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.tsx?f6bc","webpack://Msdyn365.Commerce.Online/./src/modules/ratings-histogram/ratings-histogram.view.tsx?5bff","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://Msdyn365.Commerce.Online/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/cart-icon.view.tsx?7ec9","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/product-v2.component.tsx?d155","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/components/product.component.tsx?fd23","webpack://Msdyn365.Commerce.Online/./src/modules/header/utilities/mock-utilities.ts?d017","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/header.view.tsx?9bd3","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/search-result-container-v2.view.tsx?6eaa","webpack://Msdyn365.Commerce.Online/./src/modules/adventureworks/views/search-result-container.view.tsx?6e86"],"sourcesContent":["/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IKrannichCCartIcon containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum cartLinesSortOrder {\r\n ascending = 'ascending',\r\n descending = 'descending'\r\n}\r\n\r\nexport interface IKrannichCCartIconConfig extends Msdyn365.IModuleConfig {\r\n imageSettings?: Msdyn365.IImageSettings;\r\n enableHoverCart?: boolean;\r\n cartLinesSortOrder?: cartLinesSortOrder;\r\n isAnonymousCheckout?: boolean;\r\n clientRender?: boolean;\r\n}\r\n\r\nexport interface IKrannichCCartIconResources {\r\n goToCartButtonTitle: string;\r\n totalPriceFormatString: string;\r\n guestCheckoutButtonTitle: string;\r\n checkoutButtonTitle: string;\r\n productDimensionTypeColor: string;\r\n productDimensionTypeSize: string;\r\n productDimensionTypeStyle: string;\r\n productDimensionTypeConfiguration: string;\r\n quantityDisplayText: string;\r\n removeCartButtonText: string;\r\n cartLabel: string;\r\n cartQtyLabel: string;\r\n flyoutTitle: string;\r\n salesAgreementPricePrompt: string;\r\n shippingText: string;\r\n checkoutBlockedDueToUnavailableFundsTitle: string;\r\n checkoutBlockedDueToUnavailableFundsMessage: string;\r\n continueShoppingButtonTitle: string;\r\n subTotalMessage: string;\r\n item: string;\r\n items: string;\r\n emptyPrice: string;\r\n subtotalAmount: string;\r\n}\r\n\r\nexport interface IKrannichCCartIconProps extends Msdyn365.IModule {\r\n resources: IKrannichCCartIconResources;\r\n config: IKrannichCCartIconConfig;\r\n slots: {\r\n emptyCart: React.ReactNode[];\r\n promoContentItem: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICartlineResourceString } from '@msdyn365-commerce/components';\r\nimport { CartLineItemComponent } from '../../../themes/krannich/views/components/cartlineitem.component';\r\nimport MsDyn365, { ICoreContext, IGridSettings, IImageSettings, ITelemetry, isChannelTypeB2B } from '@msdyn365-commerce/core';\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n OrgUnitLocation,\r\n ProductAvailableQuantity,\r\n ProductDeliveryOptions,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ProductCatalog, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { getProductUrlSync, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n TelemetryConstant\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '@msdyn365-commerce-modules/cart';\r\n\r\nexport interface IFlyoutCartLineItemsProps {\r\n cartlines: CartLine[];\r\n cartState: ICartState | undefined;\r\n orgUnitLocations: OrgUnitLocation[] | undefined;\r\n resources: ICartlineResourceString;\r\n productAvailabilites: IProductInventoryInformation[] | undefined;\r\n products: SimpleProduct[] | undefined;\r\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\r\n pickupDeliveryModeCode?: string;\r\n catalogs?: ProductCatalog[];\r\n\r\n /**\r\n * GridSettings for the product image in cartline\r\n */\r\n gridSettings: IGridSettings;\r\n\r\n /**\r\n * ImageSettings for the product image in cartline\r\n */\r\n imageSettings: IImageSettings;\r\n id: string;\r\n typeName: string;\r\n context: ICoreContext;\r\n telemetry: ITelemetry;\r\n removeButtonText: string;\r\n outOfStockText: string;\r\n outOfRangeOneText: string;\r\n outOfRangeFormatText: string;\r\n maxCartlineQuantity: number;\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n\r\n outOfStockThreshold: number;\r\n isStockCheckEnabled: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n customerTaxPercentage: number;\r\n}\r\n\r\nexport interface IFlyoutCartLineItemViewProps {\r\n cartline: React.ReactNode;\r\n remove: React.ReactNode;\r\n storeLocation: React.ReactNode;\r\n hasError: boolean;\r\n\r\n data: {\r\n product: SimpleProduct;\r\n cartline: CartLine;\r\n };\r\n}\r\n\r\nconst _getCartItemAvailableQuantity = (\r\n isStockCheckEnabled: boolean,\r\n outOfStockThreshold: number,\r\n productAvailability?: ProductAvailableQuantity\r\n): number => {\r\n if (isStockCheckEnabled) {\r\n if (\r\n !productAvailability ||\r\n !productAvailability.AvailableQuantity ||\r\n productAvailability.AvailableQuantity <= 0 ||\r\n productAvailability.AvailableQuantity <= outOfStockThreshold\r\n ) {\r\n return 0;\r\n }\r\n return productAvailability.AvailableQuantity - outOfStockThreshold;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst _getCartItemMaxQuantity = (\r\n maxQuantityByConfig: number,\r\n isStockCheckEnabled: boolean,\r\n availableQuantityInStock: number,\r\n isQuantityLimitsFeatureEnabled: boolean,\r\n maxByQuantityLimitsFeature: number\r\n) => {\r\n if (isQuantityLimitsFeatureEnabled) {\r\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\r\n\r\n // If max by feature in not defined when feature is on then we suggest that there is no max by feature\r\n // and consider available qty if stock check enabled and max from config in site settings.\r\n if (!maxByQuantityLimitsFeature) {\r\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\r\n }\r\n\r\n return isStockCheckEnabled\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\n/**\r\n * On Remove Click functionality.\r\n * @param removeItemClickHandler -Remove item click function.\r\n * @param cartline -CartLine.\r\n * @returns Remove change value.\r\n */\r\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\r\n removeItemClickHandler(cartline);\r\n};\r\nconst _assembleNode = (\r\n cartline: CartLine,\r\n product: SimpleProduct,\r\n props: IFlyoutCartLineItemsProps,\r\n index: number,\r\n foundProductAvailability?: ProductAvailableQuantity,\r\n foundProductDeliveryOptions?: ProductDeliveryOptions\r\n): IFlyoutCartLineItemViewProps => {\r\n const {\r\n imageSettings,\r\n gridSettings,\r\n id,\r\n typeName,\r\n context,\r\n resources,\r\n removeButtonText,\r\n removeItemClickHandler,\r\n customerTaxPercentage\r\n } = props;\r\n\r\n const availableQuantityInStock = _getCartItemAvailableQuantity(\r\n props.isStockCheckEnabled,\r\n props.outOfStockThreshold,\r\n 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 // Check if the product is service or not by product type\r\n const isServiceItem = product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.RemoveCartItem);\r\n const removeCartItemAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n\r\n let productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\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\r\n return {\r\n data: {\r\n product,\r\n cartline\r\n },\r\n hasError: !isServiceItem && props.isStockCheckEnabled ? cartline.Quantity! > maxQuantity : false,\r\n cartline: (\r\n \r\n ),\r\n remove: (\r\n \r\n {removeButtonText}\r\n \r\n ),\r\n storeLocation: _renderStoreLocation(cartline, props)\r\n };\r\n};\r\n\r\nconst _renderDeliveryLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): string | undefined => {\r\n let deliverylocation;\r\n if (cartLine && cartLine.FulfillmentStoreId) {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\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 const delivery = foundProductDeliveryOption?.DeliveryOptions?.find(option => option.Code === cartLine.DeliveryMode);\r\n const location = delivery?.Description;\r\n\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n if (location) {\r\n deliverylocation = `${location}, ${orgUnitName}`;\r\n } else {\r\n deliverylocation = `${orgUnitName}`;\r\n }\r\n } else {\r\n deliverylocation = props.resources.shippingText;\r\n }\r\n return deliverylocation;\r\n};\r\n\r\nconst _renderStoreLocation = (cartLine: CartLine | null | undefined, props: IFlyoutCartLineItemsProps): JSX.Element | null => {\r\n if (cartLine && cartLine.FulfillmentStoreId) {\r\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, props.orgUnitLocations);\r\n\r\n if (orgUnitName) {\r\n return (\r\n
\r\n {orgUnitName}\r\n
\r\n );\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\r\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\r\n return '';\r\n }\r\n\r\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\r\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\r\n });\r\n\r\n if (foundLocation) {\r\n return foundLocation.OrgUnitName;\r\n }\r\n return fulfillmentStoreId;\r\n};\r\n\r\nconst _assembleCartlines = (\r\n cartlines: CartLine[],\r\n products: SimpleProduct[] | undefined,\r\n props: IFlyoutCartLineItemsProps\r\n): IFlyoutCartLineItemViewProps[] | null => {\r\n const reactNodes: IFlyoutCartLineItemViewProps[] = [];\r\n\r\n if (!products || products.length === 0) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n\r\n cartlines.map((cartline, index) => {\r\n let product;\r\n if (props.isQuantityLimitsFeatureEnabled) {\r\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\r\n // to check productId and WarehouseId for identification.\r\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\r\n } else {\r\n product = getProductByProductId(cartline.ProductId, products);\r\n }\r\n let foundProductAvailability;\r\n if (props.productAvailabilites && props.productAvailabilites.length > 0) {\r\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\r\n return productAvailability.ProductAvailableQuantity?.ProductId! === cartline.ProductId;\r\n });\r\n }\r\n let foundProductDeliveryOption;\r\n if (props.productDeliveryOptions && props.productDeliveryOptions.length > 0) {\r\n foundProductDeliveryOption = props.productDeliveryOptions.find(deliveryOption => {\r\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\r\n });\r\n }\r\n if (product) {\r\n reactNodes.push(\r\n _assembleNode(\r\n cartline,\r\n product,\r\n props,\r\n index,\r\n foundProductAvailability?.ProductAvailableQuantity,\r\n foundProductDeliveryOption\r\n )\r\n );\r\n }\r\n });\r\n\r\n return reactNodes;\r\n};\r\n\r\n/**\r\n * CartLineItems component.\r\n */\r\n\r\nexport const FlyoutCartLineItems = (props: IFlyoutCartLineItemsProps) => {\r\n const { products, cartlines } = props;\r\n return _assembleCartlines(cartlines, products, props);\r\n};\r\n","/*!\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 { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { ProductDeliveryOptions, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ActiveCartProductsInput,\r\n getActiveCartProductsAction,\r\n getAvailabilitiesForCartLineItems,\r\n getDeliveryOptionsForCartLineItems,\r\n IProductInventoryInformation,\r\n ProductAvailabilitiesForCartLineItems,\r\n ProductDeliveryOptionsForCartLineItems\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n * IMiniCartData entity interface.\r\n */\r\nexport interface IMiniCartData {\r\n products?: SimpleProduct[];\r\n productAvailabilites?: IProductInventoryInformation[];\r\n deliveryOptions?: ProductDeliveryOptions[];\r\n}\r\n\r\nexport const createInput = () => {\r\n return new ActiveCartProductsInput();\r\n};\r\n\r\n/**\r\n * Calls the Retail API and returns a mini cart data.\r\n * @param ctx\r\n * @param cartState\r\n */\r\nexport async function getMiniCartData(ctx: IActionContext, cartState: ICartState): Promise {\r\n const miniCartData: IMiniCartData = {};\r\n\r\n const cart = cartState.cart;\r\n\r\n // If there are cart lines, make call to get products\r\n // If there are invocie linese, then there is no products, so don't make call to get products\r\n if (cart && cart.CartLines && cart.CartLines.length > 0 && !cartState.hasInvoiceLine) {\r\n await getActiveCartProductsAction(new ActiveCartProductsInput(), ctx)\r\n .then(products => {\r\n if (products) {\r\n miniCartData.products = products;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n await getAvailabilitiesForCartLineItems(new ProductAvailabilitiesForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(availableQuantity => {\r\n if (availableQuantity) {\r\n miniCartData.productAvailabilites = availableQuantity;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n\r\n await getDeliveryOptionsForCartLineItems(new ProductDeliveryOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\r\n .then(deliveryOptions => {\r\n if (deliveryOptions) {\r\n miniCartData.deliveryOptions = deliveryOptions;\r\n }\r\n })\r\n .catch(error => {\r\n ctx.telemetry.exception(error);\r\n throw new Error('[getActiveCartWithProdcuts]Unable to hydrate cart with product information');\r\n });\r\n }\r\n\r\n return miniCartData;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\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 { AddToCartBehavior, CartIconComponent } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, IDictionary, IImageSettings, msdyn365Commerce, TelemetryEvent } from '@msdyn365-commerce/core';\r\nimport {\r\n CartLine,\r\n ChannelDeliveryOptionConfiguration,\r\n CartLineValidationResultsByLineId,\r\n OrgUnitLocation\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\r\nimport { ArrayExtensions, validateCartLinesInventory } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n INodeProps,\r\n ITelemetryContent,\r\n TelemetryConstant,\r\n UncontrolledTooltip,\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\n\r\nimport { IKrannichCCartIconData } from './krannich-c-cart-icon.data';\r\nimport { cartLinesSortOrder, IKrannichCCartIconProps } from './krannich-c-cart-icon.props.autogenerated';\r\nimport { FlyoutCartLineItems, IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\r\nimport { getMiniCartData, IMiniCartData } from './utils/get-products-in-mini-cart';\r\nimport { taxPercentage } from '../../utils/helper';\r\n\r\nexport interface IMiniCartState {\r\n miniCartData: IMiniCartData;\r\n orgUnitLocations?: OrgUnitLocation[];\r\n isQuantityLimitsFeatureEnabled: boolean;\r\n isCartValid: boolean;\r\n}\r\n\r\nexport interface ICartIconViewProps extends IKrannichCCartIconProps {\r\n className: string;\r\n cartIcon: React.ReactNode;\r\n FlyoutContainer?: INodeProps;\r\n CartlinesWrapper: INodeProps;\r\n miniCartWrapper: INodeProps;\r\n miniCartItemWrapper: INodeProps;\r\n cartlines?: IFlyoutCartLineItemViewProps[];\r\n flyoutTitle: React.ReactNode;\r\n totalPrice: React.ReactNode;\r\n checkoutAsGuestButton?: React.ReactNode;\r\n checkoutAsSignInUserButton?: React.ReactNode;\r\n goToCartButton?: React.ReactNode;\r\n waitingComponent?: React.ReactNode;\r\n isCartLoading: boolean;\r\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\r\n\r\n removeItemClickHandler(cartlineToRemove: CartLine): void;\r\n}\r\n\r\n/**\r\n *\r\n * Cart component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass CartIcon extends React.Component, IMiniCartState> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly checkoutBySignInAttributes: IDictionary | undefined;\r\n\r\n private readonly checkoutByGuestAttributes: IDictionary | undefined;\r\n\r\n private readonly viewShoppingBagAttributes: IDictionary | undefined;\r\n\r\n private retailMultiplePickUpOptionEnabled?: boolean = false;\r\n\r\n private channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n\r\n private lastValidatedCartVersion: number | undefined;\r\n\r\n constructor(props: IKrannichCCartIconProps) {\r\n super(props);\r\n this.state = {\r\n miniCartData: {},\r\n isCartValid: true,\r\n isQuantityLimitsFeatureEnabled: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const payload = getPayloadObject(TelemetryEvent.CheckOut, this.telemetryContent, TelemetryConstant.Checkout);\r\n this.checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n\r\n payload.contentAction.etext = TelemetryConstant.GuestCheckout;\r\n this.checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n\r\n payload.contentAction.etext = TelemetryConstant.ViewShoppingBag;\r\n this.viewShoppingBagAttributes = getTelemetryAttributes(this.telemetryContent, payload);\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n const context = this.props.context.actionContext;\r\n\r\n reaction(\r\n () => this.props.data.cart.result?.cart.CartLines,\r\n async () => {\r\n this.setState({\r\n miniCartData: await getMiniCartData(context, this.props.data.cart.result!)\r\n });\r\n }\r\n );\r\n await this._setQuantityLimitsFeatureFlag();\r\n\r\n this.setState({\r\n orgUnitLocations: this.props.data.orgUnitLocations?.result\r\n });\r\n\r\n this._validateCart();\r\n }\r\n\r\n public componentDidUpdate(prevProps: IKrannichCCartIconProps): void {\r\n this._validateCart();\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IKrannichCCartIconProps, nextState: IMiniCartState): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line complexity -- disabling the complexity for this method for now as its causing lot of other warnings\r\n public render(): JSX.Element | null {\r\n const {\r\n id,\r\n typeName,\r\n config: { enableHoverCart, isAnonymousCheckout },\r\n context: {\r\n request: {\r\n user: { isAuthenticated, signInUrl }\r\n }\r\n },\r\n context,\r\n resources\r\n } = this.props;\r\n const cart = (this.props.data.cart && this.props.data.cart.result) || undefined;\r\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\r\n const cartUrl = getUrlSync('cart', this.props.context.actionContext) || '';\r\n const checkoutURL = this._getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\r\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- check config.\r\n const shouldShowMiniCart =\r\n cart?.isProductAddedToCart && this.props.context.app.config.addToCartBehavior === AddToCartBehavior.showMiniCart;\r\n const hasInvoiceLine = cart?.hasInvoiceLine;\r\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\r\n const cartLines = this._getCartLines();\r\n const validInventoryAcrossCartLines = validateCartLinesInventory(\r\n cart?.cart.CartLines ?? [],\r\n this.state.miniCartData.productAvailabilites ?? [],\r\n this.props.context.actionContext,\r\n this.state.miniCartData.products ?? [],\r\n emailDeliveryModeCode\r\n );\r\n const hasError =\r\n !validInventoryAcrossCartLines?.isValid ||\r\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\r\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\r\n const includeFlyout = this.props.data.cart && this.props.data.cart.status === 'SUCCESS' && enableHoverCart;\r\n const totalItemsInCart = cart?.totalItemsInCart ? cart.totalItemsInCart : 0;\r\n const goToCartButtonText = resources.goToCartButtonTitle.replace('{count}', totalItemsInCart.toString());\r\n const flyoutTitle = resources.flyoutTitle;\r\n const flyoutTooltip = {\r\n tag: UncontrolledTooltip,\r\n shouldShowMiniCart,\r\n placement: 'bottom-end',\r\n hideArrow: true,\r\n className: 'ms-cart-icon__flyout-container',\r\n trigger: 'hover',\r\n displayMode: 'FLYOUT',\r\n target: id,\r\n shouldShowCloseButton: true,\r\n cartPageUrl: cartUrl,\r\n hideAriaHidden: true\r\n };\r\n\r\n // If there are invoice lines, don't update mini cart price\r\n const price = (cart && !cart.hasInvoiceLine && cart.cart.TotalAmount) || undefined;\r\n const priceString = price\r\n ? resources.totalPriceFormatString.replace('{price}', context.cultureFormatter.formatCurrency(price))\r\n : '';\r\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\r\n this.channelDeliveryOptionConfig = this.props.data.channelDeliveryOptionConfig?.result;\r\n this.retailMultiplePickUpOptionEnabled = this.props.data.featureState?.result?.find(\r\n feature => feature.Name === multiplePickupStoreSwitchName\r\n )?.IsEnabled;\r\n\r\n const viewProps = {\r\n ...this.props,\r\n cartIcon: (\r\n \r\n ),\r\n cartlines: cartLines,\r\n FlyoutContainer: includeFlyout ? flyoutTooltip : undefined,\r\n CartlinesWrapper: {\r\n className: 'ms-cart-icon__cart-lines'\r\n },\r\n miniCartWrapper: {\r\n className: classnames('ms-cart-icon'),\r\n id: this.props.id\r\n },\r\n miniCartItemWrapper: {\r\n className: classnames('msc-cart-lines-item')\r\n },\r\n\r\n // If there are invoice lines, don't update mini cart checkout button\r\n // Checkout button will display by default to maintain backward compatibility. When Anonymous user checkout is enabled &&\r\n // user is authenticated then we will show the checkout button otherwise we will show the guest checkout button.\r\n checkoutAsSignInUserButton:\r\n !isCartEmpty && !hasInvoiceLine && (!isAnonymousCheckout || isAuthenticated) ? (\r\n \r\n {resources.checkoutButtonTitle}\r\n \r\n ) : null,\r\n checkoutAsGuestButton:\r\n isAnonymousCheckout && !isCartEmpty && !isAuthenticated ? (\r\n \r\n {resources.guestCheckoutButtonTitle}\r\n \r\n ) : null,\r\n goToCartButton: (\r\n \r\n {goToCartButtonText}\r\n \r\n ),\r\n checkoutBlockedDueToUnavailableFunds: null,\r\n flyoutTitle: {flyoutTitle},\r\n totalPrice:
{priceString}
\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _validateCart(): void {\r\n const {\r\n data: { cart }\r\n } = this.props;\r\n const cartVersion = cart.result?.cart?.Version ?? undefined;\r\n if (this.lastValidatedCartVersion === cartVersion) {\r\n return;\r\n }\r\n\r\n this.lastValidatedCartVersion = cartVersion; // This field is populated to block concurrent requests\r\n\r\n if (this.state.isQuantityLimitsFeatureEnabled) {\r\n validateCartAsync(cart, this.props.telemetry, this.props.context)\r\n .then((result: CartLineValidationResultsByLineId | undefined) => {\r\n this.setState({ isCartValid: !ArrayExtensions.hasElements(result?.ValidationResultsPairs) });\r\n })\r\n .catch(() => {\r\n this.setState({ isCartValid: false });\r\n });\r\n } else {\r\n this.setState({ isCartValid: true });\r\n }\r\n }\r\n\r\n private _getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\r\n if (isAuthenticated) {\r\n return guestCheckoutUrl;\r\n }\r\n\r\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\r\n let returnURL = guestCheckoutUrl;\r\n if (msdyn365Commerce.isBrowser && !isAbsoluteUrl) {\r\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\r\n }\r\n\r\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\r\n }\r\n\r\n /**\r\n * Sort cartline items.\r\n * @param cartlines - Cartlines to be sorted.\r\n * @param sortOrder - Ascending or descending.\r\n * @returns - Sorted cartlines.\r\n */\r\n private readonly getSortedCartLines = (cartlines: CartLine[], sortOrder?: cartLinesSortOrder): CartLine[] => {\r\n const lines: CartLine[] = [...cartlines];\r\n const zero: number = 0;\r\n\r\n if (sortOrder === cartLinesSortOrder.descending) {\r\n return lines.sort((item1, item2) => (item2.LineNumber ?? zero) - (item1.LineNumber ?? zero));\r\n }\r\n return lines.sort((item1, item2) => (item1.LineNumber ?? zero) - (item2.LineNumber ?? zero));\r\n };\r\n\r\n private _getCartLines(): IFlyoutCartLineItemViewProps[] | null {\r\n const {\r\n context: {\r\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\r\n },\r\n config,\r\n telemetry,\r\n resources\r\n } = this.props;\r\n\r\n const imageSettings = this._getImageSettings(config.imageSettings);\r\n const cart = this.props.data.cart && this.props.data.cart.result;\r\n const customerTaxPercentage = taxPercentage(this.props.data.customerInformation?.result!);\r\n\r\n // Cart-icon could be placed in each page\r\n // so we check cart content to reduce number of RS calls\r\n return this.state.miniCartData.products && cart && cart.cart.CartLines && cart.cart.CartLines.length > 0\r\n ? FlyoutCartLineItems({\r\n cartlines: this.getSortedCartLines(cart.cart.CartLines, config.cartLinesSortOrder),\r\n products: this.state.miniCartData.products,\r\n productAvailabilites: this.state.miniCartData.productAvailabilites,\r\n productDeliveryOptions: this.state.miniCartData.deliveryOptions,\r\n imageSettings,\r\n outOfStockThreshold: this.props.context.app.config.outOfStockThreshold || 0,\r\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\r\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\r\n gridSettings: this.props.context.request.gridSettings!,\r\n context: this.props.context,\r\n typeName: this.props.typeName,\r\n id: this.props.id,\r\n resources: {\r\n sizeString: resources.productDimensionTypeSize,\r\n colorString: resources.productDimensionTypeColor,\r\n configString: resources.productDimensionTypeConfiguration,\r\n styleString: resources.productDimensionTypeStyle,\r\n quantityDisplayString: resources.quantityDisplayText,\r\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\r\n inputQuantityAriaLabel: '', // Not used\r\n discountStringText: '', // Not used\r\n originalPriceText: '',\r\n currentPriceText: '',\r\n shippingChargesText: '',\r\n shippingText: resources.shippingText\r\n },\r\n telemetry,\r\n removeButtonText: resources.removeCartButtonText,\r\n outOfStockText: '', // Not used\r\n outOfRangeOneText: '', // Not used\r\n outOfRangeFormatText: '', // Not used\r\n cartState: cart,\r\n orgUnitLocations: this.state.orgUnitLocations,\r\n removeItemClickHandler: this._removeItemFromCartHandler,\r\n pickupDeliveryModeCode: PickupDeliveryModeCode,\r\n telemetryContent: this.telemetryContent,\r\n channelDeliveryOptionConfig: this.retailMultiplePickUpOptionEnabled ? this.channelDeliveryOptionConfig : undefined,\r\n isQuantityLimitsFeatureEnabled: this.state.isQuantityLimitsFeatureEnabled,\r\n catalogs: this.props.data.catalogs?.result,\r\n customerTaxPercentage: customerTaxPercentage\r\n })\r\n : null;\r\n }\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 private readonly _removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\r\n if (this.props.data.cart.result) {\r\n const input = {\r\n cartLineIds: [cartlineToRemove.LineId!.toString()]\r\n };\r\n this.props.data.cart.result.removeCartLines(input).catch(error => {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to Remove Cart Line');\r\n });\r\n }\r\n };\r\n\r\n private async _setQuantityLimitsFeatureFlag(): Promise {\r\n const featureStatuses = await this.props.data.featureState;\r\n\r\n const isChannelQuantityLimitsFeatureEnabledInHq =\r\n featureStatuses?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\r\n )?.IsEnabled || false;\r\n if (isChannelQuantityLimitsFeatureEnabledInHq) {\r\n this.setState({ isQuantityLimitsFeatureEnabled: true });\r\n return;\r\n }\r\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\r\n if (!defaultOrderQuantityLimitsFeatureConfig || defaultOrderQuantityLimitsFeatureConfig === 'none') {\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n\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 this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n } catch (error) {\r\n this.props.telemetry.warning(error);\r\n this.props.telemetry.debug('Unable to get feature states');\r\n this.setState({ isQuantityLimitsFeatureEnabled: false });\r\n return;\r\n }\r\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\r\n this.setState({ isQuantityLimitsFeatureEnabled: true });\r\n } else {\r\n this.props.data.customerInformation\r\n .then(customerInfo => {\r\n const result =\r\n !!customerInfo &&\r\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\r\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b));\r\n this.setState({ isQuantityLimitsFeatureEnabled: result });\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 });\r\n }\r\n }\r\n}\r\n\r\nexport default CartIcon;\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 { Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ICartIconViewProps } from '@msdyn365-commerce-modules/cart/src/modules/cart-icon/cart-icon';\r\nimport { IFlyoutCartLineItemViewProps } from '@msdyn365-commerce-modules/cart/src/modules/cart-icon/components/flyout-cart-line-items';\r\n\r\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\r\n if (!cartLines) {\r\n props.context.telemetry.error('Cartlines content is empty, module wont render');\r\n return null;\r\n }\r\n return cartLines.map((cartLine, index) => {\r\n return (\r\n \r\n {cartLine.cartline}\r\n {cartLine.storeLocation}\r\n {cartLine.remove}\r\n \r\n );\r\n });\r\n};\r\n\r\nconst CartIconView: React.FC = (props: ICartIconViewProps) => {\r\n //VSI customization for custom veiw shopping cart button start\r\n const cartItem = props?.cartlines?.length!;\r\n const customGoToCartButton =\r\n props.goToCartButton &&\r\n React.cloneElement(props.goToCartButton as JSX.Element, {\r\n title: `View Shopping Cart (${cartItem !== undefined ? cartItem : 0})`,\r\n children: `View Shopping Cart (${cartItem !== undefined ? cartItem : 0})`\r\n });\r\n //VSI customization end\r\n return (\r\n \r\n {props.cartIcon}\r\n {props.FlyoutContainer ? (\r\n \r\n {props.flyoutTitle}\r\n {props.checkoutBlockedDueToUnavailableFunds}\r\n {_renderCartlines(props.cartlines, props)}\r\n {props.totalPrice}\r\n {/* {VSI customization to hide checkout/guest checkout} */}\r\n {/* {props.checkoutAsSignInUserButton} */}\r\n {/* {props.checkoutAsGuestButton} */}\r\n {customGoToCartButton}\r\n \r\n ) : (\r\n false\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default CartIconView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources } from '@msdyn365-commerce/components';\r\nimport { getUrlSync, ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\r\nimport { ProductList, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport {\r\n getFallbackImageUrl,\r\n getProductUrlSync,\r\n OrderTemplate,\r\n OrderTemplateLine,\r\n StringExtensions\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IOrderTemplateActionMessageState } from '../krannich-c-order-template-list';\r\n\r\nexport interface ISingleOrderTemplateProps extends ProductList {\r\n orderTemplateState: IOrderTemplateActionMessageState;\r\n name?: string;\r\n orderTemplate: OrderTemplate;\r\n context: ICoreContext;\r\n imageSettings?: IImageSettings;\r\n enableImageProductLink?: boolean;\r\n removeFromOrderTemplateListText: string;\r\n addToBagText: string;\r\n index: number;\r\n itemKey: string;\r\n telemetry: ITelemetry;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n handlers: {\r\n onRemoveOrderTemplate(id: string): void | undefined;\r\n onDismiss(): void;\r\n };\r\n resources: {\r\n closeWindowButtonText: string;\r\n addToCartFailureMessage: string;\r\n addToCartSuccessMessage: string;\r\n addToCartProcessMessage: string;\r\n orderTemplateErrorMessage: string;\r\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\r\n };\r\n telemetryContent?: ITelemetryContent;\r\n isMultipleCatalogFeatureEnabledInHq?: boolean;\r\n}\r\n\r\nexport interface ISingleOrderTemplateViewProps {\r\n key: string;\r\n orderTemplateImage: React.ReactNode;\r\n addToCartButton?: React.ReactNode;\r\n removeButton?: React.ReactNode;\r\n orderTemplateStatusMessage?: React.ReactNode;\r\n orderTemplateName?: React.ReactNode;\r\n orderTemplateAriaLabel?: string;\r\n orderTemplateHeaderDivider?: React.ReactNode;\r\n}\r\n\r\nconst _removeItemFromOrderTemplateList = (props: ISingleOrderTemplateProps): void => {\r\n const { onRemoveOrderTemplate } = props.handlers;\r\n const { itemKey } = props;\r\n\r\n onRemoveOrderTemplate && itemKey && onRemoveOrderTemplate(itemKey);\r\n};\r\n\r\nconst OrderTemplateActions = {\r\n removeOrderTemplate: _removeItemFromOrderTemplateList\r\n};\r\n\r\n/**\r\n * Remove order template action.\r\n * @param input -Single order template props.\r\n * @returns Set remove order template.\r\n */\r\nconst removeOrderTemplateActionHandler = (input: ISingleOrderTemplateProps) => () => {\r\n OrderTemplateActions.removeOrderTemplate(input);\r\n};\r\n\r\nexport const OrderTemplateRender = (input: ISingleOrderTemplateProps): ISingleOrderTemplateViewProps | null => {\r\n const {\r\n Id,\r\n orderTemplate,\r\n removeFromOrderTemplateListText,\r\n orderTemplateState,\r\n handlers,\r\n name,\r\n imageSettings,\r\n context,\r\n telemetryContent,\r\n enableImageProductLink\r\n } = input;\r\n\r\n if (!Id) {\r\n return null;\r\n }\r\n\r\n const _getOrderTemplatePageUrl = (): string => {\r\n const url = getUrlSync('ordertemplate', context.actionContext) ?? '';\r\n const separator = url.includes('?') ? '&' : '?';\r\n if (Id) {\r\n return `${url}${separator}id=${Id}`;\r\n }\r\n return '';\r\n };\r\n\r\n const { onDismiss } = handlers;\r\n\r\n return {\r\n key: `${Id}-template`,\r\n orderTemplateImage: _renderOrderTemplateImages(context, orderTemplate.orderTemplateLines, imageSettings, enableImageProductLink),\r\n orderTemplateAriaLabel: _renderAriaLabel(input),\r\n orderTemplateName: (\r\n
\r\n \r\n
{orderTemplate.totalLines} line items
\r\n
\r\n
\r\n ),\r\n addToCartButton: (\r\n
\r\n \r\n
\r\n ),\r\n\r\n removeButton: (\r\n \r\n Delete\r\n \r\n ),\r\n orderTemplateStatusMessage: orderTemplateState && orderTemplateState.isOpen && orderTemplateState.userMessage && (\r\n
\r\n \r\n {orderTemplateState.userMessage}\r\n \r\n
\r\n )\r\n };\r\n};\r\n\r\n/**\r\n * On image click handler.\r\n * @param productUrl -Product url value.\r\n * @returns Assign window location.\r\n */\r\nconst onClickHandler = (productUrl: string) => () => {\r\n window.location.assign(productUrl);\r\n};\r\n\r\nconst _renderOrderTemplateImages = (\r\n context: ICoreContext,\r\n orderTemplateLines?: OrderTemplateLine[],\r\n imageSettings?: IImageSettings,\r\n enableImageProductLink?: boolean\r\n): JSX.Element | null => {\r\n const defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\r\n xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n\r\n if (orderTemplateLines) {\r\n const count = orderTemplateLines.length < 4 ? orderTemplateLines.length : 4;\r\n\r\n return (\r\n
\r\n {orderTemplateLines?.slice(0, count).map(line => {\r\n const productUrl = line.fullProduct\r\n ? _updateProductUrlCatalog(line.fullProduct.ProductDetails, context, line?.productListLine?.CatalogId)\r\n : '';\r\n\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n return
;\r\n};\r\n// This method is used to update the product url with the catalogId\r\nconst _updateProductUrlCatalog = (productDetails: SimpleProduct, context: ICoreContext, catalogId: number | undefined): string => {\r\n const productUrl = getProductUrlSync(productDetails, context.actionContext, undefined);\r\n if (!StringExtensions.isNullOrWhitespace(productUrl) && catalogId !== undefined) {\r\n const fullUrl = new URL(productUrl, window.location.href);\r\n fullUrl.searchParams.set('catalogid', `${catalogId ?? 0}`);\r\n return fullUrl.href;\r\n }\r\n return productUrl;\r\n};\r\n\r\nconst _renderAriaLabel = (props: ISingleOrderTemplateProps): string => {\r\n const { name } = props;\r\n return `${name}`;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\r\nimport { IComponentProps } from '@msdyn365-commerce/core';\r\nimport React, { useState } from 'react';\r\n\r\nconst modalCloseButtonReference: React.RefObject = React.createRef();\r\n\r\n/**\r\n * The Create Order Template Button Props.\r\n */\r\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\r\n /**\r\n * The label for create order template.\r\n */\r\n createOrderTemplateText: string;\r\n\r\n /**\r\n * The create order template dialog resources.\r\n */\r\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\r\n\r\n /**\r\n * The delegate to fire when dialog captured any user entry.\r\n */\r\n onOrderTemplateCreated(): Promise;\r\n}\r\n\r\nconst CreateOrderTemplateButton: React.FC = props => {\r\n const onCancelHandler = React.useCallback(() => {\r\n return;\r\n }, []);\r\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\r\n const onCreateButtonClick = React.useCallback(() => {\r\n setOrderTemplateNameDialogOpen(true);\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n {props.createOrderTemplateText}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CreateOrderTemplateButton;\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 * IKrannichCOrderTemplateList 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 interface IKrannichCOrderTemplateListConfig extends Msdyn365.IModuleConfig {\r\n heading?: IHeadingData;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n enableImageProductLink?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n toShowItemNumber?: string;\r\n}\r\n\r\nexport interface IKrannichCOrderTemplateListResources {\r\n emptyOrderTemplateText: string;\r\n unableToGetOrderTemplateList: string;\r\n removeButtonText: string;\r\n addToBagButtonText: string;\r\n createNewTemplateButtonText: string;\r\n progressNotificationText: string;\r\n orderTemplateCreatedSuccessText: string;\r\n orderTemplateListTitle: string;\r\n orderTemplateCreationFailedText: string;\r\n deleteOrderTemplateFailedText: string;\r\n closeWindowButtonText: string;\r\n addToCartFailureMessage: string;\r\n addToCartSuccessMessage: string;\r\n addToCartProcessMessage: string;\r\n viewCartButtonText: string;\r\n orderTemplateCloseButtonText: string;\r\n linesAddedToCartHeaderItemsOneText: string;\r\n linesAddedToCartHeaderLinesOneText: string;\r\n linesAddedToCartHeaderLinesFormatText: string;\r\n linesAddedToCartHeaderMessageText: string;\r\n createOrderTemplateHeader: string;\r\n orderTemplateTitle: string;\r\n orderTemplateNameAriaLabel: string;\r\n createOrderTemplateDescription: string;\r\n createOrderTemplateButtonText: string;\r\n cancelNewOrderTemplateCreationButtonText: string;\r\n defaultOrderTemplateName: string;\r\n orderTemplateErrorMessage: string;\r\n orderTemplateModalAriaLabel: string;\r\n orderTemplateName: string;\r\n productsInTemplate: string;\r\n statusHeadingTemplate: string;\r\n actionsHeadingTemplate: string;\r\n deleteModalHeading: string;\r\n deleteModalMessage: string;\r\n deleteModalButton: string;\r\n cancelModalButton: string;\r\n openModalButton: string;\r\n deleteTemplateHeading: string;\r\n deleteSelectedOrderTemplate: string;\r\n cancelButton: string;\r\n viewMoreButton: string;\r\n}\r\n\r\nexport const enum HeadingTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface IHeadingData {\r\n text: string;\r\n tag?: HeadingTag;\r\n}\r\n\r\nexport interface IKrannichCOrderTemplateListProps extends Msdyn365.IModule {\r\n resources: IKrannichCOrderTemplateListResources;\r\n config: IKrannichCOrderTemplateListConfig;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-floating-promises */\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 { IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\r\nimport { deleteAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\r\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Alert, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport { ISingleOrderTemplateProps, ISingleOrderTemplateViewProps, OrderTemplateRender } from './components';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\n\r\nimport CreateNewTemplateButtonComponent from './components/create-order-template';\r\nimport { IKrannichCOrderTemplateListData } from './krannich-c-order-template-list.data';\r\nimport {\r\n HeadingTag,\r\n IKrannichCOrderTemplateListProps,\r\n IKrannichCOrderTemplateListResources\r\n} from './krannich-c-order-template-list.props.autogenerated';\r\n\r\nexport interface IOrderTemplateActionMessageState {\r\n itemKey: string;\r\n userMessage: string;\r\n statusCssString: string;\r\n messageGlyph: string;\r\n isOpen: boolean;\r\n headerStatusMessage: string;\r\n isMobile: boolean;\r\n}\r\n\r\nexport type orderTemplateListStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\r\n\r\nexport interface IOrderTemplateListViewProps extends IKrannichCOrderTemplateListProps {\r\n OrderTemplateList: IModuleProps;\r\n status?: orderTemplateListStatus;\r\n statusMessage?: React.ReactNode;\r\n heading?: React.ReactNode;\r\n OrderTemplates?: INodeProps;\r\n OrderTemplate?: INodeProps;\r\n orderTemplates?: ISingleOrderTemplateViewProps[];\r\n createOrderTemplateButton?: React.ReactNode;\r\n templateHeaderStatusMessage?: React.ReactNode;\r\n isMobile?: boolean;\r\n toShowItemNumber?: string;\r\n}\r\n\r\n/**\r\n *\r\n * OrderTemplateList component.\r\n * @extends {React.PureComponent, IOrderTemplateListActionMessageState>}\r\n */\r\n@observer\r\nclass OrderTemplateList extends React.Component<\r\n IKrannichCOrderTemplateListProps,\r\n IOrderTemplateActionMessageState\r\n> {\r\n constructor(props: IKrannichCOrderTemplateListProps) {\r\n super(props);\r\n this.state = {\r\n itemKey: '',\r\n userMessage: '',\r\n headerStatusMessage: '',\r\n statusCssString: 'success',\r\n messageGlyph: 'fas fa-check',\r\n isOpen: false,\r\n isMobile: false\r\n };\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n this.setState({});\r\n this._updateViewport();\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n window.addEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public shouldComponentUpdate(\r\n nextProps: IKrannichCOrderTemplateListProps,\r\n nextState: IOrderTemplateActionMessageState\r\n ): boolean {\r\n if (this.state === nextState && this.props.data === nextProps.data) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public _updateViewport = (): void => {\r\n const viewport = this._getViewport();\r\n viewport === 'xs' || viewport === 'sm' ? this.setState({ isMobile: true }) : this.setState({ isMobile: false });\r\n };\r\n public _getViewport = (): 'xs' | 'sm' | 'md' | 'lg' | 'xl' => {\r\n const { context } = this.props;\r\n\r\n // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'lg';\r\n };\r\n\r\n public render(): JSX.Element | null {\r\n const { className, heading } = this.props.config;\r\n const {\r\n // emptyOrderTemplateText,\r\n createNewTemplateButtonText\r\n } = this.props.resources;\r\n const { orderTemplates } = this.props.data;\r\n const orderTemplatesData = orderTemplates && orderTemplates.result;\r\n const orderTemplateListHeading = heading?.text ?? this.props.resources.orderTemplateListTitle;\r\n\r\n if (orderTemplates.status === 'LOADING') {\r\n const errorProps: IOrderTemplateListViewProps = {\r\n ...(this.props as IKrannichCOrderTemplateListProps),\r\n OrderTemplateList: {\r\n moduleProps: this.props,\r\n className: classnames('ms-order-template', className)\r\n },\r\n status: 'LOADING',\r\n statusMessage: ,\r\n heading: (\r\n \r\n )\r\n };\r\n return this.props.renderView(errorProps);\r\n }\r\n // if (orderTemplatesData && orderTemplatesData.length === 0) {\r\n // // When no order templates are found for customer\r\n // const emptyViewProps: IOrderTemplateListViewProps = {\r\n // ...(this.props as IKrannichCOrderTemplateListProps),\r\n // OrderTemplateList: {\r\n // moduleProps: this.props,\r\n // className: classnames('ms-order-template', className)\r\n // },\r\n // status: 'EMPTY',\r\n // statusMessage: ,\r\n // createOrderTemplateButton: (\r\n // \r\n // ),\r\n // heading: (\r\n // \r\n // )\r\n // };\r\n\r\n // return this.props.renderView(emptyViewProps);\r\n // }\r\n const viewProps: IOrderTemplateListViewProps = {\r\n ...(this.props as IKrannichCOrderTemplateListProps),\r\n OrderTemplateList: {\r\n moduleProps: this.props,\r\n className: classnames('ms-order-template', className)\r\n },\r\n status: 'SUCCESS',\r\n heading: ,\r\n createOrderTemplateButton: (\r\n \r\n ),\r\n templateHeaderStatusMessage: this.state.isOpen && this.state.headerStatusMessage && (\r\n
\r\n \r\n {this.state.headerStatusMessage}\r\n \r\n
\r\n ),\r\n OrderTemplates: {\r\n className: 'ms-order-template__list-item',\r\n tag: 'ul'\r\n },\r\n OrderTemplate: {\r\n className: 'ms-order-template__tile',\r\n tag: 'li'\r\n },\r\n orderTemplates: orderTemplatesData && this._renderOrderTemplateList(orderTemplatesData),\r\n isMobile: this.state.isMobile,\r\n toShowItemNumber: this.props.config.toShowItemNumber\r\n };\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private _generateOrderTemplateNameDialogResources(resources: IKrannichCOrderTemplateListResources): 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 defaultOrderTemplateName: resources.defaultOrderTemplateName,\r\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\r\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\r\n };\r\n }\r\n private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\r\n let isMultipleCatalogFeatureEnabledInHq = false;\r\n if (this.props.data.featureState) {\r\n isMultipleCatalogFeatureEnabledInHq =\r\n this.props.data.featureState.result?.find(\r\n feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\r\n )?.IsEnabled || false;\r\n }\r\n return isMultipleCatalogFeatureEnabledInHq;\r\n };\r\n\r\n private _renderOrderTemplateList(orderTemplates: OrderTemplate[]): ISingleOrderTemplateViewProps[] {\r\n const { context, telemetry } = this.props;\r\n const { imageSettings, enableImageProductLink } = this.props.config;\r\n return orderTemplates.map((orderTemplate: OrderTemplate, index) => {\r\n const currentTemplateProps: ISingleOrderTemplateProps = {\r\n orderTemplateState: this.state,\r\n Id: orderTemplate.productList.Id,\r\n name: orderTemplate.productList.Name,\r\n orderTemplate,\r\n context,\r\n imageSettings,\r\n enableImageProductLink,\r\n removeFromOrderTemplateListText: 'remove',\r\n addToBagText: this.props.resources.addToBagButtonText,\r\n index,\r\n itemKey: orderTemplate.productList.Id,\r\n telemetry,\r\n moduleId: this.props.id,\r\n moduleTypeName: this.props.typeName,\r\n handlers: {\r\n onRemoveOrderTemplate: this._onRemoveFromOrderTemplateList,\r\n onDismiss: this._onDismiss\r\n },\r\n resources: {\r\n closeWindowButtonText: this.props.resources.closeWindowButtonText,\r\n addToCartFailureMessage: this.props.resources.addToCartFailureMessage,\r\n addToCartSuccessMessage: this.props.resources.addToCartSuccessMessage,\r\n addToCartProcessMessage: this.props.resources.addToCartProcessMessage,\r\n orderTemplateErrorMessage: this.props.resources.orderTemplateErrorMessage,\r\n\r\n linesAddedToCartDialogResources: {\r\n viewCartButtonText: this.props.resources.viewCartButtonText,\r\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\r\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\r\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\r\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\r\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\r\n }\r\n },\r\n isMultipleCatalogFeatureEnabledInHq: this._isChannelMultipleCatalogsFeatureEnabled()\r\n };\r\n\r\n return OrderTemplateRender(currentTemplateProps)!;\r\n });\r\n }\r\n\r\n private readonly _onDismiss = () => {\r\n this.setState({\r\n isOpen: false\r\n });\r\n };\r\n\r\n private readonly _reloadPage = async () => {\r\n window.location.reload();\r\n };\r\n\r\n private readonly _onRemoveFromOrderTemplateList = (productListId: string): void | undefined => {\r\n const { context, data, telemetry, resources } = this.props;\r\n const { orderTemplates } = data;\r\n\r\n if (context && context.actionContext) {\r\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\r\n if (userToken && orderTemplates.result && orderTemplates.result[0] && productListId) {\r\n const orderTemplate = orderTemplates.result.find(p => p.productList.Id === productListId);\r\n if (orderTemplate) {\r\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.productList)\r\n .then()\r\n .catch((error: string) => {\r\n telemetry.warning('[order-template-list] Unable to delete order template.');\r\n telemetry.error(error);\r\n this.setState({\r\n itemKey: productListId,\r\n headerStatusMessage: resources.deleteOrderTemplateFailedText,\r\n statusCssString: 'danger',\r\n messageGlyph: 'fas fa-exclamation-triangle',\r\n isOpen: true\r\n });\r\n })\r\n .then(this._reloadPage);\r\n } else {\r\n telemetry.warning('[order-template-list] Failed to delete order template. Order template was not found');\r\n }\r\n } else {\r\n telemetry.warning('[order-template-list] Failed to delete order template.');\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport default OrderTemplateList;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { INodeProps, Node, Module, Modal, ModalBody, ModalHeader, Waiting } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISingleOrderTemplateViewProps } from './components';\r\nimport { IOrderTemplateListViewProps } from './krannich-c-order-template-list';\r\nimport {\r\n IKrannichCOrderTemplateListProps,\r\n IKrannichCOrderTemplateListResources\r\n} from './krannich-c-order-template-list.props.autogenerated';\r\nexport interface ITemplateList {\r\n isMobile: boolean;\r\n orderTemplates: ISingleOrderTemplateViewProps[];\r\n OrderTemplate: INodeProps | undefined;\r\n toShowItemNumberProp: string | undefined;\r\n OrderTemplates: INodeProps | undefined;\r\n resources: IKrannichCOrderTemplateListResources;\r\n}\r\nexport interface IOrderTemplateLine {\r\n orderTemplate: ISingleOrderTemplateViewProps;\r\n OrderTemplate?: INodeProps;\r\n resources?: IKrannichCOrderTemplateListResources;\r\n}\r\nconst TemplateList: React.FC = ({\r\n isMobile,\r\n orderTemplates,\r\n OrderTemplate,\r\n toShowItemNumberProp,\r\n OrderTemplates,\r\n resources\r\n}) => {\r\n if (!orderTemplates) {\r\n return null;\r\n }\r\n //*******VSI CUSTOMIZATION START*******//\r\n\r\n //Customization States and UseEffects\r\n const [templates, setTemplates] = React.useState([]);\r\n const [isLoading, setIsLoading] = React.useState(true);\r\n const [isDisabled, setIsDisabled] = React.useState(false);\r\n const [counter, setCounter] = React.useState(1);\r\n const [quan, setQuan] = React.useState(Number(toShowItemNumberProp) || 5);\r\n const [toShowItemNumber, setToShowItemNumber] = React.useState(quan);\r\n\r\n //First time call to set number of items set to display from config otherwise default 2 and call addAddress function to set\r\n //addresses\r\n React.useEffect(() => {\r\n setQuan(Number(toShowItemNumberProp) || 5);\r\n addAddresses();\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n setQuan(Number(toShowItemNumberProp) || 5);\r\n addAddresses();\r\n }, [orderTemplates]);\r\n\r\n //Call after every change in toShwoItemNumber\r\n React.useEffect(() => {\r\n addAddresses();\r\n }, [toShowItemNumber]);\r\n\r\n //Disable viewmore button once TSX prop \"items\" arrary is equal to our custom addreses array\r\n React.useEffect(() => {\r\n orderTemplates.length === templates.length ? setIsDisabled(true) : setIsDisabled(false);\r\n }, [orderTemplates, templates]);\r\n\r\n //Update to display item number\r\n React.useEffect(() => {\r\n setToShowItemNumber(quan * counter);\r\n }, [counter]);\r\n\r\n //Function is used to set counter on every click on view more button\r\n const handleToShowItemNumer = () => {\r\n setCounter(counter + 1);\r\n };\r\n\r\n //Funciton is used to set the items in our custom array according to view more button clicks and default config dispaly number\r\n const addAddresses = () => {\r\n setIsLoading(true);\r\n const arr: ISingleOrderTemplateViewProps[] = [];\r\n for (let index = 0; index < toShowItemNumber; ++index) {\r\n // eslint-disable-next-line security/detect-object-injection\r\n orderTemplates[index] && arr.push(orderTemplates[index]);\r\n }\r\n setTemplates(arr);\r\n setIsLoading(false);\r\n };\r\n //*******VSI CUSTOMIZATION END*******//\r\n if (isMobile) {\r\n return (\r\n <>\r\n \r\n {templates &&\r\n templates?.map(orderTemplate => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n\r\n {\r\n handleToShowItemNumer();\r\n }}\r\n disabled={isDisabled}\r\n >\r\n {resources?.viewMoreButton}\r\n \r\n \r\n );\r\n } else {\r\n return (\r\n <>\r\n {isLoading ? (\r\n \r\n ) : (\r\n <>\r\n \r\n
  • \r\n {resources?.orderTemplateName}\r\n {resources?.productsInTemplate}\r\n {resources?.actionsHeadingTemplate}\r\n
  • \r\n {templates &&\r\n templates?.map(orderTemplate => {\r\n return (\r\n \r\n );\r\n })}\r\n
    \r\n\r\n {\r\n handleToShowItemNumer();\r\n }}\r\n disabled={isDisabled}\r\n >\r\n {resources?.viewMoreButton}\r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n};\r\nconst OrderTemplateListView: React.FC> = props => {\r\n const {\r\n OrderTemplateList,\r\n status,\r\n statusMessage,\r\n heading,\r\n OrderTemplates,\r\n orderTemplates,\r\n OrderTemplate,\r\n createOrderTemplateButton,\r\n templateHeaderStatusMessage,\r\n isMobile,\r\n resources,\r\n toShowItemNumber\r\n } = props;\r\n if (isMobile) {\r\n return (\r\n \r\n {heading}\r\n {status !== 'SUCCESS' && statusMessage}\r\n \r\n {createOrderTemplateButton}\r\n {templateHeaderStatusMessage}\r\n \r\n {OrderTemplates && orderTemplates && orderTemplates.length > 0 && (\r\n \r\n )}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {heading}\r\n {status !== 'SUCCESS' && statusMessage}\r\n \r\n {createOrderTemplateButton}\r\n {templateHeaderStatusMessage}\r\n \r\n {OrderTemplates && orderTemplates && orderTemplates.length > 0 && (\r\n \r\n )}\r\n \r\n );\r\n }\r\n};\r\n\r\nconst RenderOrderTemplate: React.FC = ({ orderTemplate, OrderTemplate, resources }) => {\r\n const { key, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\r\n\r\n const [showAlert, setShowAlert] = React.useState(false);\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n };\r\n return (\r\n \r\n {showAlert && (\r\n \r\n
    \r\n {resources?.deleteTemplateHeading}\r\n \r\n {resources?.deleteSelectedOrderTemplate}\r\n
    \r\n {removeButton}\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n )}\r\n {orderTemplateName}\r\n
    \r\n \r\n
    \r\n {orderTemplateStatusMessage}\r\n
    \r\n );\r\n};\r\n\r\nconst RenderOrderTemplateForMobile: React.FC = ({ orderTemplate, resources }) => {\r\n const { orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\r\n const [showAlert, setShowAlert] = React.useState(false);\r\n const toggleAlert = () => {\r\n setShowAlert(!showAlert);\r\n };\r\n return (\r\n
    \r\n {showAlert && (\r\n \r\n
    \r\n {resources?.deleteTemplateHeading}\r\n \r\n {resources?.deleteSelectedOrderTemplate}\r\n
    \r\n {removeButton}\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n )}\r\n
    {orderTemplateName}
    \r\n\r\n
    \r\n \r\n
    \r\n {orderTemplateStatusMessage}\r\n
    \r\n );\r\n};\r\n\r\nexport default OrderTemplateListView;\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 * IKrannichCProductCollection containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum toDisplayProdCollection {\r\n topRated = 'topRated',\r\n focus = 'focus',\r\n ootb = 'ootb'\r\n}\r\n\r\nexport const enum layout {\r\n carousel = 'carousel',\r\n grid = 'grid'\r\n}\r\n\r\nexport interface IKrannichCProductCollectionConfig extends Msdyn365.IModuleConfig {\r\n toDisplayProdCollection?: toDisplayProdCollection;\r\n requestPriceForProductCollection?: IRequestPriceForProductCollectionData;\r\n productCollection: Msdyn365.IProductList;\r\n heading?: IHeadingData;\r\n layout?: layout;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n clientRender?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n shouldDisplaySeeAllButton?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport interface IKrannichCProductCollectionResources {\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingCountAriaLabel: string;\r\n ratingCountAriaLabelSingleUser: string;\r\n seeAllButtonText: string;\r\n}\r\n\r\nexport interface IRequestPriceForProductCollectionData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport const enum HeadingTag {\r\n h1 = 'h1',\r\n h2 = 'h2',\r\n h3 = 'h3',\r\n h4 = 'h4',\r\n h5 = 'h5',\r\n h6 = 'h6'\r\n}\r\n\r\nexport interface IHeadingData {\r\n text: string;\r\n tag?: HeadingTag;\r\n}\r\n\r\nexport interface IKrannichCProductCollectionProps extends Msdyn365.IModule {\r\n resources: IKrannichCProductCollectionResources;\r\n config: IKrannichCProductCollectionConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { ProductComponent } from '../../themes/krannich/views/components/product.component';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getCatalogId, getUrlSync, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n DimensionSwatchDisplayTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n ObjectExtensions,\r\n PriceForProductSearchResultInput,\r\n validateCatalogId\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n getTelemetryObject,\r\n IComponentNodeProps,\r\n IModuleProps,\r\n INodeProps,\r\n ISingleSlideCarouselProps,\r\n ITelemetryContent,\r\n NodeTag,\r\n SingleSlideCarousel\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IKrannichCProductCollectionData } from './krannich-c-product-collection.data';\r\nimport { IKrannichCProductCollectionProps, layout } from './krannich-c-product-collection.props.autogenerated';\r\n\r\nexport interface IProductCollectionViewProps extends IKrannichCProductCollectionProps {\r\n heading?: React.ReactNode;\r\n ProductCollectionContainer: IModuleProps;\r\n SingleSlideCarouselComponentProps: INodeProps;\r\n GridComponentProps: INodeProps;\r\n products: IProductComponentViewProps[];\r\n isCarousel: boolean;\r\n productPrices?: ProductPrice[];\r\n seeAllButton?: React.ReactNode;\r\n}\r\n\r\nexport interface IProductComponentViewProps {\r\n ProductContainer: INodeProps;\r\n productComponent: React.ReactNode;\r\n}\r\nexport interface IProductComponentState {\r\n products: ProductSearchResult[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * ProductCollection component.\r\n */\r\nclass ProductCollection extends React.PureComponent<\r\n IKrannichCProductCollectionProps,\r\n IProductComponentState\r\n> {\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n constructor(props: IKrannichCProductCollectionProps) {\r\n super(props);\r\n this.productPrices = [];\r\n this.state = {\r\n products: this.props.config.productCollection.products || []\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\r\n await this._getActivePrice();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { heading, className, shouldDisplaySeeAllButton } = this.props.config;\r\n const { resources } = this.props;\r\n const recommendation = this.props.config.productCollection.recommendationListId;\r\n\r\n // Initialize state in case if the products were not found during initial module render\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\r\n this.initProductState(this.props.config.productCollection);\r\n\r\n const products = this.state.products;\r\n const isCarousel = this.props.config.layout === layout.carousel;\r\n const headingLabel = heading ? heading.text : '';\r\n const headingComponent = heading && (\r\n \r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\r\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\r\n const getProductData = this._getProduct(item, index);\r\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\r\n });\r\n\r\n const productCollectionViewProps = {\r\n ...this.props,\r\n heading: headingComponent,\r\n SingleSlideCarouselComponentProps: {\r\n tag: SingleSlideCarousel,\r\n className: '',\r\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\r\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\r\n parentId: this.props.id,\r\n telemetryContent: this.telemetryContent\r\n } as IComponentNodeProps,\r\n ProductCollectionContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-product-collection', className)\r\n },\r\n GridComponentProps: {\r\n tag: 'ul' as NodeTag,\r\n className: 'ms-product-collection__items'\r\n },\r\n isCarousel,\r\n\r\n products:\r\n ArrayExtensions.hasElements(updatedProducts) &&\r\n updatedProducts.filter(item => {\r\n return item !== undefined;\r\n }),\r\n productPrices: this.productPrices,\r\n seeAllButton:\r\n recommendation && shouldDisplaySeeAllButton && ArrayExtensions.hasElements(updatedProducts)\r\n ? this._getSeeAllButton(recommendation, headingLabel)\r\n : undefined\r\n };\r\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\r\n }\r\n\r\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @param products - Products.\r\n * @returns Promise.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise => {\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n const validProducts = ArrayExtensions.validValues(products);\r\n if (\r\n ArrayExtensions.hasElements(validProducts) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\r\n ) {\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(\r\n validProducts,\r\n this.props.context as ICoreContext,\r\n DimensionSwatchDisplayTypes.productCard\r\n ),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Helper method to initialize products state.\r\n * @param productCollection - List of products.\r\n */\r\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\r\n let products = this.state.products;\r\n const productCollectionProducts = productCollection.products;\r\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\r\n products = productCollectionProducts;\r\n this.setState({ products });\r\n } else if (\r\n ArrayExtensions.hasElements(products) &&\r\n ArrayExtensions.hasElements(productCollectionProducts) &&\r\n !ArrayExtensions.equals(products, productCollectionProducts)\r\n ) {\r\n products = productCollectionProducts;\r\n this.setState({ products });\r\n } else if (productCollectionProducts === undefined && ArrayExtensions.hasElements(this.state.products)) {\r\n products = [];\r\n this.setState({ products: products });\r\n }\r\n\r\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\r\n await this._getProductsDimensionsAvailabilities(products);\r\n }\r\n };\r\n\r\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\r\n if (!product || !product.Name) {\r\n this.props.telemetry.trace('[product-collection] Product or product name is null');\r\n return null;\r\n }\r\n const telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const resources = this.props.resources;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const quickviewSlot =\r\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\r\n const productComparisonButtonSlot = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\r\n ? this.props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n const reviewCount = 1;\r\n const reviewTotalRatings = Number(product.TotalRatings);\r\n const reviewCountAriaLabelValue =\r\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\r\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return {\r\n ProductContainer: {\r\n tag: 'li' as NodeTag,\r\n className: 'ms-product-collection__item',\r\n role: 'listitem',\r\n key: index\r\n },\r\n productComponent: (\r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\r\n )}\r\n isDisplayType={this.props.config.toDisplayProdCollection}\r\n requestPrice={this.props.config.requestPriceForProductCollection}\r\n customerInformation={this.props.data.customerInformation.result}\r\n />\r\n )\r\n };\r\n };\r\n\r\n /**\r\n * Get the active price for products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.state.products;\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n if (Msdyn365.msdyn365Commerce.isBrowser) {\r\n await this._getProductsDimensionsAvailabilities(products);\r\n }\r\n\r\n this.setState({ products });\r\n };\r\n\r\n /**\r\n * Get the see all button.\r\n * @param recommendation - Recommendation.\r\n * @param headingLabel - Heading label.\r\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\r\n */\r\n private readonly _getSeeAllButton = (recommendation: string, headingLabel: string): React.ReactNode => {\r\n if (!Msdyn365.msdyn365Commerce.isBrowser) {\r\n return null;\r\n }\r\n\r\n const catalogId = getCatalogId(this.props.context.request);\r\n validateCatalogId(catalogId);\r\n const searchPageLink = getUrlSync('search', this.props.context.actionContext);\r\n if (!searchPageLink) {\r\n return null;\r\n }\r\n const url = new URL(searchPageLink, window.location.href);\r\n url.searchParams.set('recommendation', recommendation);\r\n url.searchParams.set('title', headingLabel);\r\n url.searchParams.set('catalogid', `${catalogId}`);\r\n\r\n return (\r\n \r\n {this.props.resources.seeAllButtonText}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport default ProductCollection;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './krannich-c-product-collection';\r\n\r\nconst ProductCollectionView: React.FC = props => {\r\n const {\r\n heading,\r\n ProductCollectionContainer,\r\n products,\r\n SingleSlideCarouselComponentProps,\r\n GridComponentProps,\r\n isCarousel,\r\n seeAllButton\r\n } = props;\r\n\r\n if (products) {\r\n return (\r\n \r\n {heading}\r\n {seeAllButton}\r\n {isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)}\r\n \r\n );\r\n }\r\n props.context.telemetry.error('Product collection content is empty, module wont render.');\r\n return null;\r\n};\r\n\r\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return {items && items.map(_renderProduct)};\r\n};\r\n\r\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\r\n const { ProductContainer, productComponent } = product;\r\n\r\n return {productComponent};\r\n};\r\n\r\nexport default ProductCollectionView;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\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 { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IQuickOrderDrawerProps } from './krannich-c-quick-order-drawer-props';\r\n\r\nexport interface IQuickOrderDrawerState {\r\n isOpen: boolean;\r\n}\r\n\r\nexport type GlyphPlacement = 'start' | 'end';\r\n\r\n/**\r\n * Quick Order Drawer - This is a full width uncontrolled collapse where the button glyph changes\r\n * when the drawer is open and closed.\r\n */\r\n\r\nexport default class QuickOrderDrawer extends React.Component {\r\n public state: IQuickOrderDrawerState;\r\n\r\n private readonly drawerOpenGlyph: string;\r\n\r\n private readonly drawerCloseGlyph: string;\r\n\r\n private readonly drawerGlyphClass: string;\r\n\r\n private isManuallyToggled: boolean;\r\n\r\n constructor(props: IQuickOrderDrawerProps) {\r\n super(props);\r\n this._toggle = this._toggle.bind(this);\r\n this.isManuallyToggled = false;\r\n this.state = { isOpen: (props.collapseProps && props.collapseProps.isOpen) || false };\r\n this.drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\r\n\r\n if (this.props.animateGlyph) {\r\n this.drawerOpenGlyph = classnames(\r\n this.drawerGlyphClass,\r\n this.props.openGlyph ? this.props.openGlyph : this.props.closeGlyph ? this.props.closeGlyph : ''\r\n );\r\n this.drawerCloseGlyph = this.drawerOpenGlyph;\r\n } else {\r\n this.drawerOpenGlyph = classnames(this.drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\r\n this.drawerCloseGlyph = classnames(this.drawerGlyphClass, this.props.closeGlyph ? this.props.closeGlyph : '');\r\n }\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IQuickOrderDrawerProps, nextState: IQuickOrderDrawerState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element {\r\n const collapseProps = { ...this.props.collapseProps } as ICollapseProps;\r\n\r\n // If the drawer is manually toggled by pressing the button, then we use the internal state\r\n if (collapseProps.isOpen === undefined || this.isManuallyToggled) {\r\n collapseProps.isOpen = this.state.isOpen;\r\n } else {\r\n // eslint-disable-next-line react/no-direct-mutation-state\r\n this.state.isOpen = collapseProps.isOpen;\r\n }\r\n collapseProps.children = this.props.children;\r\n const drawerClass = classnames('drawer', this.props.className ? this.props.className : '');\r\n this.isManuallyToggled = false;\r\n return (\r\n
    \r\n \r\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen)}\r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n private _generateDrawerButtonInnerMarkup(collapseState: boolean): JSX.Element {\r\n const drawerButtonTextClass = classnames(\r\n 'drawer__buttontext',\r\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\r\n );\r\n return (\r\n <>\r\n

    {this.props.moduleHeadingText}

    \r\n \r\n {this.props.moduleDescriptionText}\r\n \r\n {this._generateGlyphMarkup('drawer__glyph__end', collapseState)}\r\n \r\n );\r\n }\r\n\r\n private _generateGlyphMarkup(location: string, collapseState: boolean): JSX.Element {\r\n let glyphClass = collapseState ? this.drawerOpenGlyph : this.drawerCloseGlyph;\r\n glyphClass = `${glyphClass} ${location}`;\r\n return ;\r\n }\r\n\r\n private _toggle(e: React.MouseEvent | React.KeyboardEvent): void {\r\n e.preventDefault();\r\n this.setState({ isOpen: !this.state.isOpen });\r\n this.isManuallyToggled = true;\r\n if (this.props.onToggle) {\r\n this.props.onToggle(this.state);\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 { Alert, Button } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IQuickOrderState } from '../krannich-c-quick-order';\r\n\r\nexport interface IQuickOrderFormProps {\r\n disableAddtoCart: boolean | undefined;\r\n productTextInput: React.RefObject;\r\n quantityTextInput: React.RefObject;\r\n maxChars: number;\r\n maxQuantity?: number;\r\n ariaLabelQuantity: string;\r\n ariaLabelProduct: string;\r\n ariaLabelAddtoCart: string;\r\n addQuantityPlaceholderText: string;\r\n quickOrderState: IQuickOrderState;\r\n handleInputChange(query: string): void;\r\n handleQuantityChange(query: string): void;\r\n handleAddToCartClick(): Promise;\r\n}\r\n\r\nexport interface IQuickOrderFormViewProps {\r\n product: React.ReactNode;\r\n quantity: React.ReactNode;\r\n addToCartBtn: React.ReactNode;\r\n userMessage?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * On Input Change functionality.\r\n * @param handleInputChange -Input change function.\r\n * @returns Input change value.\r\n */\r\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\r\n handleInputChange(event.target.value || '');\r\n};\r\n\r\n/**\r\n * On Quantity Change functionality.\r\n * @param handleQuantityChange -Quantity change function.\r\n * @returns Quantity change value.\r\n */\r\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent) => {\r\n handleQuantityChange(event.target.value || '');\r\n};\r\n\r\nexport const QuickOrderFormComponent = (props: IQuickOrderFormProps): IQuickOrderFormViewProps => {\r\n const {\r\n productTextInput,\r\n quantityTextInput,\r\n quickOrderState,\r\n maxChars,\r\n maxQuantity,\r\n disableAddtoCart,\r\n ariaLabelQuantity,\r\n ariaLabelProduct,\r\n ariaLabelAddtoCart,\r\n addQuantityPlaceholderText,\r\n handleQuantityChange,\r\n handleInputChange,\r\n handleAddToCartClick\r\n } = props;\r\n\r\n const onInputChange = onInputChangeFunction(handleInputChange);\r\n\r\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\r\n\r\n const productNode = (\r\n
    \r\n

    \r\n {ariaLabelProduct}\r\n

    \r\n \r\n
    \r\n );\r\n\r\n const quantityNode = (\r\n
    \r\n

    \r\n {ariaLabelQuantity}\r\n

    \r\n \r\n
    \r\n );\r\n\r\n const addtoCartNode = (\r\n
    \r\n \r\n {ariaLabelAddtoCart}\r\n \r\n
    \r\n );\r\n\r\n const userMessageNode =\r\n quickOrderState && quickOrderState.stateMessage ? (\r\n \r\n \r\n {quickOrderState.stateMessage.messageText}\r\n \r\n ) : (\r\n undefined\r\n );\r\n\r\n return {\r\n product: productNode,\r\n addToCartBtn: addtoCartNode,\r\n quantity: quantityNode,\r\n userMessage: userMessageNode\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 { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable } from 'mobx';\r\n\r\n/**\r\n * Represents a product for quick order.\r\n */\r\nexport class QuickOrderProduct {\r\n @observable\r\n public isSelected: boolean;\r\n\r\n public readonly cartLine: CartLine;\r\n\r\n public readonly simpleProduct: SimpleProduct;\r\n\r\n public constructor(cartLine: CartLine, simpleProduct: SimpleProduct) {\r\n this.cartLine = cartLine;\r\n this.simpleProduct = simpleProduct;\r\n this.isSelected = false;\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 { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\n\r\n/**\r\n * Interface for quick order table header resources.\r\n */\r\nexport interface IQuickOrderTableHeaderResources {\r\n quickOrderProductNumberText: string;\r\n quickOrderProductText: string;\r\n quickOrderUnitPriceText: string;\r\n quickOrderUnitOfMeasureText: string;\r\n quickOrderQuantityText: string;\r\n quickOrderTotalText: string;\r\n quickOrderActionsText: string;\r\n}\r\n\r\n/**\r\n * Interface for quick order table props.\r\n */\r\nexport interface IQuickOrderTableHeaderProps extends IComponentProps {\r\n context: ICoreContext;\r\n className: string;\r\n\r\n isMobile: boolean;\r\n resources: IQuickOrderTableHeaderResources;\r\n}\r\n\r\n/**\r\n * Interface for quick order table header component.\r\n */\r\nexport interface IQuickOrderTableHeaderComponent extends IComponent {}\r\n\r\n/**\r\n * Get the quick order header cells for desktop.\r\n * @param props -- The quick order table header props.\r\n * @returns The list of cells for quick order header component in desktop version.\r\n */\r\nconst QuickOrderDesktopHeaderCellsComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\r\n const { resources } = props;\r\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\r\n return (\r\n <>\r\n \r\n \r\n \r\n {resources.quickOrderProductNumberText}\r\n {resources.quickOrderProductText}\r\n {resources.quickOrderUnitPriceText}\r\n {resources.quickOrderUnitOfMeasureText}\r\n {resources.quickOrderQuantityText}\r\n {resources.quickOrderTotalText}\r\n {resources.quickOrderActionsText}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Get the quick order header cells for mobile.\r\n * @param props -- The quick order table header props.\r\n * @returns The quick order header component in desktop version.\r\n */\r\nconst QuickOrderMobileHeaderCellsComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\r\n const { resources } = props;\r\n return (\r\n <>\r\n \r\n {resources.quickOrderProductNumberText}\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * Quick order table header component.\r\n * @param props - Configuration of the component.\r\n * @returns React node with the header.\r\n */\r\nexport const QuickOrderTableHeaderComponent: React.FC = (props: IQuickOrderTableHeaderProps) => {\r\n const rowClassName = `${props.className}__row`;\r\n\r\n let headerCells: JSX.Element;\r\n if (props.isMobile) {\r\n headerCells = ;\r\n } else {\r\n headerCells = ;\r\n }\r\n\r\n return (\r\n \r\n {headerCells}\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 { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { CartLine, format, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Button, IncrementalQuantity } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\n/**\r\n * Data required to render each quick order row.\r\n */\r\nexport interface IQuickOrderTableRowData {\r\n cartLine: CartLine;\r\n product: SimpleProduct;\r\n}\r\n\r\n/**\r\n * Resources for quick order table rows.\r\n */\r\nexport interface IQuickOrderTableRowResources {\r\n quickOrderQuantityMobileText: string;\r\n quickOrderProductDimensionsSeparator: string;\r\n quickOrderViewDetailsButtonText: string;\r\n quickOrderViewDetailsButtonAriaLabel: string;\r\n quickOrderRemoveItemButtonAriaLabel: string;\r\n quickOrderInputQuantityAriaLabel: string;\r\n quickOrderDecrementButtonAriaLabel: string;\r\n quickOrderIncrementButtonAriaLabel: string;\r\n}\r\n\r\n/**\r\n * Interface for quick order table props.\r\n */\r\nexport interface IQuickOrderTableRowProps extends IComponentProps {\r\n context: ICoreContext;\r\n className: string;\r\n\r\n imageSettings?: IImageSettings;\r\n isMobile: boolean;\r\n resources: IQuickOrderTableRowResources;\r\n}\r\n\r\n/**\r\n * The default image settings for quick order table row.\r\n */\r\nconst defaultImageSettings: IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\r\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\r\n },\r\n lazyload: true,\r\n cropFocalRegion: true\r\n};\r\n\r\n/**\r\n * Renders product image for quick order row.\r\n * @param props - Quick order table row props.\r\n * @returns React element.\r\n */\r\nconst QuickOrderTableRowProductImageComponent: React.FC = (props: IQuickOrderTableRowProps) => {\r\n const fallbackImageUrl = getFallbackImageUrl(props.data.product.ItemId, props.context.actionContext.requestContext.apiSettings);\r\n\r\n const containerClassName = `${props.className}__product-image-container`;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * Renders actions popup for the mobile view.\r\n * @param props - Configuration for popup.\r\n * @returns A react node with actions..\r\n */\r\nconst QuickOrderExtraActionsPopupComponent: React.FC = (props: IQuickOrderTableRowProps): JSX.Element | null => {\r\n const product: SimpleProduct = props.data.product;\r\n\r\n let productUrl = '';\r\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\r\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\r\n }\r\n\r\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\r\n return null;\r\n }\r\n\r\n const className = `${props.className}__extra-actions-cell`;\r\n\r\n return (\r\n
    \r\n
    \r\n );\r\n};\r\n\r\n/**\r\n * Renders quick order table rows for desktop view.\r\n * @param props - Configuration for the rows.\r\n * @returns A react node with a list of quick order rows for desktop view.\r\n */\r\nexport const QuickOrderDesktopTableRowCellComponent: React.FC = (props: IQuickOrderTableRowProps) => {\r\n const product: SimpleProduct = props.data.product;\r\n const cartLine: CartLine = props.data.cartLine;\r\n const columnWithNumberClassName = `${props.className}__column-with-number`;\r\n\r\n let productUrl = '';\r\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\r\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {product.ItemId}\r\n \r\n
    \r\n \r\n {product.Name}\r\n \r\n \r\n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\r\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\r\n .join(props.resources.quickOrderProductDimensionsSeparator)}\r\n \r\n
    \r\n \r\n {cartLine.Price}\r\n {cartLine.UnitOfMeasureSymbol}\r\n \r\n \r\n \r\n {cartLine.TotalAmount}\r\n \r\n
    \r\n );\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\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 { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry\r\n): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ProductListInventoryFilteringOptions } from '../actions';\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { isMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\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, closeAriaLabel } = 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) => {\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.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\r\n ? item.value.LeftValueBoundString\r\n : (item.value.LeftValueBoundLocalizedString ||\r\n item.value.LeftValueBoundLocalizedString === undefined) &&\r\n item.value.RefinerRecordId === 0\r\n ? item.key\r\n : item.value.LeftValueBoundString}\r\n \r\n \r\n
    • \r\n );\r\n })}\r\n
    \r\n {items.length > 0 && clearAllText && (\r\n \r\n {clearAllText}\r\n \r\n )}\r\n
    \r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = 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 if (productRefinerValue.RefinerRecordId === 0) {\r\n const filterValue = refinerValues?.Values.find(\r\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\r\n );\r\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n if (refinerName === 'Rating' || refinerName === 'Price') {\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\r\n }\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\r\n return (result && result.value) || undefined;\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 * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
    \r\n {` `}\r\n {text}\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 { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IKrannichCSearchResultContainerResources } from '../krannich-c-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IKrannichCSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading =\r\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
    \r\n \r\n
    \r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage,\r\n context.actionContext.requestContext\r\n )}\r\n
    \r\n \r\n
    \r\n

    {heading}

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

    {title}

    ;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\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 * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n \r\n {' '}\r\n {text}{' '}\r\n \r\n);\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\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 { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return {props.resources.modalTitle};\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { ProductComponent } from '../components/productCard.component';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { Customer, ProductPrice, ProductSearchResult, Cart, AsyncResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n IKrannichCSearchResultContainerResources,\r\n IPlpRequestPriceButtonData\r\n} from '../krannich-c-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IKrannichCSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n productComparisonButton?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n gridListView: boolean;\r\n requestPriceBtn: IPlpRequestPriceButtonData | undefined;\r\n activePrices: ProductPrice[];\r\n customerInformation?: Customer;\r\n atpData: any;\r\n cart?: AsyncResult;\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n productComparisonButton,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities,\r\n gridListView,\r\n requestPriceBtn,\r\n activePrices,\r\n customerInformation,\r\n atpData,\r\n cart\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n
      \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
    • \r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n resources={resources}\r\n requestPriceBtn={requestPriceBtn}\r\n activePrices={activePrices}\r\n customerInformation={customerInformation}\r\n atpData={atpData}\r\n cart={cart}\r\n />\r\n
    • \r\n ))}\r\n
    \r\n );\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n minValueState: number;\r\n maxValueState: number;\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] =\r\n this.props.parentProductRefinerHierarchy.KeyName === 'Price'\r\n ? this.getLabels(sliderId, minPrice, maxPrice)\r\n : this.getLabels(sliderId, String(minValue), String(maxValue));\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs,\r\n minValueState: 0,\r\n maxValueState: 0\r\n };\r\n }\r\n public componentDidMount() {\r\n if (this.state.selectedMax === undefined) {\r\n this.setState({\r\n selectedMax: this.props.productRefinerValue.RightValueBoundString\r\n });\r\n }\r\n }\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] =\r\n this.props.parentProductRefinerHierarchy.KeyName === 'Price'\r\n ? this.getLabels(sliderId, minPrice, maxPrice)\r\n : this.getLabels(sliderId, String(minValue), String(maxValue));\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return [\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ];\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (\r\n sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string\r\n ): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return [\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ];\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n const currencySign = this.props.context.cultureFormatter.formatCurrency(this.currencyCode).replace('NaN', '');\r\n return (\r\n
    \r\n \r\n \r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n
    \r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n return (\r\n <>\r\n \r\n {this._renderInputFields()}\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 //VSI Customization for max Value\r\n let maxCheckValue = event.currentTarget.value;\r\n if (Number(maxCheckValue) > Number(this.state.maxValue!)) {\r\n maxCheckValue = this.state.maxValue!;\r\n }\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(maxCheckValue),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return 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 result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\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 private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n let toolTipLabel;\r\n if (this.props.parentProductRefinerHierarchy.KeyName === 'Price') {\r\n toolTipLabel = this._formatPrice(`${tooltip}`);\r\n } else {\r\n toolTipLabel = String(tooltip);\r\n }\r\n return toolTipLabel;\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(\r\n productRefinerValue,\r\n parentProductRefinerHierarchy,\r\n isChecked,\r\n context,\r\n index,\r\n telemetryContent,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel\r\n );\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel\r\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\r\n : '';\r\n } else {\r\n refineMenuItemAriaLabel = refineItemsAriaLabel\r\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\r\n : '';\r\n }\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\r\n\r\n let className = 'ms-refine-submenu-item';\r\n if (shouldDisplayAsSwatch) {\r\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\r\n }\r\n\r\n // If the swatch has no color or image specified, it should be displayed as text.\r\n // We don't use swatch logic to display the number of the results found together with the text.\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasContentSwatch = hasColor || hasImage;\r\n\r\n return (\r\n
  • \r\n \r\n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n\r\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\r\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\r\n return shouldDisplayAsSwatch;\r\n }\r\n\r\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n const swatchItems = [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ];\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n private _renderRating(\r\n productRefinerValue: ProductRefinerValue,\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean,\r\n context: ICoreContext,\r\n index?: number,\r\n telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string,\r\n ratingSingleUserCountAriaLabel?: string\r\n ): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\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 const productCountAriaLabelValue =\r\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\r\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\r\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\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 { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\r\n return null;\r\n }\r\n\r\n // VSI Customization to Hide price filter for guest users\r\n if (\r\n !this.props.context.actionContext.requestContext?.user?.isAuthenticated &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Price\r\n ) {\r\n return null;\r\n }\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 {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n isMobile\r\n } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n \r\n {listItems}\r\n \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\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 * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => (\r\n \r\n {` `}\r\n {separator}\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 * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => (\r\n \r\n {` `}\r\n {text}\r\n {` `}\r\n \r\n);\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IKrannichCSearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IKrannichCSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n plpRequestPriceButton?: IPlpRequestPriceButtonData;\r\n filteredRefiners?: IFilteredRefinersData[];\r\n}\r\n\r\nexport interface IKrannichCSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n tooltipText: string;\r\n requestPriceLabel: string;\r\n itemNumberLabel: string;\r\n manufacturerLabel: string;\r\n atpDiscontinuedMessageLabel: string;\r\n viewDetailsLabel: string;\r\n listLabel: string;\r\n gridLabel: string;\r\n filtersLabel: string;\r\n productsLabel: string;\r\n}\r\n\r\nexport interface IPlpRequestPriceButtonData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport interface IFilteredRefinersData {\r\n refinerCategory?: string;\r\n refinerName?: string;\r\n}\r\n\r\nexport interface IKrannichCSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IKrannichCSearchResultContainerResources;\r\n config: IKrannichCSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\nimport {\r\n ChannelInventoryConfiguration,\r\n format,\r\n ProductPrice,\r\n ProductRefinerValue,\r\n ProductSearchResult,\r\n SortColumn,\r\n TextValueTranslation\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n DimensionSwatchDisplayTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n PriceForProductSearchResultInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n isMobile,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCollectionRefinersAction,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n IFullProductsSearchResultsWithCount,\r\n parseQueryParam,\r\n ProductListInventoryFilteringOptions,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { ListPageState } from './list-page-state';\r\nimport { IKrannichCSearchResultContainerData } from './krannich-c-search-result-container.data';\r\nimport { expandRefinersCount, IKrannichCSearchResultContainerProps } from './krannich-c-search-result-container.props.autogenerated';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { IKRV_GetMultipleATPLeadTimeResponseDate } from '../../actions/customProxy/ATP-update/DataServiceEntities.g';\r\nimport { atpDataPlpaction, GetAtpdataPlpInput } from '../../actions/get-atpdata-plp.action';\r\nexport interface ISearchResultContainerViewProps extends IKrannichCSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n loadMore: (pageNumber: number) => void;\r\n renderGridAndListView: IgridProps;\r\n loading: boolean;\r\n categoryDiscription: React.ReactNode;\r\n atpData: IKRV_GetMultipleATPLeadTimeResponseDate;\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 activeFilters?: number;\r\n activeProducts?: number;\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container.\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n refiners: IProductRefinerHierarchy[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\r\n gridListView: boolean;\r\n productList: ProductSearchResult[];\r\n loading: boolean;\r\n activePrices: ProductPrice[];\r\n atpData: any;\r\n}\r\nexport interface IgridProps {\r\n renderGridAndListView: React.ReactNode;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IKrannichCSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize = 'lg';\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n private isListPageStateUpdated: boolean = false;\r\n\r\n //private _isMounted: boolean = false;\r\n private isLoadMore: boolean = true;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation?.Text;\r\n }\r\n\r\n public constructor(\r\n props: IKrannichCSearchResultContainerProps,\r\n state: ISearchResultContainerState\r\n ) {\r\n super(props);\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\r\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: [],\r\n channelInventoryConfiguration: undefined,\r\n gridListView: true,\r\n productList: [],\r\n loading: false,\r\n activePrices: [],\r\n atpData: []\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this._updateViewport();\r\n }\r\n public async componentDidMount(): Promise {\r\n //this._isMounted = true;\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n // VSI Customization for infinite scroll\r\n const {\r\n data: { listPageState, products: productCollection }\r\n } = this.props;\r\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\r\n void this._updateListPageState(listPageState.result, productCollection.result);\r\n this.isListPageStateUpdated = true;\r\n }\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState?.result?.activeFilters?.length,\r\n listPageState?.result?.currentPageNumber,\r\n ArrayExtensions.hasElements(listPageState?.result?.sortingCritera?.Columns)\r\n ];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n const input = new GetFullProductsByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n\r\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\r\n //VSI customization for loader until products result appear\r\n if (productResults.products.length >= 0) {\r\n const recordIds = productResults.products.map((value: any) => value?.RecordId);\r\n let activePrices: any = this.state.activePrices || [];\r\n if (recordIds && recordIds.length) {\r\n activePrices = await this.getActivePrices(recordIds);\r\n if (this.state.activePrices.length && activePrices.length) {\r\n activePrices = [...this.state.activePrices, ...activePrices];\r\n activePrices = [...new Set(activePrices)];\r\n }\r\n }\r\n if (activePrices && activePrices.length) {\r\n this.setState({\r\n loading: false,\r\n activePrices\r\n });\r\n } else {\r\n this.setState({\r\n loading: false\r\n });\r\n }\r\n }\r\n // VSI Customization for infinte scroll\r\n newListPageState.activeProducts = [...newListPageState.activeProducts, ...productResults.products];\r\n\r\n // Use a Set to store unique items based on ItemId\r\n const uniqueProducts: (ProductSearchResult | undefined)[] = Array.from(\r\n new Set(newListPageState?.activeProducts?.map(product => product.ItemId))\r\n ).map(itemId => newListPageState?.activeProducts?.find(product => product.ItemId === itemId));\r\n\r\n this.setState(\r\n {\r\n productList: [...(uniqueProducts as ProductSearchResult[])]\r\n },\r\n async () => {\r\n if (!this.isLoadMore && this.props.context.actionContext.requestContext.user.isAuthenticated) {\r\n const atpDataPlpParams = new GetAtpdataPlpInput(this.state.productList, this.state.atpData);\r\n const response = await atpDataPlpaction(atpDataPlpParams, this.props.context.actionContext);\r\n this.setState({ atpData: this.state.atpData.concat(response?.ATPTrafficLights) });\r\n }\r\n }\r\n );\r\n newListPageState.totalProductCount = productResults.count === 0 ? uniqueProducts?.length : productResults.count;\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\r\n this.isLoadMore = productResults.products.length > 0 ? true : false;\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice().catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes\r\n ) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId\r\n );\r\n\r\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\r\n this.setState({ refiners });\r\n }\r\n }\r\n );\r\n /* reaction(\r\n () => listPageState?.result?.currentPageNumber || this.isLoadMore,\r\n async () => {\r\n if (!this.isLoadMore && this.props.context.actionContext.requestContext.user.isAuthenticated) {\r\n const response = await atpDataPlpaction(this.state.productList, this.state.atpData, this.props.context.actionContext);\r\n this.setState({ atpData: response });\r\n }\r\n }\r\n );*/\r\n\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n config: { imageSettings, className },\r\n resources,\r\n data: { listPageState, products: productCollection, featureProduct }\r\n } = this.props;\r\n\r\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\r\n void this._updateListPageState(listPageState.result, productCollection.result);\r\n this.isListPageStateUpdated = true;\r\n }\r\n\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\r\n let errorText = '';\r\n if (!ArrayExtensions.hasElements(products)) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: 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: (\r\n \r\n ),\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: searchProduct ? featureComponent : null,\r\n productPrices: this.productPrices,\r\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities,\r\n loadMore: this._loadMoreProducts,\r\n renderGridAndListView: this.renderGridAndListView(),\r\n loading: this.state.loading,\r\n categoryDiscription: this._renderCategoryDiscription()\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Update the list page state with initial data.\r\n * @param listPageState -- List page State.\r\n * @param products -- Products.\r\n */\r\n private readonly _updateListPageState = async (\r\n listPageState: ListPageState,\r\n products: IFullProductsSearchResultsWithCount\r\n ): Promise => {\r\n let querySorting: SortColumn[] = [];\r\n const defaultPageNumber: number = 10;\r\n\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 if (this.props.context.request.query?.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n if (products.products && products.products.length) {\r\n this.setState({ loading: true });\r\n const recordIds = products.products.map((value: any) => value?.RecordId);\r\n let activePrices: ProductPrice[] = this.state.activePrices || [];\r\n if (recordIds && recordIds.length) {\r\n activePrices = await this.getActivePrices(recordIds);\r\n }\r\n this.setState({ loading: false, activePrices });\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query &&\r\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n if (this.props.context.request.query?.productId) {\r\n const featureProduct = this.props.data.featureProduct.result;\r\n if (featureProduct) {\r\n listPageState.featureProduct = featureProduct;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(\r\n productsList,\r\n this.props.context as ICoreContext,\r\n DimensionSwatchDisplayTypes.productCard\r\n ),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name) ||\r\n this.props.context.request.query?.title ||\r\n '';\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdownOptions = this._getAllSortByOptions();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\r\n }\r\n\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n // eslint-disable-next-line max-len -- existing code\r\n const skipCount = listPageState?.currentPageNumber\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?.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n let validRefiners =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n });\r\n const needToFilter = this.props.config?.filteredRefiners || [];\r\n validRefiners = validRefiners?.map(refiner => ({\r\n ...refiner,\r\n Values: refiner.Values?.filter(\r\n subRefiner =>\r\n !needToFilter.find(\r\n ntfRefiner =>\r\n ntfRefiner.refinerCategory === refiner.KeyName && ntfRefiner.refinerName === subRefiner.LeftValueBoundString\r\n )\r\n )\r\n }));\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\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 productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: {\r\n className: 'ms-search-result-container__refine-menu'\r\n },\r\n RefinerSectionContainer: {\r\n className: 'ms-search-result-container__refiner-section'\r\n },\r\n refiners: subMenus,\r\n activeFilters: this.props.data.listPageState?.result?.activeFilters?.length,\r\n activeProducts: this.props.data.listPageState?.result?.activeProducts?.length\r\n };\r\n };\r\n\r\n /**\r\n * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n const { channelInventoryConfiguration } = this.state;\r\n const isInventorySortableAttribute =\r\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\r\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\r\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\r\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\r\n\r\n const isInventoryProductAttribute =\r\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\r\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\r\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\r\n\r\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\r\n return (\r\n isInventorySortableAttribute ||\r\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n isInventoryProductAttribute)\r\n );\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const { channelInventoryConfiguration } = this.state;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\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 closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\r\n refinerValues={refinerValueName}\r\n />\r\n );\r\n };\r\n\r\n /**\r\n * Get Active products.\r\n * @returns - JSX Elements.\r\n */\r\n private readonly _getProducts = (): JSX.Element => {\r\n const {\r\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation, plpRequestPriceButton }\r\n } = this.props;\r\n const { resources } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\r\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\r\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n const products = this.state.productList || [];\r\n const quickviewSlot = this.props.slots?.quickview?.[0];\r\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\r\n ? this.props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={shouldAllowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewSlot}\r\n productComparisonButton={productComparisonButton}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n gridListView={this.state.gridListView}\r\n requestPriceBtn={plpRequestPriceButton}\r\n activePrices={this.state.activePrices}\r\n customerInformation={this.props.data.customerInformation?.result}\r\n atpData={this.state.atpData}\r\n cart={this.props.data?.cart}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n // eslint-disable-next-line max-len -- existing code\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n // VSI Customization - to Reset existing product in case of infinite scroll after sorting\r\n this.props.data.listPageState.result!.activeProducts = [];\r\n this.isLoadMore = false;\r\n this.setState({ loading: true });\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves dropdown options.\r\n * @returns All dropdown options.\r\n */\r\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!searchConfiguration) {\r\n return [];\r\n }\r\n\r\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\r\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\r\n );\r\n\r\n return ArrayExtensions.validValues(mappedSearchConfiguration);\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(\r\n mappedSearchConfig =>\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: \r\n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result?.activeFilters || []\r\n );\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n // VSI Customization - to Reset existing product in case of infinite scroll after applying filters\r\n this.props.data.listPageState.result!.activeProducts = [];\r\n this.isLoadMore = false;\r\n this.setState({ loading: true });\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n //VSI Customization\r\n data.listPageState.result.activeProducts = [];\r\n this.isLoadMore = false;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{paginationPreviousText}</span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{paginationNextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n /**\r\n * Renders a infinite scroll.\r\n */\r\n public _loadMoreProducts = (pageNumber: number) => {\r\n if (this.isLoadMore) {\r\n const info = `[_loadMoreProducts] Page Number: ${pageNumber}`;\r\n this.props.telemetry.information(info);\r\n\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber =\r\n parseInt(this.props.data.listPageState.result!.currentPageNumber?.toString() || '0', 10) + 1;\r\n this.isLoadMore = false;\r\n });\r\n }\r\n if (this.isMobile) {\r\n window.scrollBy(0, -100);\r\n }\r\n };\r\n public gridView = () => {\r\n this.setState({ gridListView: true });\r\n };\r\n public listView = () => {\r\n this.setState({ gridListView: false });\r\n };\r\n public renderGridAndListView = (): JSX.Element => {\r\n return (\r\n <>\r\n <div className='pull-right'>\r\n <button onClick={this.listView} className={this.state.gridListView ? 'list-view-btn' : 'list-view-btn active'}>\r\n {this.props.resources.listLabel}\r\n </button>\r\n <button onClick={this.gridView} className={!this.state.gridListView ? 'grid-view-btn' : 'grid-view-btn active'}>\r\n {this.props.resources.gridLabel}\r\n </button>\r\n </div>\r\n </>\r\n );\r\n };\r\n private getActivePrices = (RecordIds: any[]) => {\r\n return getActivePricesAsync(\r\n { callerContext: this.props.context.actionContext },\r\n {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n },\r\n RecordIds,\r\n new Date(),\r\n this.props.data?.customerInformation?.result?.AccountNumber ?? null,\r\n undefined,\r\n true\r\n );\r\n };\r\n public _renderCategoryDiscription = (): React.ReactNode => {\r\n const {\r\n data: {\r\n category: { result: category }\r\n }\r\n } = this.props;\r\n\r\n const categoryDisp = category?.ExtensionProperties?.find(property => property.Key === 'Description')?.Value?.StringValue || '';\r\n\r\n return <div className='plp-header-discription'>{categoryDisp}</div>;\r\n };\r\n /* private _atpData = async (products: any[]) => {\r\n const KRVATPLeadTimeDate: any[] = [];\r\n //Create date according to API\r\n const objectDate = new Date();\r\n const day = objectDate.getDate();\r\n const month = objectDate.getMonth();\r\n const year = objectDate.getFullYear();\r\n const requestedDate = `${day}/${month + 1}/${year}`;\r\n\r\n if (products.length > 0 && this.state.atpData.length === 0) {\r\n products?.map((e: any) => {\r\n KRVATPLeadTimeDate.push({\r\n itemID: e.ItemId,\r\n requestedDate: requestedDate\r\n });\r\n });\r\n } else {\r\n const atpItemIds = new Set(this.state.atpData?.map((item: { ItemId: any }) => item.ItemId));\r\n products.forEach(product => {\r\n if (atpItemIds.has(product.ItemId)) {\r\n return;\r\n } else {\r\n KRVATPLeadTimeDate.push({\r\n itemID: product.ItemId,\r\n requestedDate: requestedDate\r\n });\r\n }\r\n });\r\n }\r\n const ctx = { callerContext: this.props.context.actionContext };\r\n try {\r\n if (KRVATPLeadTimeDate.length === 0) {\r\n return;\r\n } else {\r\n const response = await kRV_GetMultipleATPLeadTimeDateAsync(ctx, KRVATPLeadTimeDate);\r\n this.setState({\r\n atpData: this.state.atpData.concat(response?.ATPTrafficLights)\r\n });\r\n }\r\n } catch (err) {\r\n console.error(err, 'ERR');\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport { Waiting } from '@msdyn365-commerce-modules/utilities';\r\n\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './krannich-c-search-result-container';\r\nimport InfiniteScroll from 'react-infinite-scroller';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n SearchResultContainer,\r\n products,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n renderGridAndListView,\r\n loading,\r\n data: {\r\n listPageState: { result: listPageState }\r\n },\r\n categoryDiscription,\r\n resources\r\n } = props;\r\n\r\n const krannichActiveProducts = [...new Set(listPageState?.activeProducts)];\r\n const [selectedFilterCount, setSelectedFilterCount] = React.useState<number | undefined>();\r\n const [isSelectedFilterCount, setIsSelectedFilterCount] = React.useState<boolean>(false);\r\n React.useEffect(() => {\r\n if (\r\n props.data?.listPageState?.result?.activeFilters?.length! > 0 &&\r\n props.data?.listPageState?.result?.activeFilters?.length! !== undefined\r\n ) {\r\n setTimeout(() => {\r\n setSelectedFilterCount(krannichActiveProducts.length ? props.data.listPageState.result?.totalProductCount : 0);\r\n setIsSelectedFilterCount(true);\r\n }, 100);\r\n } else {\r\n setIsSelectedFilterCount(false);\r\n }\r\n }, [\r\n props.data.listPageState.result?.activeFilters,\r\n props.data.listPageState.result?.totalProductCount,\r\n props.data.listPageState.result?.activeProducts\r\n ]);\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {categoryDiscription}\r\n {choiceSummary}\r\n {modalToggle}\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage, resources.filtersLabel)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n {loading ? (\r\n <Waiting />\r\n ) : (\r\n <InfiniteScroll threshold={100} pageStart={0} loadMore={props.loadMore} hasMore={true || false}>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n </InfiniteScroll>\r\n )}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n <Node {...CategoryNavContainer}>{categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}</Node>\r\n <div className='ms-search-result-container'>\r\n <div className='ms-search-result-container__title-count'>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && isSelectedFilterCount && !loading\r\n ? _renderTitleCount(TitleViewProps, selectedFilterCount, resources.productsLabel)\r\n : null}\r\n </div>\r\n {categoryDiscription}\r\n </div>\r\n <Node {...RefineAndProductSectionContainer}>\r\n {refineMenu && renderRefiner(refineMenu, resources.filtersLabel)}\r\n <Node {...ProductSectionContainer}>\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {choiceSummary}\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions, renderGridAndListView)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n {loading ? (\r\n <Waiting />\r\n ) : (\r\n <InfiniteScroll threshold={100} pageStart={0} loadMore={props.loadMore} hasMore={true || false}>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n </InfiniteScroll>\r\n )}\r\n </Node>\r\n </Node>\r\n </Module>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string,\r\n filtersLabel?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage, filtersLabel),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string,\r\n filtersLabel?: string\r\n): JSX.Element | null => {\r\n return React.cloneElement(\r\n props.modalBody,\r\n {},\r\n sortByDropDown && renderSort(sortByDropDown, isRecoSearchPage),\r\n renderRefiner(refineMenu, filtersLabel)\r\n );\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps, filtersLabel?: string): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer, activeFilters, activeProducts } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {(activeFilters! > 0 || activeProducts! > 0) && (\r\n <div className='ms-search-result-container__refine-menu-filter-title'>{filtersLabel}</div>\r\n )}\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, renderGridAndListView: React.ReactNode, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return (\r\n <Node {...SortingContainer}>\r\n <div className='ms-search-result-container__sort-view'>\r\n {sortByDropDown}\r\n {renderGridAndListView}\r\n </div>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h2>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </h2>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst _renderTitleCount = (props: ITitleViewProps, count?: number, productsLabel?: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title && count) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h5>\r\n <span className='ms-search-result__collection-title-count'>\r\n {count} {productsLabel}\r\n </span>\r\n </h5>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\nexport default SearchResultContainerView;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, {\r\n getCatalogId,\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n AttributeValue,\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { getCustomer, GetCustomerInput } from '@msdyn365-commerce-modules/retail-actions';\r\n// AttributeValue,\r\n\r\n// AttributeValueBase,\r\n\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport {\r\n IItemsAddedToCartResources,\r\n ItemsAddedToCartDialogComponent,\r\n ItemSuccessfullyAddedToCartNotification,\r\n MultiItemsSuccessfullyAddedToCartNotification,\r\n OrderDetailsProduct\r\n} from '@msdyn365-commerce/components';\r\nimport { PriceComponent } from './price.component';\r\nimport { getAttributeValuesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { incExcPriceFormat, taxPercentage } from '../../../../utils/helper';\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise<SimpleProduct | null>;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: {\r\n productId: number;\r\n quantity: number;\r\n catalogId?: number;\r\n }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n catalogId?: number;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n customerTaxPercentage: number;\r\n\r\n isStatusTwoZeroFour?: boolean;\r\n onAdd?(result: ICartActionResult): void;\r\n onError?(result: IAddToCartFailureResult): void;\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\n/**\r\n * Cart action Failure reason type.\r\n */\r\nexport declare type ICartActionFailureReason =\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'OUTOFSTOCK'\r\n | 'CARTACTIONFAILED'\r\n | 'INVALIDCUSTOMAMOUNT';\r\n\r\n/**\r\n * Interface for add to cart failure result.\r\n */\r\nexport interface IAddToCartFailureResult {\r\n failureReason: ICartActionFailureReason;\r\n\r\n stockLeft?: number;\r\n cartActionResult?: ICartActionResult;\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\r\n */\r\nexport enum AddToCartBehavior {\r\n /**\r\n * Navigate to cart page.\r\n */\r\n goToCart = 'goToCart',\r\n\r\n /**\r\n * Show item added to cart popup.\r\n */\r\n showModal = 'showModal',\r\n\r\n /**\r\n * Show mini cart popup.\r\n */\r\n showMiniCart = 'showMiniCart',\r\n\r\n /**\r\n * Show item added to cart notification.\r\n */\r\n showNotification = 'showNotification',\r\n\r\n /**\r\n * Do nothing and stay on the page.\r\n */\r\n nothing = 'nothing'\r\n}\r\n\r\nconst zero = 0;\r\nconst defaultQuantity = 1;\r\n\r\n/**\r\n * The propagate result.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The cart action result.\r\n */\r\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\r\n if (props.onAdd) {\r\n props.onAdd(result);\r\n }\r\n};\r\n\r\n/**\r\n * The propagate error.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The add to cart failure result.\r\n */\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n if (props.onError) {\r\n props.onError(result);\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves add to cart input from the component props.\r\n * @param props - Add to cart component props.\r\n * @returns Add to cart input.\r\n */\r\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\r\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\r\n const input = products?.map(product => {\r\n return {\r\n product: product.simpleProduct!,\r\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity,\r\n catalogId: product.salesLine.CatalogId\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\r\n validateCatalogId(catalogId);\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity,\r\n catalogId: item.catalogId\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity,\r\n catalogId: props.catalogId\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n// const _getProductAttributes = async (product: SimpleProduct, props: IAddToCartComponentProps): Promise<AttributeValue[]> => {\r\n// const {\r\n// context: {\r\n// actionContext,\r\n// request: {\r\n// apiSettings: { channelId, catalogId }\r\n// }\r\n// }\r\n// } = props;\r\n// const attributes: AttributeValue[] = await getAttributeValuesAsync(\r\n// { callerContext: actionContext, queryResultSettings: {} },\r\n// product.RecordId,\r\n// channelId,\r\n// catalogId\r\n// );\r\n// return attributes.filter((attr: AttributeValue) => attr !== null && attr !== undefined) || [];\r\n// };\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise<void> => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n const quantity = addToCartInput[0].count;\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n // // VSI CUSTOMIZATION START\r\n // const productManufacturarAttribute = props.context.app.config.productManufacturarAttribute || 'Manufacturer';\r\n // const productWeightAttribute = props.context.app.config.productWeightAttribute || 'Weight (kg)';\r\n // const productAttributes = await _getProductAttributes(product, props);\r\n // const productAttrManufactrValue = productAttributes?.find((item: AttributeValue) => item.Name === productManufacturarAttribute);\r\n // const productAttrWeightValue = productAttributes?.find((item: AttributeValue) => item.Name === productWeightAttribute);\r\n // //VSI CUSTOMIZATION END\r\n const addToCartResult = await cartState.addProductToCart({\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { validateQunatity: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.customPriceAmount,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\r\n catalogId: addToCartInput[0].catalogId\r\n });\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n // // VSI - Customization to add Product attributes to display weight and manufacuture on order details\r\n // if (cartState.cart && cartState.cart.CartLines) {\r\n // const cartLines = cartState.cart.CartLines.filter(cartLineItem => cartLineItem.ProductId === product.RecordId);\r\n // if (cartLines && cartLines.length > 0) {\r\n // const newCartLine = cartLines[cartLines.length - 1];\r\n // const lineIdManufacturAttr = setNameAttribute(productManufacturarAttribute, productAttrManufactrValue?.TextValue || '');\r\n // const lineIdWeightAttr = setNameAttribute(productWeightAttribute, productAttrWeightValue?.FloatValue?.toString() || '');\r\n // let currentAttributes: AttributeValueBase[] = newCartLine.AttributeValues || [];\r\n // currentAttributes = await findAttribute(currentAttributes, lineIdManufacturAttr);\r\n // currentAttributes = await findAttribute(currentAttributes, lineIdWeightAttr);\r\n // newCartLine.AttributeValues = currentAttributes; // Updates cart with Attribute Values\r\n // updateCartLinesAsync({ callerContext: props.context.actionContext }, cartState.cart.Id, [newCartLine])\r\n // .then(() => cartState.refreshCart({}))\r\n // .catch(error => props.context.actionContext.telemetry.exception(error));\r\n // }\r\n // }\r\n // // VSI - Customization End\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n props.isStatusTwoZeroFour ? window.location.reload() : null;\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise<void> => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent<IAddToCartComponentProps> {\r\n onClick(): (event: React.MouseEvent<HTMLElement>, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent<HTMLElement>,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise<void> => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n }\r\n};\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC<IAddToCartComponentProps> = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [customerTaxPercentage, setcustomerTaxPercentage] = useState<number>(0);\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n const [disountedWpPrice, setDiscountedwpPrice] = React.useState<String | undefined>('');\r\n const [attributes, setAttributes] = React.useState<AttributeValue[]>();\r\n\r\n const onClickHandler = async (event: React.MouseEvent<HTMLElement>) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n };\r\n React.useEffect(() => {\r\n findAttributesValues();\r\n getCustomerTaxInfo();\r\n }, []);\r\n async function findAttributesValues() {\r\n const catalogId = getCatalogId(props.context.actionContext.requestContext);\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n const recordId: any = props?.data?.product?.RecordId;\r\n\r\n const attributes: AttributeValue[] = await getAttributeValuesAsync(\r\n { callerContext: actionContext, queryResultSettings: {} },\r\n recordId,\r\n apiSettings.channelId,\r\n catalogId\r\n );\r\n setAttributes(attributes);\r\n }\r\n React.useEffect(() => {\r\n if (attributes) {\r\n calculateWpPrice();\r\n }\r\n }, [attributes]);\r\n\r\n const calculateWpPrice = () => {\r\n let basePrice = props?.data?.price?.CustomerContextualPrice;\r\n let discountedPrice = props?.data?.price?.CustomerContextualPrice;\r\n let tempBasePrice, tempDiscountedPrice, displayWpPrice;\r\n if (basePrice === discountedPrice) {\r\n attributes?.map(e => {\r\n if (e.Name === 'Power rating Pmax (Wp)') {\r\n if (e.IntegerValue !== 0) {\r\n tempBasePrice = basePrice! / e.IntegerValue!;\r\n }\r\n }\r\n\r\n if (e.KeyName === 'DisplayWPPrice' || e.Name === 'Display WP Price') {\r\n displayWpPrice = e.BooleanValue;\r\n }\r\n });\r\n\r\n if (displayWpPrice && tempBasePrice !== undefined) {\r\n setDiscountedwpPrice(tempBasePrice);\r\n }\r\n } else {\r\n attributes?.map(e => {\r\n if (e.Name === 'Power rating Pmax (Wp)') {\r\n if (e.IntegerValue !== 0) {\r\n tempBasePrice = basePrice! / e.IntegerValue!;\r\n tempDiscountedPrice = discountedPrice! / e.IntegerValue!;\r\n }\r\n }\r\n\r\n if (e.KeyName === 'DisplayWPPrice' || e.Name === 'Display WP Price') {\r\n displayWpPrice = e.BooleanValue;\r\n }\r\n });\r\n\r\n if (displayWpPrice && tempBasePrice !== undefined && tempDiscountedPrice !== undefined) {\r\n setDiscountedwpPrice(tempDiscountedPrice);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const getCustomerTaxInfo = async () => {\r\n const customerInput = new GetCustomerInput(props.context.actionContext.requestContext.apiSettings);\r\n const customer = await getCustomer(customerInput, props.context.actionContext);\r\n const customerTaxPercentage = taxPercentage(customer) || 0;\r\n if (customer) {\r\n setcustomerTaxPercentage(customerTaxPercentage);\r\n }\r\n return customerTaxPercentage;\r\n };\r\n\r\n const {\r\n context: {\r\n app: {\r\n config: { enabledIncExPrices }\r\n },\r\n request: {\r\n user: { isAuthenticated }\r\n }\r\n }\r\n } = props;\r\n const ppwPrice =\r\n props.context?.actionContext?.requestContext?.apiSettings?.oun !== props.context.app.config.ounNumberForUsSite\r\n ? 'WP Price:'\r\n : 'PPW Price:';\r\n const priceComponent = props.data?.price ? (\r\n <PriceComponent\r\n data={{ price: props.data.price }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n freePriceText={props.dialogStrings?.freePriceText}\r\n originalPriceText={props.dialogStrings?.originalPriceText}\r\n currentPriceText={props.dialogStrings?.currentPriceText}\r\n isIncExPriceFormatEnabled={true}\r\n customerTaxPercentage={customerTaxPercentage || 0}\r\n wpPrice={\r\n <React.Fragment>\r\n {disountedWpPrice && isAuthenticated && (\r\n <div className='wp-price-container'>\r\n <span className='_title'>{ppwPrice}</span>\r\n <div className='_wp-price-container'>\r\n <span className='_discounted-wp-price'>\r\n {incExcPriceFormat(\r\n Number(disountedWpPrice),\r\n props.context,\r\n enabledIncExPrices,\r\n customerTaxPercentage || 0,\r\n 3\r\n )}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </React.Fragment>\r\n }\r\n />\r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: addToCartInput[0]?.product, price: props.data?.price }, // addToCartInput[0]?.product?.Price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: addToCartInput[0]?.count !== undefined ? addToCartInput[0]?.count : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n if (popupProps.imageSettings) popupProps.imageSettings.mode = 1;\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = <Popup {...popupProps} />;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const tAttributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n <button\r\n className={classnames(buttonClassName, props.className)}\r\n aria-label={props.addToCartArialLabel ?? label}\r\n title={props.addToCartArialLabel ?? label}\r\n {...tAttributes}\r\n onClick={onClickHandler}\r\n disabled={props.disabled || disabled || isIntermediateState(props) || shouldShowOutOfStock(props, false)}\r\n >\r\n {label}\r\n </button>\r\n <ItemsAddedToCartDialogComponent\r\n className='msc-lines-added-to-cart-dialog'\r\n id={props.id}\r\n typeName={props.typeName}\r\n context={props.context}\r\n dialogStrings={itemsAddedResource}\r\n data={{\r\n products: addToCartInput\r\n }}\r\n isModalOpen={isItemsAddedToCartDialogOpen}\r\n onClose={closeItemsAddedToCartDialog}\r\n />\r\n </>\r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// @ts-expect-error\r\n// prettier-ignore\r\nexport const AddToCartComponent: React.FunctionComponent<IAddToCartComponentProps> = msdyn365Commerce.createComponentOverride<IAddtoCartComponent>('AddToCart', { component: AddToCartFunctionalComponent, ...AddToCartComponentActions });\r\n\r\nexport default AddToCartComponent;\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 { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n getCatalogId,\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageData,\r\n IImageProps,\r\n IImageSettings,\r\n Image,\r\n IRequestContext,\r\n msdyn365Commerce\r\n} from '@msdyn365-commerce/core';\r\nimport {\r\n AttributeSwatch,\r\n Customer,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductSearchResult,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n checkIfShouldDisplayAsSwatch,\r\n convertDimensionTypeToProductDimensionType,\r\n Dictionary,\r\n DimensionSwatchDisplayTypes,\r\n DimensionTypes,\r\n generateImageUrl,\r\n // getProductPageUrlSync,\r\n IDimensionsApp,\r\n StringExtensions,\r\n validateCatalogId\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick,\r\n Waiting\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useState } from 'react';\r\n\r\nimport {\r\n IPriceComponentResources,\r\n PriceComponent,\r\n ISwatchItem,\r\n RatingComponent,\r\n ProductComponentSwatchComponent\r\n} from '@msdyn365-commerce/components';\r\nimport {\r\n IRequestPriceForProductCollectionData,\r\n toDisplayProdCollection\r\n} from '../../../../modules/krannich-c-product-collection/krannich-c-product-collection.props.autogenerated';\r\nimport { PromotionBadges } from '../../../../utils/badges';\r\nimport { filteredProductAttributeList, formatUrlPath, taxPercentage } from '../../../../utils/helper';\r\n\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n ratingCountAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n productComparisonButton?: React.ReactNode;\r\n inventoryLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\r\n swatchItemAriaLabel?: string;\r\n isDisplayType?: string;\r\n requestPrice?: IRequestPriceForProductCollectionData;\r\n customerInformation?: Customer;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\r\n\r\nconst PriceComponentActions = {};\r\n\r\n/**\r\n * Renders product comparison button similar to the quick view button.\r\n * @param productComparisonButton - React element of the button.\r\n * @param product - Current product info.\r\n * @param catalogId - Current catalog.\r\n * @returns React element for the specific product.\r\n */\r\nfunction renderProductComparisonButton(\r\n productComparisonButton: React.ReactNode,\r\n product: ProductSearchResult,\r\n catalogId: number\r\n): JSX.Element | undefined {\r\n validateCatalogId(catalogId);\r\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\r\n}\r\n\r\nconst ProductCard: React.FC<IProductComponentProps> = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n ratingCountAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n productComparisonButton,\r\n inventoryLabel,\r\n isPriceMinMaxEnabled,\r\n priceResources,\r\n dimensionAvailabilities,\r\n swatchItemAriaLabel,\r\n isDisplayType,\r\n requestPrice,\r\n customerInformation\r\n}) => {\r\n const product = data.product;\r\n\r\n /**\r\n * Updates the product url link to product details page.\r\n * @param productDetailsPageUrl - Product page url.\r\n * @param coreContext - Context of the module using the component.\r\n * @param queryString - Querystring to be added to the URL.\r\n * @returns The update product page url.\r\n */\r\n function updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\r\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\r\n if (sourceUrl.search) {\r\n sourceUrl.search += `&${queryString}`;\r\n } else {\r\n sourceUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(sourceUrl.href);\r\n return updatedUrl.pathname + sourceUrl.search;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param productData - Product card to be rendered.\r\n * @returns The default color swatch selected if any.\r\n */\r\n function getDefaultColorSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n if (!productData || !productData.AttributeValues) {\r\n return null;\r\n }\r\n\r\n const colorAttribute = productData.AttributeValues.find(\r\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === DimensionTypes.color\r\n );\r\n if (!ArrayExtensions.hasElements(colorAttribute?.Swatches)) {\r\n return null;\r\n }\r\n\r\n const defaultSwatch = colorAttribute!.Swatches.find(item => item.IsDefault === true) ?? colorAttribute!.Swatches[0];\r\n return defaultSwatch;\r\n }\r\n\r\n /**\r\n * Gets the product image from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productData?.PrimaryImageUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.ProductImageUrls)\r\n ? generateImageUrl(defaultSwatch.ProductImageUrls[0], coreContext.request.apiSettings)\r\n : productData?.PrimaryImageUrl;\r\n }\r\n\r\n /**\r\n * Gets the product page url from the default swatch selected.\r\n * @param coreContext - Context of the module using the component.\r\n * @param productUrl - Product page url for the product card.\r\n * @param productData - Product card to be rendered.\r\n * @returns The product card image url.\r\n */\r\n function getProductPageUrlFromDefaultSwatch(\r\n coreContext: ICoreContext,\r\n productUrl: string,\r\n productData?: ProductSearchResult\r\n ): string | undefined {\r\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\r\n return productUrl;\r\n }\r\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\r\n if (!defaultSwatch || !defaultSwatch.SwatchValue) {\r\n return productUrl;\r\n }\r\n\r\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\r\n const queryString = `color=${queryStringEncoded}`;\r\n return updateProductUrl(productUrl, coreContext, queryString);\r\n }\r\n\r\n const productAttributes = filteredProductAttributeList(product?.AttributeValues, context.app.config.kcProductAttribute);\r\n const _renderProducerName = (prod: ProductSearchResult): string => {\r\n if (!prod) {\r\n return '';\r\n }\r\n return productAttributes?.find(attr => attr.identifier === 'Manufacturer')?.TextValue || '';\r\n };\r\n\r\n const globalProducerName = () => {\r\n let globalProducerName: string = '';\r\n productAttributes?.map(e => {\r\n if (e.identifier === 'Manufacturer') {\r\n const manufactuerValueforImage = e.ExtensionProperties?.find(eProperty => eProperty.Key === 'globalAttributeValue')?.Value;\r\n globalProducerName = manufactuerValueforImage?.StringValue || '';\r\n }\r\n });\r\n return globalProducerName;\r\n };\r\n\r\n const getManufacturerItemTypeName = (prod: ProductSearchResult): string => {\r\n if (!prod) {\r\n return '';\r\n }\r\n return prod?.ExtensionProperties?.find(extension => extension.Key === 'ManufItemTypeName')?.Value?.StringValue || '';\r\n };\r\n\r\n const urlPath = formatUrlPath(_renderProducerName(product!), getManufacturerItemTypeName(product!));\r\n const pathName = context.actionContext.requestContext.url.requestUrl.pathname.split('/');\r\n const isAddingPathWithUrl = context.actionContext.requestContext.app.config.addPathWithUrl ?? false;\r\n let productUrl =\r\n product &&\r\n (isAddingPathWithUrl\r\n ? `${context.actionContext.requestContext.url.requestUrl.origin}/${pathName[1]}/${urlPath}/${product.RecordId}.p`\r\n : `${context.actionContext.requestContext.url.requestUrl.origin}/${urlPath}/${product.RecordId}.p`);\r\n\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl!, product) ?? productUrl;\r\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch!);\r\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\r\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\r\n const enableStockCheck = context.app.config.enableStockCheck;\r\n const extensionsProps = product?.ExtensionProperties;\r\n let promotionBadge = '';\r\n if (extensionsProps?.find(e => e?.Key === 'PromotionBadge')) {\r\n promotionBadge = extensionsProps?.find(e => e?.Key === 'PromotionBadge')?.Value?.StringValue || '';\r\n }\r\n /**\r\n * Updates the product page and Image url based on swatch selected.\r\n * @param coreContext - Context of the caller.\r\n * @param swatchItem - Dimension swatch selected.\r\n */\r\n const updatePageAndImageUrl = React.useCallback(\r\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\r\n const dimensionType = swatchItem.dimensionType;\r\n selectedSwatchItems.setValue(dimensionType, swatchItem);\r\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\r\n return;\r\n }\r\n const queryString = `${dimensionType}=${swatchItem.value}`;\r\n let productPageUrlWithSwatch = '';\r\n if (productPageUrl.includes(dimensionType)) {\r\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\r\n newUrl.searchParams.delete(dimensionType);\r\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\r\n } else {\r\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\r\n }\r\n setProductPageUrl(productPageUrlWithSwatch);\r\n if (dimensionType === DimensionTypes.color) {\r\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\r\n ? swatchItem.productImageUrls[0]\r\n : undefined;\r\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\r\n setProductImageUrl(newImageUrl);\r\n }\r\n },\r\n [selectedSwatchItems, context, productPageUrl]\r\n );\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n const swatchItems = ArrayExtensions.validValues(\r\n product.AttributeValues?.map(item => {\r\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\r\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(\r\n dimensionTypeValue as DimensionTypes,\r\n context as ICoreContext<IDimensionsApp>,\r\n DimensionSwatchDisplayTypes.productCard\r\n );\r\n if (!shouldDisplayAsSwatch) {\r\n return null;\r\n }\r\n\r\n const siteContext = context as ICoreContext<IDimensionsApp>;\r\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\r\n const dimensionType = dimensionTypeValue as DimensionTypes;\r\n const swatches =\r\n item.Swatches?.map<ISwatchItem>(swatchItem => {\r\n return {\r\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n value: swatchItem.SwatchValue ?? '',\r\n dimensionType,\r\n colorHexCode: swatchItem.SwatchColorHexCode,\r\n imageUrl: swatchItem.SwatchImageUrl,\r\n productImageUrls: swatchItem.ProductImageUrls,\r\n isDefault: swatchItem.IsDefault,\r\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\r\n isDisabled:\r\n enableStockCheck &&\r\n dimensionAvailabilities?.find(\r\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\r\n )?.isDisabled\r\n };\r\n }) ?? [];\r\n if (\r\n dimensionToPreSelectInProductCard !== DimensionTypes.none &&\r\n ArrayExtensions.hasElements(swatches) &&\r\n !swatches.some(swatch => swatch.isDefault) &&\r\n dimensionType === DimensionTypes.color\r\n ) {\r\n swatches[0].isDefault = true;\r\n }\r\n return { recordId: item.RecordId, swatches };\r\n })\r\n );\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n /**\r\n * Gets the react node for product unit of measure display.\r\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n if (!unitOfMeasure) {\r\n return null;\r\n }\r\n return (\r\n <div className='msc-product__unit-of-measure'>\r\n <span>{unitOfMeasure}</span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product availability.\r\n * @param inventoryAvailabilityLabel - The product information.\r\n * @returns The node representing markup for product availability.\r\n */\r\n function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__availability'>\r\n <span>{inventoryAvailabilityLabel}</span>\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product dimension as swatch.\r\n * @returns The node representing markup for unit of measure component.\r\n */\r\n function renderProductDimensions(): JSX.Element | null {\r\n if (!ArrayExtensions.hasElements(swatchItems)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className='msc-product__dimensions'>\r\n {swatchItems.map(item => {\r\n return (\r\n <ProductComponentSwatchComponent\r\n key={item.recordId}\r\n context={context}\r\n onSelectDimension={updatePageAndImageUrl}\r\n swatches={item.swatches}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param quickview - Quick view node.\r\n * @param item - Product id to de displayed in quickview.\r\n * @returns The product quickview component.\r\n */\r\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n if (quickview === null) {\r\n return undefined;\r\n }\r\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\r\n return {\r\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\r\n DimensionValue: {\r\n RecordId: 0,\r\n Value: swatches.value\r\n }\r\n };\r\n });\r\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\r\n }\r\n\r\n /**\r\n * Gets the aria label for rating.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Aria label format for rating.\r\n * @returns The product rating aria label string.\r\n */\r\n function getRatingAriaLabel(rating?: number, ratingAriaLabelText?: string): string {\r\n if (rating && ratingAriaLabelText) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabelText || '', roundedRating, '5');\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label for review count.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Aria label format for review.\r\n * @returns The product review count aria label string.\r\n */\r\n function getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\r\n if (reviewCount && ratingCountAriaLabelText) {\r\n return format(ratingCountAriaLabelText || '', reviewCount);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Gets the aria label string for product that includes product name with its price and rating.\r\n * @param name - Product name.\r\n * @param price - Product price.\r\n * @param rating - Product rating.\r\n * @param ratingAriaLabelText - Rating aria label text.\r\n * @param reviewCount - Product review count.\r\n * @param ratingCountAriaLabelText - Number of ratings.\r\n * @returns The aria label string for the product card.\r\n */\r\n function renderLabel(\r\n name?: string,\r\n price?: string,\r\n rating?: number,\r\n ratingAriaLabelText?: string,\r\n reviewCount?: number,\r\n ratingCountAriaLabelText?: string,\r\n availability?: string\r\n ): string {\r\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\r\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\r\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\r\n } ${availability ?? ''}`;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @returns React component for product image.\r\n */\r\n function renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n fallbackImageUrl?: string,\r\n altText?: string,\r\n requestContext?: IRequestContext\r\n ): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = context.app.config.placeholderImageName as string;\r\n let fallbackImageSource = fallbackImageUrl;\r\n if (emptyPlaceHolderImage && fallbackImageUrl) {\r\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageSource\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return <Image {...image} {...imageProps} loadFailureBehavior='empty' requestContext={requestContext} bypassHideOnFailure />;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param productSearchResult - Product search result.\r\n * @param savingsPriceResourceText - Product price saving text.\r\n * @param freePriceResourceText - Product price free text.\r\n * @param originalPriceResourceText - Product price original text.\r\n * @param currentPriceResourceText - Product price current text.\r\n * @returns React component for Product price.\r\n */\r\n function renderPrice(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n productSearchResult: ProductSearchResult,\r\n savingsPriceResourceText?: string,\r\n freePriceResourceText?: string,\r\n originalPriceResourceText?: string,\r\n currentPriceResourceText?: string,\r\n customerInformation?: Customer\r\n ): JSX.Element {\r\n const product: SimpleProduct = {\r\n // This is a fake product. The product type is only used for price component to determine if it should show price range or not.\r\n ProductTypeValue: productSearchResult.IsMasterProduct ? ProductType.Master : ProductType.Standalone\r\n } as SimpleProduct;\r\n const price: ProductPrice = {\r\n BasePrice: productSearchResult.BasePrice,\r\n AdjustedPrice: productSearchResult.Price,\r\n CustomerContextualPrice: productSearchResult.Price,\r\n // TODO from [gaweiche]: We should not put productSearchResult.Price into min/max price.\r\n // To minimize the change in a backport PR, I'll keep it as is for now.\r\n MaxVariantPrice: productSearchResult.MaxVariantPrice ? productSearchResult.MaxVariantPrice : productSearchResult.Price,\r\n MinVariantPrice: productSearchResult.MinVariantPrice ? productSearchResult.MinVariantPrice : productSearchResult.Price\r\n } as ProductPrice;\r\n // Todo: need to refactor it\r\n const customerTaxPercentage = taxPercentage(customerInformation!);\r\n console.log('customerTaxPercentage carousels', customerTaxPercentage);\r\n return (\r\n <PriceComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n product={product}\r\n data={{ price }}\r\n savingsText={savingsPriceResourceText}\r\n freePriceText={freePriceResourceText}\r\n originalPriceText={originalPriceResourceText}\r\n currentPriceText={currentPriceResourceText}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n // customerTaxPercentage={customerTaxPercentage}\r\n />\r\n );\r\n }\r\n\r\n /**\r\n * Gets the react node for product description.\r\n * @param description - Product description.\r\n * @returns The product description component.\r\n */\r\n function renderDescription(description?: string): JSX.Element | null {\r\n return <p className='msc-product__text'>{description}</p>;\r\n }\r\n\r\n /**\r\n * Gets the react component for product rating.\r\n * @param coreContext - Context of the module using the component.\r\n * @param moduleTypeName - Module type name.\r\n * @param moduleId - Module id using the component.\r\n * @param avgRating - Average rating.\r\n * @param totalRatings - Total rating.\r\n * @param ariaLabel - Aria label for rating.\r\n * @returns React component for Product rating.\r\n */\r\n function renderRating(\r\n coreContext: ICoreContext,\r\n moduleTypeName: string,\r\n moduleId: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n ): JSX.Element | null {\r\n if (!avgRating) {\r\n return null;\r\n }\r\n\r\n const numberRatings = totalRatings?.toString() || undefined;\r\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n return (\r\n <RatingComponent\r\n context={coreContext}\r\n id={moduleId}\r\n typeName={moduleTypeName}\r\n avgRating={avgRating}\r\n ratingCount={numberRatings}\r\n readOnly\r\n ariaLabel={ratingAriaLabelText}\r\n ratingCountAriaLabel={ratingCountAriaLabelText}\r\n data={{}}\r\n />\r\n );\r\n }\r\n\r\n const { isAuthenticated } = context.request.user;\r\n // VSI CUSTOMIZATION START ---> Create Product Component OOTB Working\r\n const ProductComponentOOTB = () => {\r\n return (\r\n <>\r\n <a\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel,\r\n product.TotalRatings,\r\n ratingCountAriaLabel,\r\n inventoryLabel\r\n )}\r\n className='msc-product'\r\n {...attribute}\r\n >\r\n <div className='msc-product__image'>\r\n <PromotionBadges context={context} promotionalBadge={promotionBadge} />\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n </div>\r\n <h4 className='msc-product__title'>{product.Name}</h4>\r\n </a>\r\n {renderProductDimensions()}\r\n <div className='msc-product__details'>\r\n {renderPrice(context, typeName, id, product, savingsText, freePriceText, originalPriceText, currentPriceText)}\r\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\r\n {renderDescription(product.Description)}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\r\n {renderProductAvailability(inventoryLabel)}\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n {productComparisonButton &&\r\n renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\r\n </div>\r\n </>\r\n );\r\n };\r\n\r\n const ProductComponentTopRated = () => {\r\n //To set the producer name\r\n const [producerName, setProducerName] = React.useState<string | undefined>('');\r\n //To set Image Url\r\n const [imgURI, setImgURL] = React.useState<string | undefined>();\r\n\r\n //Loader State\r\n const [isLoading, setIsLoading] = React.useState<boolean | undefined>(true);\r\n\r\n //To find the manufacturar name\r\n React.useEffect(() => {\r\n _findProducer();\r\n }, [product.AttributeValues]);\r\n\r\n //To set the producer name\r\n React.useEffect(() => {\r\n const producerGlobalName: string = globalProducerName() || '';\r\n if (producerGlobalName) {\r\n setImgURL(producerGlobalName);\r\n }\r\n }, [producerName]);\r\n\r\n //to generate Image url after getting img url from api call\r\n React.useEffect(() => {\r\n if (imgURI) {\r\n let imageUrl = generateImageUrl(imgURI, context.actionContext.requestContext.apiSettings);\r\n imageUrl = imageUrl?.replace('=/', '=') || '';\r\n setImgURL(imageUrl);\r\n }\r\n }, [imgURI]);\r\n\r\n //use this function to render or display category image\r\n const _renderCategoryImg = (imgURI: string) => {\r\n return (\r\n <div className='_logo-container'>\r\n <img src={`${imgURI}.png`} alt='producer-images' className='_logo' />\r\n </div>\r\n );\r\n };\r\n\r\n //use this function to find the manufacturar\r\n const _findProducer = () => {\r\n setIsLoading(true);\r\n const producerName = productAttributes?.find(attr => attr.identifier === 'Manufacturer')?.TextValue || '';\r\n setProducerName(producerName);\r\n setIsLoading(false);\r\n return producerName;\r\n };\r\n\r\n return isLoading ? (\r\n <Waiting className='msc-waiting-circular msc-waiting-lg' />\r\n ) : (\r\n <a\r\n title={isAuthenticated ? 'See More Details' : 'Request Price'}\r\n className='request-price-top-rated-parent'\r\n href={productPageUrl}\r\n >\r\n <div className='product-card-container'>\r\n <div className='_image-contianer'>\r\n <div className='product-card-header'>\r\n <PromotionBadges context={context} promotionalBadge={promotionBadge} />\r\n {imgURI && _renderCategoryImg(imgURI)}\r\n </div>\r\n <div className='_image'>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n </div>\r\n </div>\r\n <div className='_info-container'>\r\n <h4 className='_title'>\r\n <a\r\n title={isAuthenticated ? 'See More Details' : 'Request Price'}\r\n className='request-price-focus-parent'\r\n href={productPageUrl}\r\n >\r\n {product.Name}\r\n </a>\r\n </h4>\r\n {renderDescription(product.Description)}\r\n <div className='_link-container'>\r\n <a\r\n className='_link'\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel,\r\n product.TotalRatings,\r\n ratingCountAriaLabel\r\n )}\r\n >\r\n .....\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </a>\r\n );\r\n };\r\n\r\n const ProductComponentFocus = () => {\r\n //To set the producer name\r\n const [producerName, setProducerName] = React.useState<string | undefined>('');\r\n\r\n //Loader State\r\n const [isLoading, setIsLoading] = React.useState<boolean | undefined>(true);\r\n const productAttributes = filteredProductAttributeList(product?.AttributeValues, context.app.config.kcProductAttribute);\r\n //To find the manufacturar name\r\n React.useEffect(() => {\r\n _findProducer();\r\n }, [productAttributes]);\r\n //use this function to find the manufacturar\r\n const _findProducer = () => {\r\n setIsLoading(true);\r\n const producerName = productAttributes?.find(attr => attr.identifier === 'Manufacturer')?.TextValue || '';\r\n setProducerName(producerName);\r\n setIsLoading(false);\r\n return producerName;\r\n };\r\n\r\n const _renderProducerKeyName = (): string => {\r\n return productAttributes?.find(attr => attr.identifier === 'Manufacturer')?.Name || '';\r\n };\r\n\r\n return isLoading ? (\r\n <Waiting className='msc-waiting-circular msc-waiting-lg' />\r\n ) : (\r\n <a title={isAuthenticated ? 'See More Details' : 'Request Price'} className='request-price-focus-parent' href={productPageUrl}>\r\n <div className='focus-card-contianer'>\r\n <div className='_info-container'>\r\n <div className='_image'>\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n </div>\r\n <div className='_info'>\r\n <div className='badge-wrapper'>\r\n <PromotionBadges context={context} promotionalBadge={promotionBadge} />\r\n </div>\r\n <h4 className='_producer'>{producerName}</h4>\r\n <h4 className='_title'>\r\n <a\r\n title={isAuthenticated ? 'See More Details' : 'Request Price'}\r\n className='request-price-focus-parent'\r\n href={productPageUrl}\r\n tabIndex={-1}\r\n >\r\n {product.Name}\r\n </a>\r\n </h4>\r\n {renderDescription(product.Description)}\r\n </div>\r\n </div>\r\n <div className='_footer'>\r\n {context.request.user.isAuthenticated ? (\r\n <a\r\n className='_link'\r\n href={productPageUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel,\r\n product.TotalRatings,\r\n ratingCountAriaLabel\r\n )}\r\n >\r\n See More Details\r\n </a>\r\n ) : (\r\n <a\r\n title='Request Price'\r\n className='_request-price'\r\n href={`${requestPrice && requestPrice?.linkUrl?.destinationUrl}?ItemId=${product.ItemId}&Name=${\r\n product.Name\r\n }&producerKeyName=${_renderProducerKeyName()}&producer=${producerName}`}\r\n >\r\n {requestPrice?.linkText}\r\n </a>\r\n )}\r\n </div>\r\n </div>\r\n </a>\r\n );\r\n };\r\n\r\n const toCheckValue = String(isDisplayType)\r\n .toLocaleLowerCase()\r\n .trim();\r\n if (toCheckValue === toDisplayProdCollection.ootb.toLowerCase()) {\r\n return <ProductComponentOOTB />;\r\n } else if (toCheckValue === toDisplayProdCollection.topRated.toLowerCase()) {\r\n return <ProductComponentTopRated />;\r\n } else if (toCheckValue === toDisplayProdCollection.focus.toLowerCase()) {\r\n return <ProductComponentFocus />;\r\n }\r\n return <ProductComponentTopRated />;\r\n\r\n //VSI CUSTOMIZATION END\r\n};\r\n\r\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;\r\n","import React from 'react';\r\nimport { IKRV_ATPLeadTimePropertiesDate } from '../actions/customProxy/ATP-update/DataServiceEntities.g';\r\nimport { dateFormatByLocale } from './helper';\r\n\r\ninterface ITrafficLight {\r\n lightColor?: string;\r\n isVisible?: string;\r\n}\r\n\r\ninterface IKRV_ATPLeadTimePropertiesDateFormat extends IKRV_ATPLeadTimePropertiesDate {\r\n locale?: string;\r\n currency?: string;\r\n}\r\n\r\nexport const TrafficLights: React.FC<ITrafficLight> = ({ lightColor, isVisible }) => (\r\n <div className='traffic-light-container'>\r\n <div className={isVisible === 'No' ? '_red-light' : lightColor ? `_${lightColor.toLowerCase().trim()}-light` : ' _grey-light'} />\r\n </div>\r\n);\r\n\r\nexport const ATPMessage: React.FC<IKRV_ATPLeadTimePropertiesDateFormat> = props => {\r\n /* VSI CUSTOMIZATION | DATE FORMAT | START */\r\n let PurchaseLeadTimeDate = props.PurchaseLeadTimeDate;\r\n if (props.currency && props.locale && PurchaseLeadTimeDate) {\r\n PurchaseLeadTimeDate = dateFormatByLocale(props.locale, props.currency, PurchaseLeadTimeDate);\r\n }\r\n let PODate = props.PODate;\r\n if (props.currency && props.locale && PODate) {\r\n PODate = dateFormatByLocale(props.locale, props.currency, PODate);\r\n }\r\n /* VSI CUSTOMIZATION | DATE FORMAT | END */\r\n let atpMessage = '';\r\n if (props.IsVisible === 'No') {\r\n atpMessage = 'no further supplies';\r\n } else if (props.IsDiscontinuedProduct === 'Yes') {\r\n atpMessage = props?.Message!.toLowerCase();\r\n } else if (PurchaseLeadTimeDate !== '' && props.Quantity === 0 && props.POQuantity === 0) {\r\n atpMessage = `${props.Quantity} in stock, more from ${PurchaseLeadTimeDate}`;\r\n } else if (PurchaseLeadTimeDate === '' && props.Quantity === 0 && props.POQuantity > 0) {\r\n atpMessage = `${props.Quantity} in stock, more from ${PODate}`;\r\n } else if (PurchaseLeadTimeDate !== '' && props.Quantity > 0 && props.POQuantity === 0) {\r\n atpMessage = `${props.Quantity} in stock, more from ${PurchaseLeadTimeDate}`;\r\n } else if (PurchaseLeadTimeDate === '' && props.Quantity > 0 && props.POQuantity > 0) {\r\n atpMessage = `${props.Quantity} in stock, more from ${PODate}`;\r\n } else if (PurchaseLeadTimeDate === '' && props.Quantity >= 0 && props.POQuantity === 0) {\r\n atpMessage = props?.Message ? `${props.Quantity} in stock, ${props?.Message.toLowerCase()}` : `${props.Quantity} in stock`;\r\n }\r\n if (atpMessage !== '') {\r\n return (\r\n <div className='_message-container'>\r\n <h4 className='_traffic-light-quantity'>{atpMessage}</h4>\r\n </div>\r\n );\r\n }\r\n return (\r\n <div className='_message-container'>\r\n <h4 className='_traffic-light-quantity'>\r\n <p className='ms-buybox__minmax_label_text'>\r\n <span className='sr-only'>Information</span>\r\n <i className='msi-InfoCircle' aria-hidden='true'></i>\r\n Error while fetching the data!!!\r\n </p>\r\n </h4>\r\n </div>\r\n );\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 { IProductDimensionsWithAvailabilitiesFull } from '@msdyn365-commerce/commerce-entities';\nimport { ProductDimensionsMatrix } from '@msdyn365-commerce/components';\nimport { RichTextComponent } from '@msdyn365-commerce/core';\nimport { ICoreContext, getCatalogId } from '@msdyn365-commerce/core-internal';\nimport { ArrayExtensions, IDimensionsApp, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, Collapse, IModuleProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport { IBulkPurchaseData } from './bulk-purchase.data';\nimport { IBulkPurchaseProps } from './bulk-purchase.props.autogenerated';\n\n/**\n * Additional optional props for the bulk purchase.\n */\nexport interface IBulkPurchaseExtendedProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n productDimensions?: IProductDimensionsWithAvailabilitiesFull[];\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseViewProps extends IBulkPurchaseProps<IBulkPurchaseData> {\n container: IModuleProps;\n content: React.ReactElement;\n}\n\n/**\n * View for the bulk purchase module.\n */\nexport interface IBulkPurchaseState {\n isExpanded: boolean;\n}\n\n/**\n * Bulk-purchase module.\n */\nexport class BulkPurchase extends React.PureComponent<IBulkPurchaseExtendedProps, IBulkPurchaseState> {\n public static readonly className = 'ms-bulk-purchase';\n private readonly collapseRef: React.RefObject<Collapse> = React.createRef<Collapse>();\n\n public constructor(props: IBulkPurchaseExtendedProps) {\n super(props);\n\n this.state = {\n isExpanded: false\n };\n }\n\n public render(): React.ReactElement | null {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\n const hasDimensionsInData = ArrayExtensions.hasElements(this.props.data.productDimensions?.result);\n if (!hasDimensionsInProps && !hasDimensionsInData) {\n return null;\n }\n\n const viewProps: IBulkPurchaseViewProps = {\n ...this.props,\n container: {\n moduleProps: this.props,\n className: classnames(BulkPurchase.className, this.props.config.className)\n },\n content: this._renderCollapseContent(`${BulkPurchase.className}__content`)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderCollapseContent(className: string): React.ReactElement {\n return (\n <div className={className}>\n {this._renderCollapseButton(`${className}__collapse-button`)}\n {this._renderCollapse(`${className}__collapse`)}\n </div>\n );\n }\n\n private _renderCollapseButton(className: string): React.ReactElement {\n return (\n <Button\n className={className}\n onClick={this._toggleCollapse}\n aria-expanded={this.state.isExpanded}\n title={this.props.resources.bulkPurchaseHeaderTitle}\n >\n {this.props.resources.bulkPurchaseHeaderTitle}\n </Button>\n );\n }\n\n /**\n *This function is being used to handel variant change dropdown.\n */\n private _dimensionDropDownChange = () => {\n this.collapseRef.current?.reEvaluateHeight();\n };\n\n private _renderCollapse(className: string): React.ReactElement {\n return (\n <Collapse className={className} isOpen={this.state.isExpanded} ref={this.collapseRef}>\n {this._renderMainContent(`${className}__main-content`)}\n </Collapse>\n );\n }\n\n private _renderMainContent(className: string): React.ReactElement {\n const isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n\n return (\n <div className={className}>\n {!isMobileDevice && (\n <div className={`${className}__description`}>\n <RichTextComponent text={this.props.resources.bulkPurchaseDescriptionText} />\n </div>\n )}\n {this._renderMatrix(`${className}__matrix-container`)}\n </div>\n );\n }\n\n private _renderMatrix(className: string): React.ReactElement {\n const hasDimensionsInProps = ArrayExtensions.hasElements(this.props.productDimensions);\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 catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n return (\n <ProductDimensionsMatrix\n className={className}\n context={this.props.context as ICoreContext<IDimensionsApp>}\n data={{\n dimensions: hasDimensionsInProps ? this.props.productDimensions! : this.props.data.productDimensions!.result!,\n orderTemplates: this.props.data.orderTemplates?.result,\n customerInformation: this.props.data.customerInformation?.result\n }}\n resources={this.props.resources}\n dimensionOnChange={this._dimensionDropDownChange}\n isMultipleCatalogFeatureEnabledInHq={isMultipleCatalogsFeatureEnabled}\n catalogId={catalogId}\n />\n );\n }\n\n /**\n * Callback which toggles collapse mode.\n */\n private readonly _toggleCollapse = () => {\n this.setState(state => ({\n isExpanded: !state.isExpanded\n }));\n };\n}\n\nexport default BulkPurchase;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IBulkPurchaseViewProps } from './bulk-purchase';\n\n/**\n * Bulk purchase view.\n * @param props - Bulk purchase view props.\n * @returns React node with a module.\n */\nexport const BulkPurchaseViewComponent: React.FC<IBulkPurchaseViewProps> = props => {\n return <Module {...props.container}>{props.content}</Module>;\n};\n\nexport default BulkPurchaseViewComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartIconViewProps } from './cart-icon';\nimport { IFlyoutCartLineItemViewProps } from './components/flyout-cart-line-items';\n\nconst _renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n return cartLines.map((cartLine, index) => {\n return (\n <Node {...props.miniCartItemWrapper} key={index}>\n {cartLine.cartline}\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\nconst CartIconView: React.FC<ICartIconViewProps> = (props: ICartIconViewProps) => (\n <Node {...props.miniCartWrapper} {...props.renderModuleAttributes(props)}>\n {props.cartIcon}\n {props.FlyoutContainer ? (\n <Node {...props.FlyoutContainer}>\n {props.flyoutTitle}\n {props.checkoutBlockedDueToUnavailableFunds}\n <Node {...props.CartlinesWrapper}>{_renderCartlines(props.cartlines, props)}</Node>\n {props.totalPrice}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.goToCartButton}\n </Node>\n ) : (\n false\n )}\n </Node>\n);\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLinePriceEditor, ICartLinePriceEditorResources, PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { CartLine, ProductCatalog, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions, getFallbackImageUrl, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, IncrementalQuantity, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classNames from 'classnames';\nimport * as React from 'react';\n\n/**\n * ICartlineResourceString: Interface for specifying the\n * resource strings that the component needs.\n */\nexport interface ICartlineResourceString {\n /**\n * Display string for discount label\n */\n discountStringText: string;\n\n /**\n * String for size key\n */\n sizeString: string;\n\n /**\n * String for color key\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension\n */\n configString: string;\n\n /**\n * String for style key\n */\n styleString: string;\n\n /**\n * String for amount key\n */\n amountString?: string;\n\n /**\n * Display string for quantity label\n */\n quantityDisplayString: string;\n\n /**\n * Display string for quantity label\n */\n inputQuantityAriaLabel: string;\n\n /**\n * Aria label for the decrement button in quantity component\n */\n decrementButtonAriaLabel: string;\n\n /**\n * Aria label for the increment button in quantity component\n */\n incrementButtonAriaLabel: string;\n\n /**\n * Original text screenreader\n */\n originalPriceText: string;\n\n /**\n * Current text screenreader\n */\n currentPriceText: string;\n\n /**\n * Shipping Charges Text\n */\n shippingChargesText: string;\n\n priceEditorResources?: ICartLinePriceEditorResources;\n salesAgreementPricePrompt?: string;\n}\n\ninterface ICartLineData {\n cartLine: CartLine | SalesLine;\n cartState?: ICartState;\n product?: SimpleProduct;\n catalogs?: ProductCatalog[];\n}\n\n/**\n * ICartLineProps: The props required to render cartLineitem.\n */\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\n /**\n * The flag to change the quantity component from intractable to static.\n */\n disableQuantityInteractivity?: boolean;\n\n /**\n * The primary image url.\n */\n primaryImageUrl?: string;\n\n /**\n * The product url.\n */\n productUrl?: string;\n\n /**\n * GridSettings for the product image in cartLine.\n */\n gridSettings: IGridSettings;\n\n /**\n * ImageSettings for the product image in cartLine.\n */\n imageSettings: IImageSettings;\n\n /**\n * Boolean flag to indicate if the item is out of stock.\n */\n isOutOfStock?: boolean;\n\n /**\n * Flag to make quantity section editable.\n */\n isQuantityEditable?: boolean;\n\n /**\n * Max quantity for line item.\n */\n maxQuantity?: number;\n\n /**\n * Current quantity for line item.\n */\n currentQuantity?: number;\n\n /**\n * Resource string for the component.\n */\n resources: ICartlineResourceString;\n\n /**\n * SalesLine flag.\n */\n isSalesLine?: boolean;\n\n /**\n * Error message to show in place of quantity.\n */\n errorMessage?: string;\n\n /**\n * Inventory information label.\n */\n inventoryInformationLabel?: string;\n\n /**\n * Inventory information class name.\n */\n inventoryLabelClassName?: string;\n\n /**\n * Flag to show/hide shipping charges for line items.\n */\n showShippingChargesForLineItems?: boolean;\n\n /**\n * Boolean flag to indicate if cart state status is ready.\n */\n isCartStateReady?: boolean;\n\n /**\n * Chanel Delivery Option configuration is from api.\n */\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n /**\n * The telemetry content.\n */\n telemetryContent?: ITelemetryContent;\n\n /**\n * The cart line index.\n */\n lineIndex?: number;\n\n /**\n * Quantity onChange callback.\n */\n quantityOnChange?(cartLine: CartLine, newQuantity: number, lineIndex?: number): boolean;\n priceCurrency?: string;\n}\n\ninterface IDimensionStrings {\n /**\n * String for size key.\n */\n sizeString: string;\n\n /**\n * String for color key.\n */\n colorString: string;\n\n /**\n * String associated with the configuration product dimension.\n */\n configString: string;\n\n /**\n * String for style key.\n */\n styleString: string;\n\n /**\n * String for amount key.\n */\n amountString?: string;\n}\n\n/**\n * Renders catalog label for the cart line.\n * @param props - Cart line props.\n * @returns Catalog label.\n */\nconst CatalogLabelComponent: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const catalogId = props.data.cartLine.CatalogId;\n validateCatalogId(catalogId);\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.data.catalogs)) {\n return null;\n }\n\n const catalog = props.data.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return <div className='msc-cart-line__catalog-label'>{catalog.Name}</div>;\n};\n\nconst CartLineItemFunctions = {\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\n if (!Product || !Product.Dimensions) {\n return [];\n }\n\n return Product.Dimensions.map(productDimension => {\n if (productDimension.DimensionTypeValue === 1) {\n return (\n <div key={`${Product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-color'>\n {DimensionStrings.colorString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 2) {\n return (\n <div key={`${Product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-configuration'>\n {DimensionStrings.configString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 3) {\n return (\n <div key={`${Product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-size'>\n {DimensionStrings.sizeString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n\n if (productDimension.DimensionTypeValue === 4) {\n return (\n <div key={`${Product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\n <span className='msc-cart-line__product-variant-style'>\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}:\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\n </span>\n </div>\n );\n }\n return null;\n });\n },\n\n renderDiscountLines: (props: ICartLineProps) => {\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\n return null;\n }\n\n return props.data.cartLine.DiscountLines.map((discountLine, index) => {\n return (\n <div key={discountLine.OfferId || index} className='msc-cart-line-item-product-discount'>\n <span>\n {discountLine.OfferName ? discountLine.OfferName : ''}:{` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <span className='cart-line-item-product-discount-price'>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: discountLine.EffectiveAmount,\n BasePrice: discountLine.EffectiveAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n currencyCode={props.priceCurrency}\n />\n </span>\n <span>{` (${discountLine.EffectivePercentage !== undefined ? discountLine.EffectivePercentage : ''}%)`}</span>\n </div>\n );\n });\n },\n renderInventoryLabel: (props: ICartLineProps) => {\n if (!props.inventoryInformationLabel) {\n return null;\n }\n const inventoryCssName = props.inventoryLabelClassName\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\n : 'msc-cart-line__product-inventory-label';\n return <span className={inventoryCssName}>{props.inventoryInformationLabel}</span>;\n },\n\n /**\n * Gets the react node for product unit of measure display.\n * @param props - Icartline props.\n * @returns The node representing markup for unit of measure component.\n */\n renderUnitOfMeasure: (props: ICartLineProps) => {\n if (props.data.cartLine.IsInvoiceLine) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (!props.context.app.config.unitOfMeasureDisplayType || props.context.app.config.unitOfMeasureDisplayType === 'none') {\n return undefined;\n }\n\n const product = props.data.product;\n if (!product || !product.DefaultUnitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-cartline__product-unit-of-measure'>\n <span>{product.DefaultUnitOfMeasure}</span>\n </div>\n );\n },\n renderShippingLabel: (props: ICartLineProps) => {\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\n const cartline = props.data.cartLine;\n let hasShippingMethod = false;\n if (channelDeliveryOptionConfig !== undefined) {\n hasShippingMethod = !!(\n cartline.DeliveryMode &&\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\n );\n } else {\n hasShippingMethod = !!(cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode);\n }\n if (!hasShippingMethod) {\n return undefined;\n }\n\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\n\n if (shippingChargeLines.length === 0) {\n return undefined;\n }\n\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\n }, 0);\n\n const priceComponent = (\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: freightFee\n }\n }}\n freePriceText='Free'\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__freight-actual'\n currencyCode={props.priceCurrency}\n />\n );\n return (\n <>\n <label className='msc-cart-line__freight-label'>{`${props.resources.shippingChargesText}:`}</label>\n <span className='shipping-value'>{priceComponent}</span>\n </>\n );\n },\n renderOtherCharges: (props: ICartLineProps) => {\n const cartline = props.data.cartLine;\n const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\n\n return (\n (otherCharges &&\n otherCharges.map((otherCharge, key) => {\n return otherCharge && otherCharge.CalculatedAmount ? (\n <div className='msc-cart-line__other-charges' key={key}>\n <label className='msc-cart-line__other-charges-label'>{`${otherCharge.Description}:`}</label>\n <span className='other-charge-value'>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: otherCharge.CalculatedAmount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__other-charges-actual'\n currencyCode={props.priceCurrency}\n />\n </span>\n </div>\n ) : (\n ''\n );\n })) ||\n undefined\n );\n },\n\n /**\n * Render the sales agreement prompt.\n * @param props - The ICartLineProps.\n * @returns The JSX.Element.\n */\n renderSalesAgreementPrompt: (props: ICartLineProps): JSX.Element | null => {\n if (props.data.cartLine.SalesAgreementLineRecordId === 0) {\n return null;\n }\n return <div className='msc-cart-line__sales-agreement-prompt'>{props.resources.salesAgreementPricePrompt}</div>;\n }\n};\n\n// eslint-disable-next-line no-redeclare\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\n const { isSalesLine, productUrl, resources } = props;\n const { product, cartLine } = props.data;\n\n const destructDimensionStrings = {\n sizeString: resources.sizeString,\n colorString: resources.colorString,\n styleString: resources.styleString,\n configString: resources.configString,\n amountString: resources.amountString\n };\n\n const fallbackImageUrl =\n product &&\n getFallbackImageUrl(\n product.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\n const imageSettings = props.imageSettings;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\n const renderUnitOfMeasure = CartLineItemFunctions.renderUnitOfMeasure(props);\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\n const renderSalesAgreementPrompt = CartLineItemFunctions.renderSalesAgreementPrompt(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\n const productAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n const productName = product?.Name || cartLine.Description;\n const imgeClassName = props.data.cartLine.IsInvoiceLine ? 'msc-cart-line__invoice-image' : 'msc-cart-line__product-image';\n\n const onChange = (newValue: number): boolean => {\n if (props.quantityOnChange) {\n return props.quantityOnChange(props.data.cartLine, newValue, props.lineIndex);\n }\n return true;\n };\n\n const _generateErrorMessage = (): JSX.Element | null => {\n if (props.errorMessage) {\n return (\n <div className='msc-cart-line__error-message msc-alert__header'>\n <span className='msi-exclamation-triangle' />\n <span>{props.errorMessage}</span>\n </div>\n );\n }\n\n return null;\n };\n\n const _generateQuantityandPrice = (): JSX.Element[] | null => {\n const nodes = [];\n if (props.isOutOfStock) {\n return null;\n }\n\n // No quantity selector for invoice line\n if (!props.data.cartLine.IsInvoiceLine) {\n if (props.data.product && props.isQuantityEditable) {\n nodes.push(\n <div className='msc-cart-line__product-quantity'>\n <div className='msc-cart-line__product-quantity-label'>{resources.quantityDisplayString}</div>\n <IncrementalQuantity\n id={`msc-cart-line__quantity_${props.data.product.RecordId}-${props.data.cartLine.DeliveryMode}-${props.data.cartLine.LineId}`}\n max={props.maxQuantity || 10}\n currentCount={props.currentQuantity}\n onChange={onChange}\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\n key={props.data.cartLine.LineId}\n disabled={!props.isCartStateReady}\n isGiftCard={props.data.product.IsGiftCard}\n telemetryContent={props.telemetryContent}\n />\n </div>\n );\n } else {\n nodes.push(\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === 1 })}>\n <label className='quantity-label'>{resources.quantityDisplayString}:</label>\n <span className='quantity-value'>{props.data.cartLine.Quantity}</span>\n </div>\n );\n }\n }\n\n nodes.push(\n <div className='msc-cart-line__product-savings'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-actual'\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n currencyCode={props.priceCurrency}\n />\n {(props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && (\n <>\n <span className='msc-cart-line__product-savings-label'>\n {` ${props.resources.discountStringText || 'Discount'} `}\n </span>\n <PriceComponent\n data={\n props.isSalesLine\n ? {\n price: {\n // @ts-expect-error\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\n }\n }\n : {\n price: {\n CustomerContextualPrice: props.data.cartLine.DiscountAmount,\n BasePrice: props.data.cartLine.DiscountAmount\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-cart-line__product-savings-text'\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n currencyCode={props.priceCurrency}\n />\n </>\n )) ||\n null}\n </div>\n );\n\n return nodes;\n };\n\n return (\n <>\n <div className='msc-cart-line'>\n <div className={imgeClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n src={props.primaryImageUrl ?? 'empty'}\n fallBackSrc={fallbackImageUrl}\n altText={productName}\n gridSettings={props.gridSettings}\n imageSettings={imageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n <div className='msc-cart-line__content'>\n <div className='msc-cart-line__product'>\n <CatalogLabelComponent {...props} />\n {MsDyn365.isBrowser ? (\n <a className='msc-cart-line__product-title' {...productAttribute} href={productUrl} key={productUrl}>\n {productName}\n </a>\n ) : null}\n {ArrayExtensions.hasElements(productDimensions) ? (\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\n ) : (\n ''\n )}\n {renderUnitOfMeasure}\n <div className='msc-cart-line__product-price'>\n <PriceComponent\n data={\n isSalesLine\n ? {\n price: {\n CustomerContextualPrice: (props.data.cartLine as SalesLine).NetAmountWithAllInclusiveTax,\n BasePrice: (props.data.cartLine as SalesLine).GrossAmount\n }\n }\n : {\n price: {\n CustomerContextualPrice: (props.data.cartLine as CartLine).ExtendedPrice,\n BasePrice: props.data.cartLine.NetPrice\n }\n }\n }\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='discount-value'\n salesAgreementLineId={props.data.cartLine.SalesAgreementLineRecordId}\n currencyCode={props.priceCurrency}\n />\n </div>\n {renderDisountLines}\n {renderInventoryLabel}\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>{renderShippingLabel}</div>}\n {renderOtherCharges}\n {renderSalesAgreementPrompt}\n </div>\n {_generateQuantityandPrice()}\n {props.data.cartLine.IsInvoiceLine && props.data.cartState && props.resources.priceEditorResources && (\n <CartLinePriceEditor\n className='msc-cart-line__price-editor-container'\n context={props.context}\n resources={props.resources.priceEditorResources}\n cartState={props.data.cartState}\n cartLine={props.data.cartLine}\n />\n )}\n </div>\n </div>\n {_generateErrorMessage()}\n </>\n );\n};\n\nexport default CartLine;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderProps } from '../header.props.autogenerated';\n\n/**\n * The header preferred store component.\n */\n@observer\nexport class HeaderPreferredStore extends React.PureComponent<IHeaderProps<IHeaderData>> {\n private readonly modalCloseButtonRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n /**\n * Handle click on the store selector.\n * @returns : Promise void.\n */\n public handleClick = () => {\n return this._findPreferredStoreOnClick(this.props);\n };\n\n public render(): JSX.Element | undefined {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n slots,\n resources\n } = this.props;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- slots can be undefined.\n if (ArrayExtensions.hasElements(slots?.storeSelector)) {\n const storeName =\n storeSelectorStateManager?.preferredStore && storeSelectorStateManager.preferredStore.StoreName\n ? storeSelectorStateManager.preferredStore.StoreName\n : resources.headerPreferredStoreText;\n\n return (\n <div className='ms-header__preferred-store-container'>\n <button\n className='ms-header__preferred-store-btn msc-btn'\n color='secondary'\n aria-label={resources.headerPreferredStoreAriaLabel}\n onClick={this.handleClick}\n ref={this.modalCloseButtonRef}\n >\n <span className='ms-header__preferred-store-text'>{storeName}</span>\n </button>\n {slots.storeSelector}\n </div>\n );\n }\n\n return undefined;\n }\n\n private async _findPreferredStoreOnClick(props: IHeaderProps<IHeaderData>): Promise<void> {\n const {\n data: {\n storeSelectorStateManager: { result: storeSelectorStateManager }\n },\n modules\n } = props;\n if (!storeSelectorStateManager) {\n return;\n }\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && ArrayExtensions.hasElements(modules.storeSelector)) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n await storeSelectorStateManager\n .openDialog({\n id: storeSelectorId,\n showMapViewLink: true,\n parentElementRef: this.modalCloseButtonRef,\n onLocationSelected: orgUnitLocation => {\n return Promise.resolve();\n }\n })\n .catch((error: Error) => {\n if (props.telemetry) {\n props.telemetry.error(error.message);\n props.telemetry.debug('Unable to set preferred store');\n }\n });\n }\n}\n\nexport default HeaderPreferredStore;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ILogoProps {\n image: Msdyn365.IImageData;\n gridSettings?: Msdyn365.IGridSettings;\n link?: ILinkData;\n className?: string;\n telemetryContent?: ITelemetryContent;\n requestContext: Msdyn365.IRequestContext;\n typeName?: string;\n}\n\nexport interface ILinkData {\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n openInNewTab?: boolean;\n linkText?: string;\n}\n\n/**\n *\n * Logo component.\n * @extends {React.PureComponent<ILogoConfig>}\n */\nexport class Logo extends React.PureComponent<ILogoProps> {\n private readonly attributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: ILogoProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.Logo);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return <div className={this.props.className}>{this._renderLogo(this.props)}</div>;\n }\n\n private _renderLogo(config: ILogoProps): JSX.Element {\n if (config.link && config.link.linkUrl.destinationUrl) {\n return (\n <a\n href={config.link.linkUrl.destinationUrl}\n aria-label={config.link.ariaLabel}\n target={config.link.openInNewTab ? '_blank' : undefined}\n rel='noopener noreferrer'\n {...this.attributes}\n >\n {this._renderImage(config)}\n </a>\n );\n }\n return this._renderImage(config);\n }\n\n private _renderImage(config: ILogoProps): JSX.Element {\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=132&h=28&m=6', w: 0, h: 0 },\n lg: { q: 'w=160&h=48&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Msdyn365.Image\n {...config.image}\n requestContext={this.props.requestContext}\n gridSettings={this.props.gridSettings!}\n imageSettings={(config && config.image && config.image.imageSettings) || defaultImageSettings}\n loadFailureBehavior='default'\n editProps={{\n key: config.image || {},\n requestContext: this.props.requestContext,\n moduleType: this.props.typeName,\n imagePropertyName: 'image'\n }}\n shouldSkipToMainImage\n />\n );\n }\n}\n\nexport default Logo;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport {\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IHeaderResources } from '../header.props.autogenerated';\n\nexport interface INavIconProps {\n resources: IHeaderResources;\n isExpanded: boolean;\n targetId: string;\n telemetryContent?: ITelemetryContent;\n toggleNavBar(): void;\n}\n\n/**\n *\n * NavIcon component.\n * @extends {React.PureComponent<INavIconProps>}\n */\n\n@observer\nexport class NavIcon extends React.PureComponent<INavIconProps> {\n private readonly attributes?: Msdyn365.IDictionary<string>;\n\n constructor(props: INavIconProps) {\n super(props);\n const payLoad = getPayloadObject('click', props.telemetryContent!, TelemetryConstant.NavIcon);\n this.attributes = getTelemetryAttributes(props.telemetryContent!, payLoad);\n }\n\n public render(): JSX.Element {\n return (\n <Button\n className='ms-header__nav-icon'\n onClick={this.props.toggleNavBar}\n title={this.props.resources.mobileHamburgerAriaLabel}\n aria-label={this.props.resources.mobileHamburgerAriaLabel}\n aria-expanded={this.props.isExpanded}\n aria-controls={this.props.targetId}\n {...this.attributes}\n />\n );\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartIconComponent, WishListIconComponent } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Customer } from '@msdyn365-commerce/retail-proxy';\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n KeyCodes,\n Modal,\n ModalBody,\n ModalHeader,\n onTelemetryClick,\n Popover,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { HeaderPreferredStore, Logo, NavIcon } from './components';\nimport { IHeaderData } from './header.data';\nimport { IHeaderProps, IHeaderResources, IMyAccountLinksData } from './header.props.autogenerated';\n\nexport interface IHeaderState {\n mobileMenuCollapsed: boolean;\n signinPopoverOpen: boolean;\n hasSigninerror?: boolean;\n}\n\nexport interface IHeaderViewProps extends IHeaderProps<IHeaderData>, IHeaderState {\n logo: React.ReactNode;\n wishListIconDesktop: React.ReactNode;\n wishListIconMobile: React.ReactNode;\n cartIcon: React.ReactNode;\n navIcon: React.ReactNode;\n className: string;\n menuBar: React.ReactNode[];\n search: React.ReactNode[];\n siteOptions: React.ReactNode[];\n HeaderTag: IModuleProps;\n HeaderContainer: INodeProps;\n MobileMenuContainer: INodeProps;\n MobileMenuHeader: React.ReactNode;\n MobileMenuBodyContainer: INodeProps;\n MobileMenuLinksContainer: INodeProps;\n HeaderTopBarContainer: INodeProps;\n Divider: INodeProps;\n\n AccountInfoDropdownParentContainer?: INodeProps;\n AccountInfoDropdownPopoverConentContainer?: INodeProps;\n accountInfoDropdownButton?: React.ReactNode;\n\n signOutLink?: React.ReactNode;\n signInLink?: React.ReactNode;\n switchCustomerLink?: React.ReactNode;\n isOBORequest?: boolean;\n accountLinks?: React.ReactNode[];\n preferredStore?: React.ReactNode;\n currentDistributor?: React.ReactNode;\n}\n\n/**\n *\n * Header component.\n * @extends {React.PureComponent<IHeaderProps<IHeaderData>>}\n */\n@observer\nclass Header extends React.PureComponent<IHeaderProps<IHeaderData>, IHeaderState> {\n private readonly popOverRef: React.RefObject<HTMLButtonElement>;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private cart: ICartState | undefined;\n\n private isB2BSite: boolean = false;\n\n /**\n * The signed-in user name displayed in the header bar\n */\n @computed public get displayName(): Readonly<string | undefined> {\n return (\n (MsDyn365.isOboRequest(this.props.context.request) ? this.workerName : this.customerName) ||\n this.props.context.request?.user?.name\n );\n }\n\n /**\n * OBO scenario. The name of worker who shops on behalf of customer.\n */\n @computed public get workerName(): Readonly<string | undefined> {\n const worker = this.props.data.employee?.result;\n return worker?.Name;\n }\n\n @computed public get customerName(): Readonly<string | undefined> {\n const customer = this.props.data.accountInformation?.result;\n if (MsDyn365.isOboRequest(this.props.context.request)) {\n // For OBO scenario, display full customer name because multiple customers may have the same first name.\n return customer ? customer.Name : undefined;\n } else {\n return customer ? customer.FirstName || customer.Name : undefined;\n }\n }\n\n public constructor(props: IHeaderProps<IHeaderData>) {\n super(props);\n this.popOverRef = React.createRef();\n this._toggleNavbar = this._toggleNavbar.bind(this);\n this._togglePopover = this._togglePopover.bind(this);\n this._keydown = this._keydown.bind(this);\n this.state = {\n mobileMenuCollapsed: true,\n signinPopoverOpen: false,\n hasSigninerror: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.isB2BSite = isChannelTypeB2B(this.props.context.request);\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('keydown', this._keydown);\n }\n reaction(\n () => {\n this.props.data.cart.result;\n },\n () => {\n this.cart = this.props.data.cart.result;\n }\n );\n\n const {\n context: {\n request: { user }\n },\n resources: {\n signUpCustomerNotFoundTitle,\n signUpMultipleCustomerFoundTitle,\n signInCustomerNotAuthorizedTitle,\n closeNotificationLabel\n }\n } = this.props;\n\n const signinNotificationError = this._getSigninNotification(\n user,\n signUpMultipleCustomerFoundTitle,\n signUpCustomerNotFoundTitle,\n signInCustomerNotAuthorizedTitle\n );\n if (signinNotificationError !== undefined && this.state.hasSigninerror === false) {\n // For signup show simple error notification.\n NotificationsManager.instance().addNotification(new ErrorNotification(signinNotificationError, closeNotificationLabel));\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('keydown', this._keydown, false);\n }\n }\n\n public render(): JSX.Element | null {\n const {\n id,\n typeName,\n data: { accountInformation, wishlists },\n context: {\n request: { user }\n },\n context,\n resources: { cartLabel, cartQtyLabel }\n } = this.props;\n const { logoLink, logoImage, shouldShowWishlistCount } = this.props.config;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- app config is generic\n const disableTooltip = this.props.context.app.config.disableTooltip || false;\n const headerToggleClass = this.state.mobileMenuCollapsed ? '' : 'ms-header-open';\n const headerClassName = classnames('ms-header', this.props.config.className, headerToggleClass);\n const navbarKey = 'header-nav-mobile';\n const customer = accountInformation && accountInformation.result;\n const cartIconSlot = this._getSlot('cartIcon');\n const menuBarSlot = this._getSlot('menuBar');\n const searchSlot = this._getSlot('search');\n let wishlistCount = 0;\n const siteOptionsSlot = this._getSlot('siteOptions');\n const preferredStoreSlot = this._getSlot('storeSelector');\n const currentDistributorSlot = this._getSlot('distributorSelector');\n if (wishlists !== undefined) {\n if (\n !wishlists.result ||\n !ArrayExtensions.hasElements(wishlists.result) ||\n !wishlists.result[0].CommerceListLines ||\n !ArrayExtensions.hasElements(wishlists.result[0].CommerceListLines)\n ) {\n wishlistCount = 0;\n } else {\n wishlistCount = wishlists.result[0].CommerceListLines.length;\n }\n }\n const viewProps: IHeaderViewProps = {\n ...(this.props as IHeaderProps<IHeaderData>),\n ...this.state,\n logo: (\n <Logo\n {...{\n link: logoLink,\n image: logoImage,\n className: 'ms-header__logo',\n gridSettings: this.props.context.request.gridSettings,\n requestContext: this.props.context.request,\n telemetryContent: this.telemetryContent,\n typeName: this.props.typeName\n }}\n />\n ),\n wishListIconDesktop: (\n <WishListIconComponent\n className='ms-header__wishlist-desktop'\n showButtonTooltip={!disableTooltip}\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{}}\n wishlistCount={wishlistCount}\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\n isDispayWishlistCount={shouldShowWishlistCount}\n />\n ),\n wishListIconMobile: (\n <WishListIconComponent\n className='ms-header__wishlist-mobile'\n showButtonTooltip={!disableTooltip}\n wishlistTooltipText={this.props.resources.wishlistTooltipText}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{}}\n wishlistCount={wishlistCount}\n wishlistCountLabel={this.props.resources.wishlistCountLabel}\n isDispayWishlistCount={shouldShowWishlistCount}\n />\n ),\n cartIcon: ArrayExtensions.hasElements(cartIconSlot) ? (\n cartIconSlot[0]\n ) : (\n <CartIconComponent\n cartLabel={cartLabel}\n cartQtyLabel={cartQtyLabel}\n context={context}\n id={id}\n typeName={typeName}\n telemetryContent={this.telemetryContent}\n data={{ cart: this.cart }}\n />\n ),\n navIcon: (\n <NavIcon\n {...{\n resources: this.props.resources,\n isExpanded: !this.state.mobileMenuCollapsed,\n targetId: navbarKey,\n toggleNavBar: this._toggleNavbar,\n telemetryContent: this.telemetryContent\n }}\n />\n ),\n menuBar: ArrayExtensions.hasElements(menuBarSlot) ? menuBarSlot : [],\n search: ArrayExtensions.hasElements(searchSlot) ? searchSlot : [],\n siteOptions: ArrayExtensions.hasElements(siteOptionsSlot) ? siteOptionsSlot : [],\n className: headerClassName,\n HeaderTag: {\n moduleProps: this.props,\n className: classnames(headerClassName),\n 'aria-label': this.props.resources.headerAriaLabel,\n tag: 'header'\n },\n HeaderContainer: {\n className: classnames('ms-header__container')\n },\n HeaderTopBarContainer: {\n className: classnames('ms-header__topbar')\n },\n Divider: {\n className: classnames('ms-header__divider')\n },\n MobileMenuContainer: {\n tag: Modal,\n id: navbarKey,\n className: 'ms-header__mobile-hamburger',\n isOpen: !this.state.mobileMenuCollapsed,\n wrapClassName: 'ms-header__modal',\n toggle: this._toggleNavbar\n },\n MobileMenuHeader: <ModalHeader className='ms-header__mobile-hamburger-menu-header' toggle={this._toggleNavbar} />,\n MobileMenuBodyContainer: {\n tag: ModalBody,\n className: 'ms-header__mobile-hamburger-menu-body'\n },\n MobileMenuLinksContainer: {\n className: 'ms-header__mobile-hamburger-menu-links'\n },\n AccountInfoDropdownParentContainer: {\n className: 'ms-header__account-info'\n },\n AccountInfoDropdownPopoverConentContainer: this.displayName\n ? {\n tag: Popover,\n id: 'myprofilePopover',\n className: 'ms-header__account-info-content',\n placement: 'bottom',\n isOpen: this.state.signinPopoverOpen,\n target: this.popOverRef,\n toggle: this._togglePopover\n }\n : undefined,\n signInLink: this._getSigninButton(user, this.props.resources),\n signOutLink: this._getSignOutButton(user, this.props.resources),\n isOBORequest: MsDyn365.isOboRequest(this.props.context.request),\n switchCustomerLink: this._getSwitchCustomerButton(user, this.props.resources),\n accountInfoDropdownButton: this._getAccountInfoDropdownButton(user, this.props.resources),\n accountLinks: this._getAccountLinks(customer),\n preferredStore: ArrayExtensions.hasElements(preferredStoreSlot) && <HeaderPreferredStore {...this.props} />,\n currentDistributor: this.isB2BSite && ArrayExtensions.hasElements(currentDistributorSlot) ? currentDistributorSlot : undefined\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - Link Index.\n * @returns : Void.\n */\n public handleLinkTextChange = (linkIndex: number) => (event: MsDyn365.ContentEditableEvent): void => {\n if (this.props.config.myAccountLinks?.[linkIndex]) {\n this.props.config.myAccountLinks[linkIndex].linkText = event.target.value;\n }\n };\n\n /**\n * Get the slot.\n * @param slotName - Name of the slot.\n * @returns The slot.\n */\n private _getSlot(slotName: string): React.ReactNode[] | null {\n const { slots } = this.props;\n return (slots && slots[slotName] && slots[slotName].length && slots[slotName]) || null;\n }\n\n /**\n * Renders the sign in button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSigninButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignIn);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n !this.displayName && (\n <Button\n className='ms-header__signin-button'\n title={resources.signInLinkText}\n href={user?.signInUrl}\n aria-label={resources.signInLinkAriaText}\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign in')}\n {...attributes}\n >\n <span className='ms-header__signin-button-text' aria-hidden>\n {resources.signInLinkText}\n </span>\n </Button>\n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSignOutButton(user: MsDyn365.IRequestContextUser | undefined, resources: IHeaderResources): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SignOut);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n <Button\n className='ms-header__signout-button'\n title={resources.signOutLinkText}\n href={user?.signOutUrl ?? ''}\n aria-label={resources.signOutLinkAriaText}\n onClick={onTelemetryClick(this.telemetryContent, payLoad, 'Sign out')}\n {...attributes}\n >\n <span className='ms-header__signout-button-text' aria-hidden>\n {resources.signOutLinkText}\n </span>\n </Button>\n )\n );\n }\n\n /**\n * Renders the sign out button.\n * @param user - Request context user.\n * @param resources - Resources.\n * @returns React Node.\n */\n private _getSwitchCustomerButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.SwitchCustomer);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const isOBOAccountSelected =\n MsDyn365.isOboRequest(this.props.context.request) && this.props.context.request.cookies.getAccountSelectionCookie();\n return (\n this.displayName &&\n isOBOAccountSelected && (\n <a\n aria-label={resources.switchCustomerLinkAriaText}\n className='ms-signin-info__account-link-button'\n title={resources.switchCustomerLinkText}\n href={this.getBusinessPartnerSelectionUrl()}\n role='link'\n onClick={() => this.props.context.request.cookies.removeAccountSelectionCookie()}\n {...attributes}\n >\n <div className='ms-header__switchcustomer-button-text'>\n <div className='ms-header__shoppingas-text'>{format(resources.shoppingAsText, this.customerName)}</div>\n <div>{resources.switchCustomerLinkText}</div>\n </div>\n </a>\n )\n );\n }\n\n private getBusinessPartnerSelectionUrl(): string | undefined {\n const route = MsDyn365.getUrlSync('businessPartnerSelection', this.props.context.actionContext);\n if (!route || !MsDyn365.msdyn365Commerce.isBrowser) {\n return undefined;\n }\n\n // MsDyn365.getUrlSync persists some params in the route and remove other params.\n // Among the persisted params, we need to remove catalogid.\n const persistedParamToRemove = ['catalogid'];\n const url = new URL(route, window.location.href);\n persistedParamToRemove.forEach(param => url.searchParams.delete(param));\n return url.href;\n }\n\n private _getSigninNotification(\n user: MsDyn365.IRequestContextUser | undefined,\n signUpMultipleCustomerFoundTitle: string,\n signUpCustomerNotFoundTitle: string,\n signInCustomerNotAuthorizedTitle: string\n ): string | undefined {\n if (!user?.retailServerErrorCode) {\n return undefined;\n }\n\n const { signUpCustomerNotFound, signUpMultipleCustomerFound, signInCustomerNotAuthorized } = this.props.config;\n const notFoundError = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\n const multipleAccountError = 'Microsoft_Dynamics_Commerce_Runtime_MultipleCustomerAccountsFoundWithSameEmailAddress';\n const accountAuthorizationError = 'Microsoft_Dynamics_Commerce_Runtime_AuthorizationFailed';\n\n if (user?.retailServerErrorCode === notFoundError) {\n return signUpCustomerNotFound !== undefined ? signUpCustomerNotFound : signUpCustomerNotFoundTitle;\n } else if (user?.retailServerErrorCode === multipleAccountError) {\n return signUpMultipleCustomerFound !== undefined ? signUpMultipleCustomerFound : signUpMultipleCustomerFoundTitle;\n } else if (user?.retailServerErrorCode === accountAuthorizationError) {\n return signInCustomerNotAuthorized !== undefined ? signInCustomerNotAuthorized : signInCustomerNotAuthorizedTitle;\n }\n return user?.retailServerErrorMessage;\n }\n\n private _getAccountInfoDropdownButton(\n user: MsDyn365.IRequestContextUser | undefined,\n resources: IHeaderResources\n ): React.ReactNode | undefined {\n const payLoad = getPayloadObject('click', this.telemetryContent, TelemetryConstant.MyProfile);\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n return (\n this.displayName && (\n <Button\n innerRef={this.popOverRef}\n className='ms-header__profile-button'\n aria-describedby='myprofilePopover'\n onClick={this._togglePopover}\n color='link'\n aria-label={this.displayName}\n aria-expanded={this.state.signinPopoverOpen}\n {...attributes}\n >\n <div className='ms-profile-button-text'>\n <div>{this.displayName}</div>\n {MsDyn365.isOboRequest(this.props.context.request) && this.customerName && (\n <div>{format(resources.shoppingAsText, this.customerName)}</div>\n )}\n </div>\n </Button>\n )\n );\n }\n\n private _getAccountLinks(customer: Customer | undefined): React.ReactNode[] | undefined {\n const { myAccountLinks } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n if (!this.displayName || !myAccountLinks || !ArrayExtensions.hasElements(myAccountLinks)) {\n return undefined;\n }\n return myAccountLinks.map((cta: IMyAccountLinksData, index: number) => {\n payLoad.contentAction.etext = cta.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: cta.ariaLabel,\n className: 'ms-signin-info__account-link-button',\n linkText: cta.linkText,\n linkUrl: cta.linkUrl.destinationUrl,\n openInNewTab: cta.openInNewTab,\n role: 'link',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={index}\n link={editableLink}\n editProps={{ onTextChange: this.handleLinkTextChange(index), requestContext: this.props.context.request }}\n />\n );\n });\n }\n\n private _toggleNavbar(): void {\n this.setState({\n mobileMenuCollapsed: !this.state.mobileMenuCollapsed\n });\n }\n\n private _togglePopover(): void {\n this.setState({\n signinPopoverOpen: !this.state.signinPopoverOpen\n });\n }\n\n private _keydown(event: KeyboardEvent): void {\n if (event.keyCode === KeyCodes.Escape) {\n this.setState({ mobileMenuCollapsed: true });\n }\n }\n}\n\nexport default Header;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IHeaderViewProps } from './header';\n\nconst headerView: React.FC<IHeaderViewProps> = props => {\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer,\n Divider\n } = props;\n return (\n <Module {...HeaderTag}>\n <Node {...HeaderContainer}>\n <Node {...HeaderTopBarContainer}>\n {props.navIcon}\n {props.logo}\n {_renderReactFragment(props.search)}\n {props.preferredStore}\n {props.currentDistributor}\n {_renderDesktopAccountBlock(props)}\n {props.wishListIconDesktop}\n <Node {...Divider} />\n {props.cartIcon}\n {_renderReactFragment(props.siteOptions)}\n </Node>\n <Node {...MobileMenuContainer}>\n <Node {...MobileMenuBodyContainer}>\n {props.MobileMenuHeader}\n {_renderReactFragment(props.menuBar)}\n <Node {...MobileMenuLinksContainer}>\n {props.accountLinks ? props.accountLinks.map(link => link) : false}\n {props.siteOptions}\n {props.wishListIconMobile}\n {props.signInLink}\n {props.signOutLink}\n </Node>\n </Node>\n </Node>\n {_renderReactFragment(props.menuBar)}\n </Node>\n </Module>\n );\n};\n\nfunction _renderDesktopAccountBlock(props: IHeaderViewProps): JSX.Element | null {\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signOutLink,\n signInLink,\n accountLinks\n } = props;\n\n if (AccountInfoDropdownParentContainer) {\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n <Node {...AccountInfoDropdownParentContainer}>\n {accountInfoDropdownButton}\n <Node {...AccountInfoDropdownPopoverConentContainer}>\n {accountLinks ? accountLinks.map(link => link) : false}\n {signOutLink}\n </Node>\n </Node>\n );\n } else if (signInLink) {\n return <Node {...AccountInfoDropdownParentContainer}>{signInLink}</Node>;\n }\n }\n props.context.telemetry.error('Header content is empty, module wont render.');\n return null;\n}\n\nfunction _renderReactFragment(items: React.ReactNode[]): JSX.Element | null {\n return (\n <>\n {items && items.length > 0\n ? items.map((slot: React.ReactNode, index: number) => {\n return <React.Fragment key={index}>{slot}</React.Fragment>;\n })\n : null}\n </>\n );\n}\n\nexport default headerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getCatalogId, getUrlSync, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n ObjectExtensions,\n PriceForProductSearchResultInput,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Button,\n getTelemetryObject,\n IComponentNodeProps,\n IModuleProps,\n INodeProps,\n ISingleSlideCarouselProps,\n ITelemetryContent,\n NodeTag,\n SingleSlideCarousel\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductCollectionData } from './product-collection.data';\nimport { IProductCollectionProps, layout } from './product-collection.props.autogenerated';\n\nexport interface IProductCollectionViewProps extends IProductCollectionProps<IProductCollectionData> {\n heading?: React.ReactNode;\n ProductCollectionContainer: IModuleProps;\n SingleSlideCarouselComponentProps: INodeProps;\n GridComponentProps: INodeProps;\n products: IProductComponentViewProps[];\n isCarousel: boolean;\n productPrices?: ProductPrice[];\n seeAllButton?: React.ReactNode;\n}\n\nexport interface IProductComponentViewProps {\n ProductContainer: INodeProps;\n productComponent: React.ReactNode;\n}\nexport interface IProductComponentState {\n products: ProductSearchResult[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent<IProductCollectionProps<IProductCollectionData>, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps<IProductCollectionData>) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection.products || []\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext.user.isAuthenticated) {\n await this._getActivePrice();\n }\n }\n\n public render(): JSX.Element | null {\n const { heading, className, shouldDisplaySeeAllButton } = this.props.config;\n const { resources } = this.props;\n const recommendation = this.props.config.productCollection.recommendationListId;\n\n // Initialize state in case if the products were not found during initial module render\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data if not there.\n this.initProductState(this.props.config.productCollection);\n\n const products = this.state.products;\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingLabel = heading ? heading.text : '';\n const headingComponent = heading && (\n <Msdyn365.Text\n className='ms-product-collection__heading'\n tag={heading.tag || 'h1'}\n text={headingLabel}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- product check for safety.\n const updatedProducts = products?.map((item: ProductSearchResult, index: number) => {\n const getProductData = this._getProduct(item, index);\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\n });\n\n const productCollectionViewProps = {\n ...this.props,\n heading: headingComponent,\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: '',\n flipperPrevLabel: `${headingLabel} ${resources.flipperPrevious}`,\n flipperNextLabel: `${headingLabel} ${resources.flipperNext}`,\n parentId: this.props.id,\n telemetryContent: this.telemetryContent\n } as IComponentNodeProps<ISingleSlideCarouselProps>,\n ProductCollectionContainer: {\n moduleProps: this.props,\n className: classnames('ms-product-collection', className)\n },\n GridComponentProps: {\n tag: 'ul' as NodeTag,\n className: 'ms-product-collection__items'\n },\n isCarousel,\n\n products:\n ArrayExtensions.hasElements(updatedProducts) &&\n updatedProducts.filter(item => {\n return item !== undefined;\n }),\n productPrices: this.productPrices,\n seeAllButton:\n recommendation && shouldDisplaySeeAllButton && ArrayExtensions.hasElements(updatedProducts)\n ? this._getSeeAllButton(recommendation, headingLabel)\n : undefined\n };\n return this.props.renderView(productCollectionViewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n /**\n * Get products dimension availabilities.\n * @param products - Products.\n * @returns Promise.\n */\n private readonly _getProductsDimensionsAvailabilities = async (products: ProductSearchResult[]): Promise<void> => {\n const context = this.props.context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n const validProducts = ArrayExtensions.validValues(products);\n if (\n ArrayExtensions.hasElements(validProducts) &&\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none)\n ) {\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n validProducts,\n this.props.context as ICoreContext<IDimensionsApp>,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n }\n };\n\n /**\n * Helper method to initialize products state.\n * @param productCollection - List of products.\n */\n private readonly initProductState = async (productCollection: Msdyn365.IProductList) => {\n let products = this.state.products;\n const productCollectionProducts = productCollection.products;\n if (!ArrayExtensions.hasElements(products) && ArrayExtensions.hasElements(productCollectionProducts)) {\n products = productCollectionProducts;\n this.setState({ products });\n } else if (\n ArrayExtensions.hasElements(products) &&\n ArrayExtensions.hasElements(productCollectionProducts) &&\n !ArrayExtensions.equals(products, productCollectionProducts)\n ) {\n products = productCollectionProducts;\n this.setState({ products });\n } else if (productCollectionProducts === undefined && ArrayExtensions.hasElements(this.state.products)) {\n products = [];\n this.setState({ products: products });\n }\n\n if (Msdyn365.msdyn365Commerce.isBrowser && !ArrayExtensions.hasElements(this.state.productsDimensionAvailabilities)) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n };\n\n private readonly _getProduct = (product: ProductSearchResult, index: number): IProductComponentViewProps | null => {\n if (!product || !product.Name) {\n this.props.telemetry.trace('[product-collection] Product or product name is null');\n return null;\n }\n const telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const { imageSettings, allowBackNavigation } = this.props.config;\n const resources = this.props.resources;\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\n const quickviewSlot =\n this.props.slots && this.props.slots.quickview && this.props.slots.quickview.length > 0 ? this.props.slots.quickview[0] : null;\n const productComparisonButtonSlot = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const reviewCount = 1;\n const reviewTotalRatings = Number(product.TotalRatings);\n const reviewCountAriaLabelValue =\n reviewTotalRatings > reviewCount ? resources.ratingCountAriaLabel : resources.ratingCountAriaLabelSingleUser;\n const isPriceMinMaxEnabled = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return {\n ProductContainer: {\n tag: 'li' as NodeTag,\n className: 'ms-product-collection__item',\n role: 'listitem',\n key: index\n },\n productComponent: (\n <ProductComponent\n context={this.props.context}\n telemetryContent={telemetryContent}\n imageSettings={imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n ratingCountAriaLabel={reviewCountAriaLabelValue}\n allowBack={allowBack}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ product }}\n quickViewButton={quickviewSlot}\n productComparisonButton={productComparisonButtonSlot}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled?.IsEnabled}\n priceResources={priceResources}\n dimensionAvailabilities={this.state.productsDimensionAvailabilities?.find(\n dimensionAvailability =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === (product.MasterProductId ?? product.RecordId)\n )}\n />\n )\n };\n };\n\n /**\n * Get the active price for products.\n */\n private readonly _getActivePrice = async (): Promise<void> => {\n const productsList = this.state.products;\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n if (Msdyn365.msdyn365Commerce.isBrowser) {\n await this._getProductsDimensionsAvailabilities(products);\n }\n\n this.setState({ products });\n };\n\n /**\n * Get the see all button.\n * @param recommendation - Recommendation.\n * @param headingLabel - Heading label.\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\n */\n private readonly _getSeeAllButton = (recommendation: string, headingLabel: string): React.ReactNode => {\n if (!Msdyn365.msdyn365Commerce.isBrowser) {\n return null;\n }\n\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const searchPageLink = getUrlSync('search', this.props.context.actionContext);\n if (!searchPageLink) {\n return null;\n }\n\n const url = new URL(searchPageLink, window.location.href);\n url.searchParams.set('recommendation', recommendation);\n url.searchParams.set('title', headingLabel);\n url.searchParams.set('catalogid', `${catalogId}`);\n\n return (\n <Button\n className='ms-product-collection__see-all-btn msc-cta__primary'\n title={this.props.resources.seeAllButtonText}\n href={url.href}\n >\n {this.props.resources.seeAllButtonText}\n </Button>\n );\n };\n}\n\nexport default ProductCollection;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const {\n heading,\n ProductCollectionContainer,\n products,\n SingleSlideCarouselComponentProps,\n GridComponentProps,\n isCarousel,\n seeAllButton\n } = props;\n\n if (products) {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {seeAllButton}\n {isCarousel ? _renderCarousel(SingleSlideCarouselComponentProps, products) : _renderGrid(GridComponentProps, products)}\n </Module>\n );\n }\n props.context.telemetry.error('Product collection content is empty, module wont render.');\n return null;\n};\n\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return <Node {...carouselContainer}>{items && items.map(_renderProduct)}</Node>;\n};\n\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\n return <Node {...gridContainer}>{items && items.map(_renderProduct)}</Node>;\n};\n\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\n const { ProductContainer, productComponent } = product;\n\n return <Node {...ProductContainer}>{productComponent}</Node>;\n};\n\nexport default ProductCollectionView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce, { getCatalogId, getUrlSync, IImageSettings, Image, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n getProductUrlSync,\n ObjectExtensions,\n Random,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IModuleProps, isMobile, VariantType, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { RemoveFromComparisonButtonComponent } from '../product-comparison';\nimport { ProductComparisonState } from '../product-comparison-state';\nimport {\n getProductsInPreviewProductComparisonAction,\n GetProductsInPreviewProductComparisonInput,\n IProductComparisonProductData\n} from './actions';\nimport { IProductComparisonPreviewData } from './product-comparison-preview.data';\nimport { IProductComparisonPreviewProps } from './product-comparison-preview.props.autogenerated';\n\n/**\n * Represents product comparison view props for main product info.\n */\nexport interface IProductComparisonPreviewProductMainInfo {\n productData: IProductComparisonProductData;\n productNameLink?: string;\n\n removeFromComparisonButton: React.ReactNode;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n}\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonPreviewViewProps extends IProductComparisonPreviewProps<{}> {\n moduleProps: IModuleProps;\n collapseButton: INodeProps;\n isMainContentReady: boolean;\n\n hasUserInteractedWithComparison?: boolean;\n isExpanded?: boolean;\n subheaderText?: string;\n productsMainInfo?: IProductComparisonPreviewProductMainInfo[];\n previewGreyPlaceHolders?: React.ReactNode;\n\n productComparisonLink?: string;\n goToComparisonButton?: React.ReactNode;\n clearAllButton?: React.ReactNode;\n\n handleCollapseClick?(): void;\n clearAllProductsFromTheComparison?(): void;\n removeProductFromList?(itemId: string): void;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonPreviewState {\n isExpanded?: boolean;\n productsData?: IProductComparisonProductData[];\n greyPlaceHoldersCount?: number;\n}\n\n/**\n * Extended props for the module including info about the product.\n */\nexport interface IProductComparisonPreviewFullProps extends IProductComparisonPreviewProps<IProductComparisonPreviewData> {}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparisonPreview extends React.PureComponent<IProductComparisonPreviewFullProps, IProductComparisonPreviewState> {\n public static readonly className = 'ms-product-comparison-preview';\n\n public static readonly containerClassName = `${ProductComparisonPreview.className}__container`;\n\n public static readonly mainContainerClassName = `${ProductComparisonPreview.containerClassName}__main-container`;\n\n public static readonly headerClassName = `${ProductComparisonPreview.mainContainerClassName}__header`;\n\n public static readonly headerLabelClassName = `${ProductComparisonPreview.headerClassName}__label`;\n\n public static readonly tableClassName = `${ProductComparisonPreview.mainContainerClassName}__table`;\n\n public static readonly tableRowClassName = `${ProductComparisonPreview.tableClassName}__product-row`;\n\n public static readonly footerClassName = `${ProductComparisonPreview.mainContainerClassName}__footer`;\n\n public static readonly collapseButtonClassName = `${ProductComparisonPreview.headerClassName}__collapse`;\n\n public static _displayedInstanceId?: string;\n\n private readonly _instanceId: string;\n\n private _hasUserInteractedWithComparison: boolean;\n\n public constructor(props: IProductComparisonPreviewFullProps) {\n super(props);\n\n this.state = {};\n\n this._instanceId = `${ProductComparisonPreview.className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n ProductComparisonPreview._displayedInstanceId = this._instanceId;\n\n this._hasUserInteractedWithComparison = false;\n }\n\n public componentDidMount(): void {\n if (this._instanceId !== ProductComparisonPreview._displayedInstanceId) {\n return;\n }\n\n this._loadProducts();\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n this._hasUserInteractedWithComparison = true;\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data downloading.\n this._loadProducts();\n }\n }\n );\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public render(): React.ReactNode {\n if (this._instanceId !== ProductComparisonPreview._displayedInstanceId) {\n return null;\n }\n\n const viewProps: IProductComparisonPreviewViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: ProductComparisonPreview.className,\n id: this._instanceId\n },\n collapseButton: this._renderCollapseButton(),\n isMainContentReady: false,\n hasUserInteractedWithComparison: this._hasUserInteractedWithComparison\n };\n\n const productData = this._getProdutComparisonDataByCatalogId(this.state.productsData ?? this.props.data.productsData?.result);\n\n if (!ArrayExtensions.hasElements(productData)) {\n return this.props.renderView(viewProps);\n }\n\n viewProps.isMainContentReady = true;\n\n const productsLimit = this._getProductsLimit();\n if (!ObjectExtensions.isNullOrUndefined(productsLimit)) {\n viewProps.subheaderText = this.props.resources.productComparisonPreviewHeaderTextWithLimit\n .replace('{0}', productData.length.toString())\n .replace('{1}', productsLimit.toString());\n }\n\n viewProps.isExpanded = this.state.isExpanded;\n viewProps.handleCollapseClick = this._handleCollapseClick;\n viewProps.productsMainInfo = this._getProductsMainInfo(productData);\n viewProps.previewGreyPlaceHolders = this._renderGreyPlaceHolders(productData);\n viewProps.productComparisonLink = getUrlSync('product-comparison', this.props.context.actionContext);\n viewProps.clearAllProductsFromTheComparison = this._clearAllProductsFromTheComparison;\n viewProps.removeProductFromList = this._removeProductFromList;\n viewProps.goToComparisonButton = this._renderGoToComparisonButton(viewProps.productComparisonLink);\n viewProps.clearAllButton = this._renderClearAllButton();\n\n return this.props.renderView(viewProps);\n }\n private _getProdutComparisonDataByCatalogId(productData: IProductComparisonProductData[] | undefined): IProductComparisonProductData[] {\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const productByCatalogId = productData?.filter(product => product.catalogId === catalogId) ?? [];\n return productByCatalogId;\n }\n private async _loadProducts(): Promise<void> {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const input = new GetProductsInPreviewProductComparisonInput(items);\n const productData = await getProductsInPreviewProductComparisonAction(input, this.props.context.actionContext);\n const productDataByCatalogId = this._getProdutComparisonDataByCatalogId(productData);\n this.setState({ productsData: productDataByCatalogId });\n this._getGreyPlaceHoldersCount(productDataByCatalogId);\n }\n\n private _getGreyPlaceHoldersCount(productData: IProductComparisonProductData[]): number | undefined {\n if (productData && ArrayExtensions.hasElements(productData)) {\n const limit = this._getProductsLimit();\n if (limit && this.props.context.app.config.displayGreyPlaceHolders) {\n const placeHolder = limit - productData.length;\n this.setState({ greyPlaceHoldersCount: placeHolder });\n return placeHolder;\n }\n }\n return;\n }\n\n private _getProductsMainInfo(products: IProductComparisonProductData[]): IProductComparisonPreviewProductMainInfo[] {\n const productImageContainerClassName = `${ProductComparisonPreview.tableRowClassName}__product-image-container`;\n const productImageClassName = `${productImageContainerClassName}__product-image`;\n const productNameClassName = `${ProductComparisonPreview.tableRowClassName}__product-name`;\n\n return products.map(productData => {\n const product = productData.product;\n\n let productNameLink: string | undefined;\n if (msdyn365Commerce.isBrowser) {\n const productUrl = getProductUrlSync(product, this.props.context.actionContext);\n const fullUrl = new URL(productUrl, window.location.href);\n if (isChannelTypeB2B(this.props.context.actionContext.requestContext)) {\n fullUrl.searchParams.set('catalogid', `${productData.catalogId}`);\n }\n product.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n productNameLink = fullUrl.href;\n }\n\n return {\n productNameLink,\n productData,\n removeFromComparisonButton: (\n <RemoveFromComparisonButtonComponent\n className={`${ProductComparisonPreview.tableRowClassName}__remove`}\n resources={this.props.resources}\n itemId={productData.itemId}\n onClickHandler={this._removeProductFromList}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n ),\n productImage: (\n <a className={productImageContainerClassName} href={productNameLink}>\n {this._renderProductImage(productImageClassName, productData.product)}\n </a>\n ),\n productLink: (\n <a className={productNameClassName} href={productNameLink}>\n {productData.product.Name}\n </a>\n )\n };\n });\n }\n\n /**\n * Represents product comparison preview view.\n * @returns Elements.\n */\n private _renderGreyPlaceHolders = (productData: IProductComparisonProductData[]): React.ReactNode[] | undefined => {\n const counts = this.state.greyPlaceHoldersCount;\n if (this.props.context.app.config.displayGreyPlaceHolders && counts! > 0) {\n const elements = [];\n for (let index = 0; index < counts!; index++) {\n elements.push(\n <td className='' key={index}>\n <div className='placeholder-preview' />\n </td>\n );\n }\n return elements;\n }\n return;\n };\n\n /**\n * Removes the product from a list.\n * @param itemId - The id of a product to remove.\n */\n private readonly _removeProductFromList = (itemId: string): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(itemId);\n this.setState(previousState => {\n return {\n productsData: previousState.productsData?.filter(item => item.itemId !== itemId)\n };\n });\n };\n\n /**\n * Toggle collapsing.\n */\n private readonly _handleCollapseClick: () => void = () => {\n this.setState(previousState => {\n return {\n isExpanded: !(previousState.isExpanded ?? this._hasUserInteractedWithComparison)\n };\n });\n };\n\n /**\n * Removes all products from the comparison.\n */\n private readonly _clearAllProductsFromTheComparison = () => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).clearAll();\n this.setState({ productsData: [] });\n };\n\n private _getProductsLimit(): number | undefined {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n if (viewport === 'xs' || viewport === 'sm') {\n return this.props.context.app.config.productComparisonMobileProductsLimit;\n }\n return this.props.context.app.config.productComparisonDesktopProductsLimit;\n }\n\n /**\n * Retrieves product image react node.\n * @param className - Class name to use.\n * @param product - Product info.\n * @returns React node.\n */\n private _renderProductImage(className: string, product?: SimpleProduct): React.ReactNode | undefined {\n if (ObjectExtensions.isNullOrUndefined(product)) {\n return undefined;\n }\n\n const defaultImageSettingQ = 'w=140&h=140&m=6';\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: defaultImageSettingQ, w: 0, h: 0 },\n lg: { q: defaultImageSettingQ, w: 0, h: 0 },\n xl: { q: defaultImageSettingQ, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n key={product.Name}\n src={product.PrimaryImageUrl ?? ''}\n fallBackSrc={\n getFallbackImageUrl(\n product.ItemId,\n this.props.context.actionContext.requestContext.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n ) ?? ''\n }\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={defaultImageSettings}\n loadFailureBehavior='empty'\n className={className}\n requestContext={this.props.context.actionContext.requestContext}\n />\n );\n }\n\n private _renderCollapseButton(): INodeProps {\n const shouldBeExpanded = this.state.isExpanded ?? this._hasUserInteractedWithComparison;\n const headerContainerClassName = `${ProductComparisonPreview.mainContainerClassName}__header_button`;\n let collapseClassName = `${ProductComparisonPreview.collapseButtonClassName}__expanded`;\n if (!shouldBeExpanded) {\n collapseClassName = `${ProductComparisonPreview.collapseButtonClassName}__collapsed`;\n }\n\n return {\n className: classnames(headerContainerClassName, ProductComparisonPreview.collapseButtonClassName, collapseClassName),\n onClick: this._handleCollapseClick,\n role: 'button',\n tabIndex: 0\n };\n }\n\n private _renderGoToComparisonButton(productComparisonLink: string | undefined): React.ReactNode {\n return (\n <Button\n className={`${ProductComparisonPreview.footerClassName}__go-to-comparison`}\n href={productComparisonLink}\n title={this.props.resources.productComparisonCompareProductsButtonText}\n >\n {this.props.resources.productComparisonCompareProductsButtonText}\n </Button>\n );\n }\n\n private _renderClearAllButton(): React.ReactNode {\n return (\n <Button\n className={`${ProductComparisonPreview.footerClassName}__clear-all`}\n title={this.props.resources.productComparisonClearAllProductsButtonText}\n onClick={this._clearAllProductsFromTheComparison}\n >\n {this.props.resources.productComparisonClearAllProductsButtonText}\n </Button>\n );\n }\n}\n\nexport default ProductComparisonPreview;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce from '@msdyn365-commerce/core';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IProductComparisonPreviewViewProps, ProductComparisonPreview } from './product-comparison-preview';\n\n/**\n * Represents product comparison preview view.\n * @param props - View props for product comparison preview.\n * @returns Functional component of product comparison preview.\n */\nexport const ProductComparisonPreviewViewFunctionalComponent: React.FC<IProductComparisonPreviewViewProps> = props => {\n if (!props.isMainContentReady) {\n return null;\n }\n\n const shouldBeExpanded = props.isExpanded ?? props.hasUserInteractedWithComparison;\n\n const containerClassName = classnames(\n ProductComparisonPreview.mainContainerClassName,\n shouldBeExpanded ? '' : `${ProductComparisonPreview.mainContainerClassName}__collapsed`\n );\n\n return (\n <Module {...props.moduleProps}>\n <Node className={ProductComparisonPreview.containerClassName}>\n <Node className={containerClassName}>\n <Node className={`${ProductComparisonPreview.mainContainerClassName}__header__section`}>\n <Node {...props.collapseButton}>\n <Node className={ProductComparisonPreview.headerClassName}>\n <Node className={ProductComparisonPreview.headerLabelClassName}>\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__icon`} />\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__main-text`}>\n {props.resources.productComparisonPreviewHeaderText}\n </Node>\n <Node className={`${ProductComparisonPreview.headerLabelClassName}__sub-text`}>\n {props.subheaderText}\n </Node>\n </Node>\n </Node>\n </Node>\n <Node className={ProductComparisonPreview.tableClassName} tag='table'>\n <Node className='' tag='tbody'>\n <Node className={ProductComparisonPreview.tableRowClassName} tag='tr'>\n {props.productsMainInfo?.map(info => {\n return (\n <Node className='' tag='td' key={info.productData.itemId}>\n {info.removeFromComparisonButton}\n {info.productImage}\n </Node>\n );\n })}\n {props.previewGreyPlaceHolders}\n </Node>\n <Node className={ProductComparisonPreview.tableRowClassName} tag='tr'>\n {props.productsMainInfo?.map(info => {\n return (\n <Node className='' tag='td' key={info.productData.itemId}>\n {msdyn365Commerce.isBrowser ? info.productLink : undefined}\n </Node>\n );\n })}\n </Node>\n </Node>\n </Node>\n </Node>\n <Node className={ProductComparisonPreview.footerClassName}>\n {props.clearAllButton}\n {props.goToComparisonButton}\n </Node>\n </Node>\n </Node>\n </Module>\n );\n};\n\nexport default ProductComparisonPreviewViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getRichTextHtml, ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\nimport { ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * Represents resources for the component.\n */\nexport interface IProductSpecificationResources {\n productComparisonProductItemSpecificationTrue: string;\n productComparisonProductItemSpecificationFalse: string;\n}\n\n/**\n * Represent configuration of the component.\n */\nexport interface IProductSpecificationProps {\n telemetry: ITelemetry;\n specification?: AttributeValue;\n context: ICoreContext;\n\n resources: IProductSpecificationResources;\n}\n\n/**\n * Represents the product specification values that comes from the server.\n */\nexport enum SpecificationDataTypeValues {\n none = 0,\n currency = 1,\n dateTime = 2,\n decimal = 3,\n integer = 4,\n text = 5,\n boolean = 6,\n video = 40,\n image = 41\n}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductSpecification extends React.PureComponent<IProductSpecificationProps> {\n private static _renderCurrencyCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.CurrencyValue)) {\n return null;\n }\n\n return (\n <span>\n {product.CurrencyCode}\n {product.CurrencyValue}\n </span>\n );\n }\n\n private static _renderDateTimeCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isFunction(product.DateTimeOffsetValue?.toUTCString)) {\n return null;\n }\n\n return <span>{product.DateTimeOffsetValue!.toUTCString()}</span>;\n }\n\n private static _renderIntegerCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.IntegerValue)) {\n return null;\n }\n\n return <span>{product.IntegerValue}</span>;\n }\n\n private static _renderDecimalCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.FloatValue)) {\n return null;\n }\n\n return <span>{product.FloatValue}</span>;\n }\n\n private static _renderTextCell(product: AttributeValue): React.ReactNode | null {\n if (ObjectExtensions.isNullOrUndefined(product.TextValue)) {\n return null;\n }\n\n // eslint-disable-next-line react/no-danger -- Implementation is a copy.\n return <span dangerouslySetInnerHTML={getRichTextHtml(product.TextValue)} />;\n }\n\n public constructor(props: IProductSpecificationProps) {\n super(props);\n }\n\n public render(): React.ReactNode | null {\n const specification = this.props.specification;\n if (ObjectExtensions.isNullOrUndefined(specification)) {\n return null;\n }\n\n switch (specification.DataTypeValue) {\n case SpecificationDataTypeValues.none:\n // Return span here instead of null so the row still shows\n return <span />;\n case SpecificationDataTypeValues.currency:\n return ProductSpecification._renderCurrencyCell(specification);\n case SpecificationDataTypeValues.dateTime:\n return ProductSpecification._renderDateTimeCell(specification);\n case SpecificationDataTypeValues.decimal:\n return ProductSpecification._renderDecimalCell(specification);\n case SpecificationDataTypeValues.integer:\n return ProductSpecification._renderIntegerCell(specification);\n case SpecificationDataTypeValues.text:\n return ProductSpecification._renderTextCell(specification);\n case SpecificationDataTypeValues.boolean:\n return this._renderTrueFalseCell(specification);\n case SpecificationDataTypeValues.video:\n this.props.telemetry.warning('Got video specification type, not supported yet so skipping line');\n return null;\n case SpecificationDataTypeValues.image:\n this.props.telemetry.warning('Got image specification type, not supported yet so skipping line');\n return null;\n default:\n this.props.telemetry.warning(`Got unknown specification type ${specification.DataTypeValue ?? 'null'} so skipping line`);\n return null;\n }\n }\n\n private _renderTrueFalseCell(product: AttributeValue): React.ReactNode | null {\n if (product.BooleanValue) {\n return <span>{this.props.resources.productComparisonProductItemSpecificationTrue}</span>;\n }\n return <span>{this.props.resources.productComparisonProductItemSpecificationFalse}</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 { IComponentProps } from '@msdyn365-commerce/core';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport React, { useCallback } from 'react';\n\n/**\n * Resources for the remove from comparison button component.\n */\nexport interface IRemoveFromComparisonButtonResources {\n productComparisonRemoveProductFromListAriaLabel: string;\n}\n\n/**\n * The configuration of the remove from comparison button component.\n */\nexport interface IRemoveFromComparisonButtonComponentProps extends IComponentProps {\n className: string;\n itemId: string;\n\n resources: IRemoveFromComparisonButtonResources;\n\n onClickHandler(itemId: string): void;\n}\n\n/**\n * Represents a button which handles adding to product comparison.\n * @param props - Configuration of the component.\n * @returns React functional component.\n */\nconst RemoveFromComparisonButtonFunctionalComponent: React.FC<IRemoveFromComparisonButtonComponentProps> = (\n props: IRemoveFromComparisonButtonComponentProps\n) => {\n const onClick = useCallback(() => {\n props.onClickHandler(props.itemId);\n }, [props]);\n\n const { className } = props;\n\n return <Button className={className} title={props.resources.productComparisonRemoveProductFromListAriaLabel} onClick={onClick} />;\n};\n\n/**\n * Represents a button which handles removing the product from the comparison.\n * @param props - Configuration of the component.\n * @returns React functional component.\n */\nexport const RemoveFromComparisonButtonComponent: React.FunctionComponent<IRemoveFromComparisonButtonComponentProps> = (\n props: IRemoveFromComparisonButtonComponentProps\n) => React.createElement(RemoveFromComparisonButtonFunctionalComponent, props);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { ISwatchItem, PriceComponent, RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, IImageSettings, Image, msdyn365Commerce, getUrlSync, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { AttributeValue, ProductDimension, ProductDimensionType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getFallbackImageUrl,\n getProductUrlSync,\n ObjectExtensions,\n Random,\n StringExtensions,\n convertProductDimensionTypeToDimensionTypes,\n DimensionTypes,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, format, Heading, IModuleProps, INodeProps, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { debounce } from 'lodash';\n\nimport { ProductComparisonState } from '../product-comparison-state';\nimport {\n getProductsInProductComparisonAction,\n GetProductsInProductComparisonInput,\n IDimensionResult,\n IProductComparisonItemData\n} from './actions';\nimport { ProductSpecification, RemoveFromComparisonButtonComponent } from './base';\nimport { IProductComparisonData } from './product-comparison.data';\nimport { IProductComparisonProps } from './product-comparison.props.autogenerated';\n\n/**\n * Represents product comparison view props for main product info.\n */\nexport interface IProductComparisonProductMainInfo {\n cellContainerProps: INodeProps;\n tableCellProps: INodeProps;\n tableHeaderProps: INodeProps;\n\n product: IProductComparisonItemData;\n productUrl?: string;\n\n isFromCurrentCatalog: boolean;\n\n removeFromComparisonButton: React.ReactNode;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productPrice: React.ReactNode;\n quickView: React.ReactNode;\n goToProductDetailsButton: React.ReactNode;\n productRating: React.ReactNode;\n productDescription: React.ReactNode;\n}\n\n/**\n * Specifies the type of selection.\n */\nexport enum SelectionType {\n text = 'text',\n swatch = 'swatch'\n}\n\n/**\n * Represents product comparison view props.\n */\nexport interface IProductComparisonViewProps extends IProductComparisonProps<{}> {\n moduleProps: IModuleProps;\n\n isMainContentReady: boolean;\n isEmptyContent: boolean;\n productCountText?: string;\n\n actionBarContainerProps: INodeProps;\n\n heading: React.ReactNode;\n loading: React.ReactNode;\n emptyComparison: React.ReactNode;\n clearAllButton: React.ReactNode;\n previousClicker: React.ReactNode;\n nextClicker: React.ReactNode;\n backToShopping: React.ReactNode;\n\n productsMainInfo?: IProductComparisonProductMainInfo[];\n\n tableReference?: React.RefObject<HTMLDivElement>;\n\n tableHeaderReference?: React.RefObject<HTMLDivElement>;\n\n tableBodyReference?: React.RefObject<HTMLDivElement>;\n\n tableCellReference?: React.RefObject<HTMLDivElement>;\n\n shouldShowPreviousClicker?: boolean;\n shouldShowNextClicker?: boolean;\n currentClickerPosition?: number;\n\n hoveringCellItemId?: string;\n hoverStateLastUpdate?: number;\n\n uniqueSpecifications?: AttributeValue[];\n uniqueDimensionIds?: number[];\n\n dimensionsProps?: (\n | {\n dimensionId: number;\n dimensionName: string | undefined;\n dimensionClassName: string;\n productDimensionValues: {\n dimensionProps: { RecordId: number; Value: string; DimensionId: number; ImageUrl: string | undefined };\n productMainInfo: IProductComparisonProductMainInfo;\n node: JSX.Element;\n }[];\n }\n | undefined\n )[];\n\n specificationsProps?: {\n specification: AttributeValue;\n specificationClassName: string;\n specificationValues: {\n productSpecification: AttributeValue | undefined;\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[];\n }[];\n\n clearAllProductsFromComparison(): void;\n removeProductFromList?(itemId: string): void;\n handleScroll?(event: React.UIEvent<HTMLDivElement>): void;\n handleHoverIn?(itemId: string): () => void;\n handleHoverOut?(itemId: string): () => void;\n handlePreviousClick?(): void;\n handleNextClick?(): void;\n}\n\n/**\n * Represents the state of the product comparison component.\n */\nexport interface IProductComparisonState {\n productsData?: IProductComparisonItemData[];\n hoverStateLastUpdate?: number;\n hoveringCellItemId?: string;\n currentClickerPosition?: number;\n}\n\n/**\n * Represents the direction of product clicker.\n */\nexport enum ProductClickerDirections {\n left = 0,\n right = 1\n}\n\n/**\n * Represents the component which renders product comparison table.\n */\nexport class ProductComparison extends React.Component<IProductComparisonProps<IProductComparisonData>, IProductComparisonState> {\n public static readonly className: string = 'msc-product-comparison';\n\n public static readonly mainContainerClassName = `${ProductComparison.className}__main-container`;\n\n public static readonly containerClassName = `${ProductComparison.mainContainerClassName}__container`;\n\n public static readonly tableClassName = `${ProductComparison.containerClassName}__table`;\n\n public static readonly tableHeaderClassName = `${ProductComparison.tableClassName}__header`;\n\n public static readonly productRowClassName = `${ProductComparison.tableHeaderClassName}__product-row`;\n\n public static readonly tableClickerClassName = `${ProductComparison.tableClassName}__clicker`;\n\n public static readonly tableBodyClassName = `${ProductComparison.tableClassName}__body`;\n\n public static readonly tableRowClassName = `${ProductComparison.tableClassName}__row`;\n\n public static readonly dimensionsRowClassName = `${ProductComparison.tableBodyClassName}__dimensions-row`;\n\n public static readonly specificationsRowClassName = `${ProductComparison.tableBodyClassName}__specifications-row`;\n\n public static readonly tableRowContentClassName = `${ProductComparison.tableClassName}__row-content`;\n\n public static readonly tableHeaderCellClassName = `${ProductComparison.tableRowClassName}__header-cell`;\n\n public static readonly tableCellClassName = `${ProductComparison.tableRowClassName}__cell`;\n\n public static readonly actionBarClassName = `${ProductComparison.className}__action-bar`;\n\n public static readonly tableHeaderLockedClassName = `${ProductComparison.tableHeaderClassName}__locked`;\n\n public static readonly tableRowContentInformationClassName = `${ProductComparison.tableRowContentClassName}__information`;\n\n private readonly _tableReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableHeaderReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableBodyReference?: React.RefObject<HTMLDivElement>;\n\n private readonly _tableCellReference?: React.RefObject<HTMLDivElement>;\n\n private _shouldShowPreviousClicker?: boolean;\n\n private _shouldShowNextClicker?: boolean;\n\n private _hoveringCellItemId?: string;\n\n private readonly _instanceId: string;\n\n private static _getProductsSpecifications(products: IProductComparisonItemData[]): AttributeValue[] {\n const specifications = products.map(product => product.specifications?.specificationsList);\n const allSpecifications: AttributeValue[] = ArrayExtensions.flatten(specifications);\n\n const emptyAttributeValue = 0;\n const specificationNames = ArrayExtensions.validValues(\n allSpecifications\n .filter(specification => specification.AttributeValueId !== emptyAttributeValue)\n .map(specification => specification.Name)\n );\n const uniqueSpecificationNames = ArrayExtensions.unique(specificationNames);\n const uniqueSpecifications = ArrayExtensions.validValues(\n uniqueSpecificationNames.map(name => allSpecifications.find(specification => specification.Name === name))\n );\n\n return uniqueSpecifications;\n }\n\n private static _getProductsDimensions(products: IProductComparisonItemData[]): number[] {\n const dimensions = products.map(product => product.productInfo.Dimensions);\n const allDimensions: ProductDimension[] = ArrayExtensions.flatten(dimensions).filter(\n dimension => !ObjectExtensions.isNullOrUndefined(dimension.DimensionValue)\n );\n\n const dimensionIds = ArrayExtensions.validValues(allDimensions.map(dimension => dimension.DimensionTypeValue));\n const uniqueDimensionIds = ArrayExtensions.unique(dimensionIds);\n\n return uniqueDimensionIds;\n }\n\n private static _renderProductDescription(product?: SimpleProduct): React.ReactNode {\n if (StringExtensions.isNullOrWhitespace(product?.Description)) {\n return null;\n }\n return <p className={`${ProductComparison.className}__description`}>{product!.Description}</p>;\n }\n\n private static _getActionBarContainerProps(): INodeProps {\n return {\n className: ProductComparison.actionBarClassName\n };\n }\n\n public constructor(props: IProductComparisonProps<IProductComparisonData>) {\n super(props);\n\n this._instanceId = `${ProductComparison.className}-${this.props.id}-${Random.Guid.generateGuid()}`;\n\n this.state = {\n productsData: undefined,\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined,\n currentClickerPosition: 0\n };\n\n this._tableReference = React.createRef<HTMLDivElement>();\n this._tableHeaderReference = React.createRef<HTMLDivElement>();\n this._tableBodyReference = React.createRef<HTMLDivElement>();\n this._tableCellReference = React.createRef<HTMLDivElement>();\n }\n\n public componentDidMount(): void {\n this._loadProducts();\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).listModifiedEvent.subscribe(\n {\n instanceId: this._instanceId,\n\n /**\n * Updates the state in case the state for the particular product was changed.\n */\n handler: () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Initialize data downloading.\n this._loadProducts();\n }\n }\n );\n if (MsDyn365.isBrowser) {\n window.addEventListener('scroll', () => {\n this._configureBoxShadowOnScroll();\n });\n }\n this._configureBoxShadowOnScroll();\n }\n\n public componentWillUnmount(): void {\n ProductComparisonState.instance(\n this.props.context.request,\n this.props.data.accountInformation?.result\n ).listModifiedEvent.unsubscribe(this._instanceId);\n }\n\n public shouldComponentUpdate(\n nextProps: Readonly<IProductComparisonProps<IProductComparisonData>>,\n nextState: Readonly<IProductComparisonState>\n ): boolean {\n if (this.state.productsData !== nextState.productsData || this.props !== nextProps) {\n return true;\n }\n\n return (\n this.state.hoveringCellItemId !== nextState.hoveringCellItemId ||\n this.state.currentClickerPosition !== nextState.currentClickerPosition\n );\n }\n\n public render(): React.ReactNode | null {\n const viewProps: IProductComparisonViewProps = {\n ...this.props,\n moduleProps: {\n moduleProps: this.props,\n className: ProductComparison.className\n },\n clearAllProductsFromComparison: this._clearAllProductsFromComparison,\n isMainContentReady: false,\n isEmptyContent: false,\n heading: this._renderHeading(),\n loading: this._renderLoading(),\n clearAllButton: this._renderClearAllButton(),\n actionBarContainerProps: ProductComparison._getActionBarContainerProps(),\n previousClicker: this._renderPreviousClicker(),\n nextClicker: this._renderNextClicker(),\n backToShopping: this._renderBackToShoppingButton(),\n emptyComparison: (\n <div className={`${ProductComparison.className}__empty-container`}>{this.props.slots.emptyComparisonContentSlots}</div>\n )\n };\n\n const productsData = this.state.productsData ?? this._getProductComparisonDataByCatalogId(this.props.data.productsData?.result);\n if (productsData === undefined) {\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n const isConsentGiven = this.props.context.request.cookies.isConsentGiven();\n if (!isConsentGiven || !ArrayExtensions.hasElements(productsData)) {\n viewProps.isEmptyContent = true;\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n if (ArrayExtensions.hasElements(productsData)) {\n viewProps.productCountText = this.props.resources.productComparisonCountText.replace('{0}', productsData.length.toString());\n }\n\n this._checkClickersState();\n const productsMainInfoData = this._getProductsMainInfo(productsData);\n const allUniqueDimensionIds = this.getProductsDimensionsIds(productsData);\n const updatedDimensionProps: (\n | {\n dimensionId: number;\n dimensionName: string | undefined;\n dimensionClassName: string;\n productDimensionValues: {\n dimensionProps: { RecordId: number; Value: string; DimensionId: number; ImageUrl: string | undefined };\n productMainInfo: IProductComparisonProductMainInfo;\n node: JSX.Element;\n }[];\n }\n | undefined\n )[] = [];\n allUniqueDimensionIds?.map(dimension => {\n const dimensionValue = this.getUpdatedDimensionsProps(dimension, productsMainInfoData);\n updatedDimensionProps.push(dimensionValue);\n return updatedDimensionProps;\n });\n viewProps.isMainContentReady = true;\n viewProps.tableReference = this._tableReference;\n viewProps.tableHeaderReference = this._tableHeaderReference;\n viewProps.tableBodyReference = this._tableBodyReference;\n viewProps.tableCellReference = this._tableCellReference;\n viewProps.hoverStateLastUpdate = this.state.hoverStateLastUpdate;\n viewProps.hoveringCellItemId = this.state.hoveringCellItemId;\n viewProps.shouldShowPreviousClicker = this._shouldShowPreviousClicker;\n viewProps.shouldShowNextClicker = this._shouldShowNextClicker;\n viewProps.currentClickerPosition = this.state.currentClickerPosition;\n viewProps.handlePreviousClick = this._handlePreviousClick;\n viewProps.handleNextClick = this._handleNextClick;\n viewProps.handleScroll = this._handleScroll;\n viewProps.handleHoverIn = this._handleHoverIn;\n viewProps.handleHoverOut = this._handleHoverOut;\n viewProps.removeProductFromList = this._removeProductFromList;\n viewProps.productsMainInfo = productsMainInfoData;\n viewProps.uniqueDimensionIds = ProductComparison._getProductsDimensions(productsData);\n viewProps.dimensionsProps = updatedDimensionProps;\n viewProps.uniqueSpecifications = ProductComparison._getProductsSpecifications(productsData);\n viewProps.specificationsProps = this._getSpecificationProps(viewProps.uniqueSpecifications, viewProps.productsMainInfo);\n\n return this.props.renderView(viewProps) as React.ReactNode;\n }\n\n /**\n * Removes all product from the comparison list.\n */\n private readonly _clearAllProductsFromComparison = (): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).clearAll();\n this.setState({ productsData: [] });\n };\n\n /**\n * Configures box shadow on scroll.\n */\n private readonly _configureBoxShadowOnScroll = (): void => {\n const defaultValue = 0;\n if (this._tableReference?.current) {\n const comparisonProductCardHeader: HTMLCollectionOf<Element> = this._tableReference.current.getElementsByClassName(\n ProductComparison.tableHeaderClassName\n );\n if (ArrayExtensions.hasElements(Array.from(comparisonProductCardHeader))) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > defaultValue) {\n comparisonProductCardHeader[0].classList.add(ProductComparison.tableHeaderLockedClassName);\n } else {\n comparisonProductCardHeader[0].classList.remove(ProductComparison.tableHeaderLockedClassName);\n }\n }\n }\n };\n\n private _getProductComparisonDataByCatalogId(\n productData: IProductComparisonItemData[] | undefined\n ): IProductComparisonItemData[] | undefined {\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n const productByCatalogId = productData?.filter(product => product.catalogId === catalogId) ?? undefined;\n return productByCatalogId;\n }\n\n private async _loadProducts(): Promise<void> {\n const items = ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).items;\n const input = new GetProductsInProductComparisonInput(items);\n let productData: IProductComparisonItemData[] | undefined;\n await getProductsInProductComparisonAction(input, this.props.context.actionContext).then(item => {\n productData = item;\n });\n const productDataByCatalogId = this._getProductComparisonDataByCatalogId(productData);\n this.setState({ productsData: productDataByCatalogId });\n }\n\n /**\n * Handles scroll inside table.\n * Used to update header position accordingly to the scroll in table body.\n * @param event - Scroll event.\n */\n private readonly _handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n this._tableHeaderReference?.current?.scrollTo({ top: event.currentTarget.scrollTop, left: event.currentTarget.scrollLeft });\n this._checkClickersState();\n };\n\n /**\n * Handles product clicker click.\n * Used to update table scroll position accordingly to the clicker.\n * @param direction - Direction of scrolling.\n */\n private readonly _handleScrollClick = (direction: ProductClickerDirections) => {\n const tableBody = this._tableBodyReference?.current;\n if (!tableBody) {\n return;\n }\n\n let cellWidth = this._tableCellReference?.current?.clientWidth;\n if (cellWidth === undefined) {\n cellWidth = this._getCellWidth();\n }\n\n let newLeftPosition: number | undefined;\n const scrollPosition = Math.ceil(tableBody.scrollLeft);\n if (direction === ProductClickerDirections.left) {\n newLeftPosition = scrollPosition - cellWidth;\n const minLeftPosition = 0;\n newLeftPosition = Math.max(newLeftPosition, minLeftPosition);\n } else {\n const maxScroll = tableBody.scrollWidth - tableBody.clientWidth;\n newLeftPosition = scrollPosition + cellWidth;\n newLeftPosition = Math.min(newLeftPosition, maxScroll);\n }\n\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n newLeftPosition = -newLeftPosition;\n }\n\n tableBody.scrollTo({\n top: tableBody.scrollTop,\n left: newLeftPosition\n });\n\n this.setState(previousState => {\n if (previousState.currentClickerPosition === undefined) {\n return {};\n }\n let change = 1;\n if (direction === ProductClickerDirections.left) {\n change = -1;\n }\n return {\n currentClickerPosition: previousState.currentClickerPosition + change,\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined\n };\n });\n\n this._checkClickersState();\n };\n\n /**\n * Handles previous product click.\n * Used to update table scroll position accordingly to the clicker.\n */\n private readonly _handlePreviousClick = () => {\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n this._handleScrollClick(ProductClickerDirections.right);\n } else {\n this._handleScrollClick(ProductClickerDirections.left);\n }\n };\n\n /**\n * Handles next product click.\n * Used to update table scroll position accordingly to the clicker.\n */\n private readonly _handleNextClick = () => {\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n this._handleScrollClick(ProductClickerDirections.left);\n } else {\n this._handleScrollClick(ProductClickerDirections.right);\n }\n };\n\n /**\n * Get set width.\n */\n private readonly _getCellWidth = (): number => {\n const tableBody = this._tableBodyReference?.current;\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n let cellWidth: number = 400;\n\n if (viewport === 'xs' && tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 2;\n } else if ((viewport === 'sm' || viewport === 'md') && tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 3;\n } else {\n if (tableBody) {\n cellWidth = tableBody && tableBody.clientWidth / 4;\n }\n }\n\n cellWidth = Math.floor(cellWidth);\n\n return cellWidth;\n };\n\n /**\n * Updates clickers state.\n */\n private readonly _checkClickersState = () => {\n const tableBody = this._tableBodyReference?.current;\n if (!tableBody) {\n return;\n }\n\n const previousScrollMinLimit = 0;\n const maxScroll = tableBody.scrollWidth - tableBody.clientWidth;\n const scrollPosition = Math.ceil(tableBody.scrollLeft);\n\n if (MsDyn365.isBrowser && document.body.parentElement?.getAttribute('dir') === 'rtl') {\n if (scrollPosition <= previousScrollMinLimit) {\n if (this._shouldShowNextClicker) {\n this._shouldShowNextClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowNextClicker) {\n this._shouldShowNextClicker = true;\n this.forceUpdate();\n }\n\n if (scrollPosition >= maxScroll) {\n if (this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = true;\n this.forceUpdate();\n }\n } else {\n if (scrollPosition <= previousScrollMinLimit) {\n if (this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowPreviousClicker) {\n this._shouldShowPreviousClicker = true;\n this.forceUpdate();\n }\n\n if (scrollPosition >= maxScroll) {\n if (this._shouldShowNextClicker) {\n this._shouldShowNextClicker = false;\n this.forceUpdate();\n }\n } else if (!this._shouldShowNextClicker) {\n this._shouldShowNextClicker = true;\n this.forceUpdate();\n }\n }\n };\n\n /**\n * Removes the product from a list.\n * @param itemId - The id of a product to remove.\n */\n private readonly _removeProductFromList = (itemId: string): void => {\n ProductComparisonState.instance(this.props.context.request, this.props.data.accountInformation?.result).removeItemById(itemId);\n this.setState(previousState => {\n let newClickerPosition = previousState.currentClickerPosition;\n if (newClickerPosition && !this._shouldShowNextClicker && this._shouldShowPreviousClicker) {\n newClickerPosition -= 1;\n }\n return {\n productsData: previousState.productsData?.filter(item => item.itemId !== itemId),\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined,\n currentClickerPosition: newClickerPosition\n };\n });\n };\n\n /**\n * Prepares quick view component for the given product.\n * @param product - Product information.\n * @returns The quick view component or null if no quick view info is provided.\n */\n private _renderQuickView(product: IProductComparisonItemData): React.ReactNode | null {\n const quickViewSlot = ArrayExtensions.hasElements(this.props.slots.quickViews) ? this.props.slots.quickViews[0] : null;\n if (ObjectExtensions.isNullOrUndefined(quickViewSlot)) {\n return null;\n }\n\n const selectedDimensions = product.productInfo.Dimensions?.filter(dimension => dimension.DimensionValue?.Value);\n\n return React.cloneElement(quickViewSlot as React.ReactElement, {\n selectedProductId: product.productInfo.RecordId,\n selectedDimensions\n });\n }\n\n /**\n * Handles entering into hover mode.\n * @param itemId - Item id of the cell which is hovered.\n * @returns Event handler.\n */\n private readonly _handleHoverIn = (itemId: string) => () => {\n this._hoveringCellItemId = itemId;\n\n this.setState({\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: itemId\n });\n };\n\n /**\n * Handles exiting from the hover mode.\n * @param itemId - Item id of the cell which is hovered.\n * @returns Event handler.\n */\n private readonly _handleHoverOut = (itemId: string) => () => {\n if (this._hoveringCellItemId !== itemId) {\n return;\n }\n\n this._hoveringCellItemId = undefined;\n debounce(() => {\n this.setState({\n hoverStateLastUpdate: Date.now(),\n hoveringCellItemId: undefined\n });\n }, 10);\n };\n\n /**\n * Retrieves product image react node.\n * @param className - Class name to use.\n * @param product - Product info.\n * @returns React node.\n */\n private _renderProductImage(className: string, product?: SimpleProduct): React.ReactNode | undefined {\n const {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: {\n app: { OmniChannelMedia }\n }\n }\n } = this.props;\n\n if (ObjectExtensions.isNullOrUndefined(product)) {\n return undefined;\n }\n\n const defaultImageSettingsQ = 'w=140&h=140&m=6';\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: defaultImageSettingsQ, w: 0, h: 0 },\n lg: { q: defaultImageSettingsQ, w: 0, h: 0 },\n xl: { q: defaultImageSettingsQ, w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n <Image\n altText={product?.Name}\n key={product.Name}\n src={product.PrimaryImageUrl ?? ''}\n fallBackSrc={getFallbackImageUrl(product.ItemId, apiSettings, OmniChannelMedia) ?? ''}\n gridSettings={this.props.context.request.gridSettings!}\n imageSettings={defaultImageSettings}\n loadFailureBehavior='empty'\n className={className}\n requestContext={this.props.context.actionContext.requestContext}\n />\n );\n }\n\n private _getTableHeaderProps(itemId: string): INodeProps {\n const isHoverModeEnabled = this.state.hoveringCellItemId === itemId;\n let headerClassName = ProductComparison.tableHeaderCellClassName;\n if (isHoverModeEnabled) {\n headerClassName = classnames(headerClassName, 'msc-product-comparison__cell-hover');\n }\n return {\n className: headerClassName,\n key: `${headerClassName}__product-${itemId}-${this.state.hoveringCellItemId}-${this.state.currentClickerPosition}`,\n onMouseEnter: this._handleHoverIn(itemId),\n onMouseLeave: this._handleHoverOut(itemId)\n };\n }\n\n private _getTableCellProps(itemId: string): INodeProps {\n const isHoverModeEnabled = this.state.hoveringCellItemId === itemId;\n let cellClassName = ProductComparison.tableCellClassName;\n if (isHoverModeEnabled) {\n cellClassName = classnames(cellClassName, 'msc-product-comparison__cell-hover');\n }\n return {\n className: cellClassName,\n key: `${cellClassName}__product-${itemId}-${this.state.hoveringCellItemId}`,\n onMouseEnter: this._handleHoverIn(itemId),\n onMouseLeave: this._handleHoverOut(itemId),\n role: 'menuitem',\n tabIndex: 0\n };\n }\n\n private _renderProductRating(rating?: RatingsSummary): React.ReactNode {\n if (ObjectExtensions.isNullOrUndefined(rating?.averageRating)) {\n return null;\n }\n\n const ratingValue = rating!;\n\n const defaultReviewsCount = 0;\n\n return (\n <RatingComponent\n avgRating={ratingValue.averageRating!}\n readOnly\n ariaLabel={format(this.props.resources.productComparisonProductItemRatingAriaLabel, ratingValue.averageRating, '5')}\n ratingCount={`${ratingValue.reviewsCount ?? defaultReviewsCount}`}\n shouldShowFullRatingDescription\n data={{}}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n />\n );\n }\n\n private _renderBackToShoppingButton() {\n return (\n <Button\n className='msc-product-comparison__back-button'\n {...this.props.telemetry}\n role='button'\n href='#'\n onClick={this._goBack}\n title={this.props.resources.backToShoppingLabel}\n >\n {this.props.resources.backToShoppingLabel}\n </Button>\n );\n }\n\n private readonly _goBack = (): void => {\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n if (document.referrer === '') {\n window.location.href = backToShoppingUrl;\n } else {\n window.history.back();\n }\n };\n\n /**\n * Retrieves localized text for dimension.\n * @param dimensionId - Dimension id.\n * @returns Localized text.\n */\n private _getDimensionName(dimensionId: number): string | undefined {\n if (dimensionId === ProductDimensionType.Color) {\n return this.props.resources.productComparisonProductItemColorDimension;\n }\n if (dimensionId === ProductDimensionType.Size) {\n return this.props.resources.productComparisonProductItemSizeDimension;\n }\n\n if (dimensionId === ProductDimensionType.Style) {\n return this.props.resources.productComparisonProductItemStyleDimension;\n }\n return undefined;\n }\n\n private getUpdatedDimensionsProps(dimensionId: number, products: IProductComparisonProductMainInfo[]) {\n const dimensionClassName = `${ProductComparison.dimensionsRowClassName}__dimension-${dimensionId}`;\n const dimensionDescription = this._getDimensionName(dimensionId);\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimensionId);\n let dimensionSelectionType = SelectionType.text;\n\n const dimensionsAsSwatchConfiguration: DimensionTypes[] | undefined = this.props.context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsAsSwatchConfiguration) &&\n !dimensionsAsSwatchConfiguration?.includes(DimensionTypes.none) &&\n dimensionsAsSwatchConfiguration?.includes(dimensionName)\n ) {\n dimensionSelectionType = SelectionType.swatch;\n }\n\n const productDimensionValues = products.map(productMainInfo => {\n let dimension: IDimensionResult[] = [];\n let textValue: string = '';\n let renderSwatch: JSX.Element | undefined;\n this.props.data.productsData?.result?.map(productsDimension => {\n if (productsDimension.productInfo.RecordId === productMainInfo.product.productInfo.RecordId) {\n dimension = productsDimension.dimensions?.dimensions ?? [];\n }\n return dimension;\n });\n\n if (dimensionSelectionType === SelectionType.swatch) {\n renderSwatch = (\n <div className='msc-product__dimensions'>\n {dimension.map(dimensionItems => {\n return (\n <div\n className='msc-product__dimensions-item'\n key={`msc-product__dimensions-item-${productMainInfo.product.itemId}`}\n >\n {dimensionItems.result.map(dimensionItem => {\n let currentDimensionId: number | undefined;\n const swatches =\n dimensionItem.map<ISwatchItem>(swatchItem => {\n let isDefaultDimension: boolean = false;\n const selectedDimensions = productMainInfo.product.productInfo.Dimensions?.filter(\n item => item.DimensionTypeValue === swatchItem.DimensionTypeValue\n );\n selectedDimensions?.map(selectedDimension => {\n if (\n selectedDimension.DimensionValue !== undefined &&\n selectedDimension.DimensionValue.DimensionId ===\n swatchItem.DimensionValue?.DimensionId\n ) {\n isDefaultDimension = true;\n }\n return isDefaultDimension;\n });\n\n if (swatchItem.DimensionTypeValue === dimensionId) {\n currentDimensionId = swatchItem.DimensionTypeValue;\n }\n const dimensionType = dimensionName;\n return {\n itemId: `${swatchItem.DimensionValue?.RecordId ?? ''}-${swatchItem.DimensionValue\n ?.Value ?? ''}`,\n value: swatchItem.DimensionValue?.Value ?? '',\n dimensionType,\n colorHexCode: swatchItem.DimensionValue?.ColorHexCode,\n imageUrl: swatchItem.DimensionValue?.ImageUrl,\n isDefault: isDefaultDimension\n };\n }) ?? [];\n if (currentDimensionId && currentDimensionId === dimensionId) {\n return (\n <SwatchComponent\n key={dimensionId}\n apiSettings={this.props.context.request.apiSettings}\n list={swatches}\n isSelectionEnabled={false}\n />\n );\n }\n return null;\n })}\n </div>\n );\n })}\n </div>\n );\n }\n\n if (dimensionSelectionType === SelectionType.text) {\n dimension.map(item => {\n return item.result.map(items => {\n return items.map(dimensionItem => {\n if (dimensionItem.DimensionTypeValue === dimensionId) {\n const productDimensionSeperatorValue =\n textValue !== ''\n ? this.props.resources.productDimensionSeparator\n : this.props.resources.productDimensionSeparator.replace('/', '');\n textValue = textValue + format(productDimensionSeperatorValue, dimensionItem.DimensionValue?.Value ?? '');\n }\n return textValue;\n });\n });\n });\n }\n\n const dimensionProps = {\n RecordId: productMainInfo.product.productInfo.RecordId,\n Value: textValue,\n DimensionId: dimensionId,\n ImageUrl: productMainInfo.product.productInfo.PrimaryImageUrl\n };\n\n return {\n dimensionProps,\n productMainInfo,\n node: (\n <div key={`${productMainInfo.product.itemId}-${dimensionClassName}`}>\n {dimensionSelectionType === SelectionType.swatch ? renderSwatch : dimensionProps.Value}\n </div>\n )\n };\n });\n return {\n dimensionId,\n dimensionName: dimensionDescription,\n dimensionClassName,\n productDimensionValues\n };\n }\n private _getSpecificationProps(specifications: AttributeValue[], products: IProductComparisonProductMainInfo[]) {\n return specifications.map(specification => {\n const specificationClassName = `${ProductComparison.specificationsRowClassName}__specification-${specification.Name!}`;\n\n const specificationValues = products.map(productMainInfo => {\n const productSpecification = productMainInfo.product.specifications?.specificationsList.find(\n productSpecifications => productSpecifications.Name === specification.Name\n );\n\n return {\n productSpecification,\n productMainInfo,\n node: (\n <div key={`${productMainInfo.product.itemId}-${specificationClassName}`}>\n <ProductSpecification\n specification={productSpecification}\n telemetry={this.props.telemetry}\n context={this.props.context}\n resources={this.props.resources}\n />\n </div>\n )\n };\n });\n\n return {\n specification,\n specificationClassName,\n specificationValues\n };\n });\n }\n\n private _renderHeading(): React.ReactNode {\n return <Heading className={`${ProductComparison.className}__header`} text={this.props.resources.productComparisonTitle} />;\n }\n\n private _renderLoading(): React.ReactNode {\n return <div className={`${ProductComparison.className}__loading`}>{this.props.resources.productComparisonLoadingText}</div>;\n }\n\n private _renderClearAllButton(): React.ReactNode {\n return (\n <Button\n className={`${ProductComparison.actionBarClassName}__clear-all-button`}\n aria-label={this.props.resources.productComparisonClearAllButtonAriaLabel}\n onClick={this._clearAllProductsFromComparison}\n >\n {this.props.resources.productComparisonClearAllButtonText}\n </Button>\n );\n }\n\n /**\n * Retrieves unique dimension ids of product.\n * @param products - Product.\n * @returns Unique dimension ids.\n */\n private getProductsDimensionsIds(products: IProductComparisonItemData[]): number[] {\n const dimensions = products.map(product => product.productInfo.Dimensions);\n const allDimensions: ProductDimension[] = ArrayExtensions.flatten(dimensions);\n\n const dimensionIds = ArrayExtensions.validValues(allDimensions.map(dimension => dimension.DimensionTypeValue));\n const uniqueDimensionIds = ArrayExtensions.unique(dimensionIds);\n\n return uniqueDimensionIds;\n }\n\n private _renderPreviousClicker(): React.ReactNode {\n return (\n <Button\n className={classnames(ProductComparison.tableClickerClassName, `${ProductComparison.tableClickerClassName}__previous`)}\n role='button'\n onClick={this._handlePreviousClick}\n onKeyUp={this._handlePreviousClick}\n >\n <span className={`${ProductComparison.tableClickerClassName}__previous__icon`} aria-hidden='true' />\n <span className='screen-reader-only'>{this.props.resources.productComparisonPreviousProduct}</span>\n </Button>\n );\n }\n\n private _renderNextClicker(): React.ReactNode {\n return (\n <Button\n className={classnames(ProductComparison.tableClickerClassName, `${ProductComparison.tableClickerClassName}__next`)}\n role='button'\n onClick={this._handleNextClick}\n onKeyUp={this._handleNextClick}\n >\n <span className={`${ProductComparison.tableClickerClassName}__next__icon`} aria-hidden='true' />\n <span className='screen-reader-only'>{this.props.resources.productComparisonNextProduct}</span>\n </Button>\n );\n }\n\n private _renderRemoveFromComparisonButton(itemId: string): React.ReactNode {\n return (\n <RemoveFromComparisonButtonComponent\n className={`${ProductComparison.productRowClassName}__remove`}\n key={itemId}\n resources={this.props.resources}\n itemId={itemId}\n onClickHandler={this._removeProductFromList}\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n );\n }\n\n private _getProductsMainInfo(products: IProductComparisonItemData[]): IProductComparisonProductMainInfo[] {\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n return products.map(product => {\n let productUrlLink: string | undefined;\n if (msdyn365Commerce.isBrowser) {\n const productUrl = getProductUrlSync(product.productInfo, this.props.context.actionContext);\n const fullUrl = new URL(productUrl, window.location.href);\n if (isChannelTypeB2B(this.props.context.actionContext.requestContext)) {\n fullUrl.searchParams.set('catalogid', `${product.catalogId}`);\n }\n product.productInfo.Dimensions?.map(dimension => {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n });\n productUrlLink = fullUrl.href;\n }\n const isHoverModeEnabled = this.state.hoveringCellItemId === product.itemId;\n let cellClassName = ProductComparison.tableHeaderCellClassName;\n if (isHoverModeEnabled) {\n cellClassName = classnames(cellClassName, 'msc-product-comparison__cell-hover');\n }\n const isFromCurrentCatalog = product.catalogId === currentCatalogId;\n\n const productImageContainerClassName = `${ProductComparison.productRowClassName}__product-image-container`;\n const productImageClassName = `${productImageContainerClassName}__product-image`;\n const productNameClassName = `${ProductComparison.productRowClassName}__product-name`;\n const productPriceClassName = `${ProductComparison.productRowClassName}__product-price`;\n const cellNewWidth = this._getCellWidth();\n const style = {\n width: `${cellNewWidth}px`,\n minWidth: `${cellNewWidth}px`,\n maxWidth: `${cellNewWidth}px`\n };\n return {\n cellContainerProps: {\n className: cellClassName,\n key: product.itemId,\n ref: this._tableCellReference,\n onMouseEnter: this._handleHoverIn(product.itemId),\n onMouseLeave: this._handleHoverOut(product.itemId),\n role: 'menuitem',\n tabIndex: 0,\n style: style\n },\n product,\n productUrl: productUrlLink,\n removeFromComparisonButton: this._renderRemoveFromComparisonButton(product.itemId),\n productImage: (\n <div className={productImageContainerClassName} key={product.itemId}>\n {this._renderProductImage(productImageClassName, product.productInfo)}\n </div>\n ),\n productLink: (\n <a className={productNameClassName} href={productUrlLink} key={product.itemId}>\n {product.productInfo.Name}\n </a>\n ),\n productPrice: (\n <div className={productPriceClassName} key={product.itemId}>\n {product.price && (\n <PriceComponent\n context={this.props.context}\n id={this.props.id}\n typeName={this.props.typeName}\n data={{ price: product.price }}\n freePriceText={this.props.resources.productComparisonProductItemFreePrice}\n originalPriceText={this.props.resources.productComparisonProductItemOriginalPrice}\n currentPriceText={this.props.resources.productComparisonProductItemCurrentPrice}\n />\n )}\n </div>\n ),\n quickView: this._renderQuickView(product),\n isFromCurrentCatalog,\n goToProductDetailsButton: (\n <Button href={productUrlLink} title={this.props.resources.productComparisonGoToProductDetailsButtonText}>\n {this.props.resources.productComparisonGoToProductDetailsButtonText}\n </Button>\n ),\n tableCellProps: this._getTableCellProps(product.itemId),\n tableHeaderProps: this._getTableHeaderProps(product.itemId),\n productRating:\n product.rating !== undefined ? <div key={product.itemId}>{this._renderProductRating(product.rating)}</div> : undefined,\n productDescription:\n product.productInfo !== undefined ? (\n <div key={product.itemId}>{ProductComparison._renderProductDescription(product.productInfo)}</div>\n ) : (\n undefined\n )\n };\n });\n }\n}\n\nexport default ProductComparison;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport msdyn365Commerce from '@msdyn365-commerce/core';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { IProductComparisonProductMainInfo, IProductComparisonViewProps, ProductComparison } from './product-comparison';\n\n/**\n * Renders dynamic header values.\n * @param values - cd..info.\n * @param headerName - Header Name.\n * @returns List of react nodes.\n */\nconst renderDynamicHeaderCells = (\n values: {\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[],\n headerName: string,\n currentClickerPosition?: number\n) => {\n return values.map((value, index) => {\n if (index === currentClickerPosition) {\n return (\n <Node\n key={value.productMainInfo.tableHeaderProps.key}\n {...value.productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={value.productMainInfo.cellContainerProps.style}\n >\n {headerName}\n </Node>\n );\n }\n return <Node key={index} {...value.productMainInfo.tableHeaderProps} style={value.productMainInfo.cellContainerProps.style}></Node>;\n });\n};\n\n/**\n * Renders dynamic cell values.\n * @param values - Cells info.\n * @param hoveringCellItemId - Currently hovered cell.\n * @returns List of react nodes.\n */\nconst renderDynamicCells = (\n values: {\n productMainInfo: IProductComparisonProductMainInfo;\n node: React.ReactNode;\n }[],\n hoveringCellItemId: string\n) => {\n return values.map(value => {\n return (\n <Node\n {...value.productMainInfo.tableCellProps}\n key={`${value.productMainInfo.product.itemId}-${hoveringCellItemId}`}\n style={value.productMainInfo.cellContainerProps.style}\n >\n {value.node}\n </Node>\n );\n });\n};\n/**\n * Represents product comparison view.\n * @param props - View props for product comparison.\n * @returns Functional component of product comparison.\n */\nexport const ProductComparisonViewFunctionalComponent: React.FC<IProductComparisonViewProps> = props => {\n return (\n <Module {...props.moduleProps}>\n {props.backToShopping}\n {props.heading}\n <Node className={`${ProductComparison.className}__product_count_text`}>{props.productCountText}</Node>\n {props.isEmptyContent || props.isMainContentReady ? undefined : props.loading}\n {props.isEmptyContent ? props.emptyComparison : undefined}\n <Node {...props.actionBarContainerProps}>\n {!props.isEmptyContent && props.isMainContentReady ? props.clearAllButton : undefined}\n </Node>\n {props.isMainContentReady ? (\n <Node className={ProductComparison.mainContainerClassName}>\n <Node className={ProductComparison.containerClassName}>\n <Node className={ProductComparison.tableClassName} ref={props.tableReference}>\n <Node className={`${ProductComparison.tableHeaderClassName}`}>\n <Node\n className={`${ProductComparison.tableHeaderClassName}__header__container`}\n ref={props.tableHeaderReference}\n >\n {props.shouldShowPreviousClicker && props.previousClicker}\n <Node\n className={classnames(\n ProductComparison.tableRowClassName,\n `${ProductComparison.tableHeaderClassName}__product-row`\n )}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n const isFromCurrentCatalog = productMainInfo.isFromCurrentCatalog;\n const actionsClassName = `${ProductComparison.productRowClassName}__actions`;\n return (\n <Node\n {...productMainInfo.cellContainerProps}\n key={productMainInfo.cellContainerProps.key as string}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.removeFromComparisonButton}\n {productMainInfo.productImage}\n {msdyn365Commerce.isBrowser ? productMainInfo.productLink : undefined}\n {productMainInfo.productPrice}\n <Node className={actionsClassName} key={productMainInfo.product.itemId}>\n {isFromCurrentCatalog\n ? productMainInfo.quickView\n : productMainInfo.goToProductDetailsButton}\n </Node>\n </Node>\n );\n })}\n </Node>\n {props.shouldShowNextClicker && props.nextClicker}\n </Node>\n </Node>\n <Node\n className={ProductComparison.tableBodyClassName}\n onScroll={props.handleScroll}\n ref={props.tableBodyReference}\n >\n {props.productsMainInfo?.map((rating, key) => {\n return rating.productRating !== undefined && key === 0 ? (\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__rating-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`rating-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemRating}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='none'\n tabindex='-1'\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.productRating}\n </Node>\n );\n })}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n {props.productsMainInfo?.map((description, key) => {\n return description.productDescription !== undefined && key === 0 ? (\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__description-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`description-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemDescription}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='none'\n tabindex='-1'\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.productDescription}\n </Node>\n );\n })}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n {props.dimensionsProps?.map(dimensionProps => {\n return (\n dimensionProps?.dimensionName && (\n <Node\n className={classnames(\n ProductComparison.dimensionsRowClassName,\n ProductComparison.tableRowClassName,\n dimensionProps.dimensionClassName\n )}\n key={dimensionProps.dimensionClassName}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`${dimensionProps.dimensionName}-${props.currentClickerPosition}`}\n role='menu'\n >\n {renderDynamicHeaderCells(\n dimensionProps.productDimensionValues,\n dimensionProps.dimensionName,\n props.currentClickerPosition\n )}\n </Node>\n\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {renderDynamicCells(dimensionProps.productDimensionValues, props.hoveringCellItemId!)}\n </Node>\n </Node>\n )\n );\n })}\n {props.specificationsProps?.map(specificationProps => {\n return StringExtensions.isNullOrEmpty(specificationProps.specification.TextValue) === false ? (\n <Node\n className={classnames(\n ProductComparison.specificationsRowClassName,\n ProductComparison.tableRowClassName,\n specificationProps.specificationClassName\n )}\n key={specificationProps.specificationClassName}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`${specificationProps.specification.Name}-${props.currentClickerPosition}`}\n role='menu'\n >\n {renderDynamicHeaderCells(\n specificationProps.specificationValues,\n specificationProps.specification.Name!,\n props.currentClickerPosition\n )}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {renderDynamicCells(specificationProps.specificationValues, props.hoveringCellItemId!)}\n </Node>\n </Node>\n ) : (\n undefined\n );\n })}\n <Node\n className={classnames(\n `${ProductComparison.tableBodyClassName}__sku-row`,\n ProductComparison.tableRowClassName\n )}\n >\n <Node\n className={ProductComparison.tableRowContentClassName}\n key={`sku-${props.currentClickerPosition}`}\n role='menu'\n >\n {props.productsMainInfo?.map((productMainInfo, index) => {\n if (index === props.currentClickerPosition) {\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n role='menuitem'\n tabindex='0'\n style={productMainInfo.cellContainerProps.style}\n >\n {props.resources.productComparisonProductItemSku}\n </Node>\n );\n }\n return (\n <Node\n key={productMainInfo.tableHeaderProps.key}\n {...productMainInfo.tableHeaderProps}\n style={productMainInfo.cellContainerProps.style}\n ></Node>\n );\n })}\n </Node>\n <Node\n className={`${ProductComparison.tableRowContentClassName} ${ProductComparison.tableRowContentInformationClassName}`}\n role='menu'\n >\n {props.productsMainInfo?.map(productMainInfo => {\n return (\n <Node\n {...productMainInfo.tableCellProps}\n key={`${productMainInfo.product.itemId}-${props.hoveringCellItemId!}`}\n style={productMainInfo.cellContainerProps.style}\n >\n {productMainInfo.product.productInfo.ItemId}\n </Node>\n );\n })}\n </Node>\n </Node>\n </Node>\n </Node>\n </Node>\n </Node>\n ) : (\n undefined\n )}\n </Module>\n );\n};\n\nexport default ProductComparisonViewFunctionalComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n}\n\nexport const PromoBannerCloseButton: React.FC<IPromoBannerCloseButton> = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n <button className='ms-promo-banner__close-button' aria-label={closeButtonAriaLabel} onClick={onClose} {...attributes}>\n <span className='ms-promo-banner__close-button__label' aria-hidden>\n {label}\n </span>\n </button>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC<IPromoBannerLinks> = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n <span className='ms-promo-banner__links'>\n {editableLinks && editableLinks.length > 0 ? (\n <Msdyn365.Links links={editableLinks} editProps={{ onTextChange, requestContext }} />\n ) : null}\n </span>\n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC<IPromoBannerText> = ({ text, onTextChange, requestContext }) => {\n return <Msdyn365.Text className='ms-promo-banner__text' tag='span' text={text} editProps={{ onEdit: onTextChange, requestContext }} />;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent<IPromoBannerProps<IPromoBannerState>>}\n */\nclass PromoBanner extends React.PureComponent<IPromoBannerProps<{}>, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText, bannerAriaLabel } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: {\n className: classnames('ms-promo-banner', className),\n moduleProps: this.props,\n role: 'banner',\n 'aria-label': bannerAriaLabel\n },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && (\n <PromoBannerCloseButton\n {...{\n onClose: this._onDismiss,\n label: closeButtonLabel,\n closeButtonAriaLabel,\n telemetryContent: this.telemetryContent\n }}\n />\n )\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem()\n ? this.props.config.bannerMessages\n ? this.props.config.bannerMessages.length - 1\n : 0\n : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () =>\n this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC<IPromoBannerViewProps> = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides =\n bannerMessages &&\n bannerMessages.map((message, index) => {\n return (\n <Node {...contentProps} key={index} aria-live='off' role='marquee'>\n <span className='sr-only'>{promoBannerText}</span>\n {message.text && <Node {...promoBannerTextProps} text={message.text} onClick={handleText} />}\n {message.links && message.links.length > 0 && (\n <Node {...promoBannerLinksProps} links={message.links} onClick={handleLinks} />\n )}\n </Node>\n );\n });\n\n return (\n <Module {...promoBannerProps}>\n <Node {...carouselProps} items={slides} />\n {closeButton}\n </Module>\n );\n};\nexport default PromoBannerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartComponent, IAddToCartResources, OrderDetailsProduct } from '@msdyn365-commerce/components';\nimport { getUrlSync, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { SalesLine } from '@msdyn365-commerce/retail-proxy';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport React from 'react';\n\n/**\n * The data on which the component should operate.\n */\nexport interface IAddToCartSelectedData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * The resources needed to render a buy selected component.\n */\nexport interface IAddToCartSelectedResources {\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n}\n\n/**\n * Configuration of a buy selected component.\n */\nexport interface IAddToCartSelectedProps extends IComponentProps<IAddToCartSelectedData> {\n className: string;\n context: ICoreContext;\n\n resources: IAddToCartSelectedResources;\n\n isIcon?: boolean;\n}\n\n/**\n * Get the dialog strings.\n * @param props - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getDialogStrings = (props: IAddToCartSelectedProps): IAddToCartResources => {\n return {\n goToCartText: props.resources.quickOrderGridGoToCartText ?? '',\n continueShoppingText: props.resources.quickOrderGridDialogCloseText ?? '',\n closeNotificationLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? '',\n headerItemOneText: props.resources.quickOrderGridSingleItemText ?? '',\n headerItemFormatText: props.resources.quickOrderGridMultiLineItemFormatText ?? '',\n headerLinesFormatText: props.resources.quickOrderGridMultiLinesFormatText ?? '',\n headerMessageText: props.resources.quickOrderGridHeaderMessageText ?? '',\n freePriceText: props.resources.freePriceText ?? '',\n originalPriceText: props.resources.originalPriceText ?? '',\n currentPriceText: props.resources.currentPriceText ?? '',\n addedQuantityText: props.resources.addedQuantityText ?? '',\n buyAgainNotificationTitle: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationTitle ?? '',\n buyAgainNotificationCloseAriaLabel: props.resources.quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel ?? ''\n };\n};\n\n/**\n * Get the dialog strings.\n * @param quickOrder - The buy selected props.\n * @returns The add to cart resources.\n */\nexport const getOrderDetails = (quickOrder: QuickOrderTemplate): OrderDetailsProduct[] => {\n const orderDetails: OrderDetailsProduct[] = [];\n for (const quickLine of quickOrder.quickOrderTemplateLines) {\n const quantity = quickLine.productListLine.Quantity;\n const salesLine: SalesLine = {\n Quantity: quantity\n };\n const products = new OrderDetailsProduct(salesLine, quickLine.fullProduct?.ProductDetails);\n orderDetails.push(products);\n }\n return orderDetails;\n};\n\n/**\n * Renders a button which adds given products to the cart.\n * @param props - Configuration of the component.\n * @returns A react element or null if no products were given.\n */\nexport const AddToCartProductListComponent: React.FC<IAddToCartSelectedProps> = (props: IAddToCartSelectedProps): JSX.Element | null => {\n const {\n data: { quickOrderTemplate }\n } = props;\n\n if (quickOrderTemplate?.quickOrderTemplateLines[0].fullProduct?.ProductDetails === undefined) {\n return null;\n }\n const quantity = quickOrderTemplate.quickOrderTemplateLines[0].productListLine.Quantity;\n const buttonLabel = props.resources.quickOrderGridBuySelectedButtonText;\n const buttonAriaLabel = props.resources.quickOrderGridBuySelectedButtonAriaLabel;\n const dialogStrings: IAddToCartResources = getDialogStrings(props);\n const shouldSkipSiteSettings: boolean = true;\n const orderDetailProducts = getOrderDetails(quickOrderTemplate);\n return (\n <AddToCartComponent\n addToCartText={buttonLabel ?? ''}\n outOfStockText=''\n addToCartArialLabel={buttonAriaLabel}\n quantity={quantity}\n id={props.id}\n typeName={props.typeName}\n className={props.className}\n navigationUrl={getUrlSync('cart', props.context.actionContext)}\n data={{ product: quickOrderTemplate.quickOrderTemplateLines[0].fullProduct?.ProductDetails }}\n context={props.context}\n dialogStrings={dialogStrings}\n shouldSkipSiteSettings={shouldSkipSiteSettings}\n orderDetailsProducts={orderDetailProducts}\n />\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { QuickOrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { AddToCartProductListComponent } from './add-to-list';\nimport { IQuickOrderGridActionsViewProps } from './utilities';\n\n/**\n * Interface for quick order grid action data.\n */\nexport interface IQuickOrderGridActionsData {\n quickOrderTemplate: QuickOrderTemplate | undefined;\n}\n\n/**\n * Interface for quick order grid action props.\n */\nexport interface IQuickOrderGridActionsProps extends IComponentProps<IQuickOrderGridActionsData> {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n moduleClassName: string;\n typeName: string;\n handlers: {\n removeProductList(productListId: string): void;\n };\n resources: {\n quickOrderGridDeleteButtonText: string;\n quickOrderGridBuySelectedButtonText?: string;\n quickOrderGridBuySelectedButtonAriaLabel?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle?: string;\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel?: string;\n quickOrderGridGoToCartText?: string;\n quickOrderGridDialogCloseText?: string;\n quickOrderGridSingleItemText?: string;\n quickOrderGridMultiLineItemFormatText?: string;\n quickOrderGridMultiLinesFormatText?: string;\n quickOrderGridHeaderMessageText?: string;\n addedQuantityText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n freePriceText?: string;\n };\n}\n\n/**\n * Remove ProductList Action.\n * @param props -Quick order grid action props.\n */\nconst removeQuickOrderList = (props: IQuickOrderGridActionsProps): void => {\n const {\n data: { quickOrderTemplate },\n handlers\n } = props;\n const { removeProductList } = handlers;\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- Need to check data.\n if (quickOrderTemplate && quickOrderTemplate.productList.Id) {\n removeProductList(quickOrderTemplate.productList.Id);\n }\n};\n\n/**\n * Get Addtobag Button.\n * @param props -Order template action props.\n * @returns QuickOrderGrid actions view props.\n */\nconst getQuickOrderGridAddToCartDialog = (props: IQuickOrderGridActionsProps): React.ReactNode => {\n const {\n data: { quickOrderTemplate },\n context,\n moduleClassName,\n resources,\n typeName\n } = props;\n const buttonId = 'quick-order-grid';\n return (\n <AddToCartProductListComponent\n className={`${moduleClassName}-action-bar__buy-selected msc-btn`}\n id={buttonId}\n typeName={typeName}\n data={{ quickOrderTemplate }}\n context={context}\n resources={resources}\n />\n );\n};\n\n/**\n * Remove Quick order grid action.\n * @param props -Quick order grid action props.\n * @returns Remove order template.\n */\nconst removeActionHandler = (props: IQuickOrderGridActionsProps) => () => {\n removeQuickOrderList(props);\n};\n\n/**\n * Quick order grid action view.\n * @param props -Quick Order Grid template action props.\n * @returns QuickOrderGrid actions view props.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name needs to be this.\nexport const QuickOrderGridActionsView = (props: IQuickOrderGridActionsProps): IQuickOrderGridActionsViewProps => {\n const { moduleClassName, resources } = props;\n const { quickOrderGridDeleteButtonText } = resources;\n\n return {\n addProductListToBag: getQuickOrderGridAddToCartDialog(props),\n removeProductList: (\n <Button className={`${moduleClassName}-action-bar__delete-list-button`} onClick={removeActionHandler(props)}>\n {quickOrderGridDeleteButtonText}\n </Button>\n )\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, Collapse, ICollapseProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IQuickOrderGridDrawerProps } from './quick-order-grid-drawer-props';\n\n/**\n * Interface for drawer state.\n */\nexport interface IQuickOrderGridDrawerState {\n isOpen: boolean;\n}\n\n/**\n * Placement of glyph.\n */\nexport type GlyphPlacement = 'start' | 'end';\n\n/**\n * Quick Order Grid Drawer - This is a full width uncontrolled collapse where the button glyph changes\n * when the drawer is open and closed.\n */\nexport class QuickOrderGridDrawer extends React.Component<IQuickOrderGridDrawerProps, IQuickOrderGridDrawerState> {\n private readonly _drawerOpenGlyph: string;\n\n private readonly _drawerCloseGlyph: string;\n\n private readonly _drawerGlyphClass: string;\n\n private _isManuallyToggled: boolean;\n\n public constructor(props: IQuickOrderGridDrawerProps) {\n super(props);\n this._isManuallyToggled = false;\n this.state = { isOpen: props.collapseProps?.isOpen ?? false };\n this._drawerGlyphClass = classnames('drawer__glyph', this.props.toggleGlyphClassName ? this.props.toggleGlyphClassName : '');\n const closeGlyph = this.props.closeGlyph ? this.props.closeGlyph : '';\n if (this.props.isAnimateGlyph) {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : closeGlyph);\n this._drawerCloseGlyph = this._drawerOpenGlyph;\n } else {\n this._drawerOpenGlyph = classnames(this._drawerGlyphClass, this.props.openGlyph ? this.props.openGlyph : '');\n this._drawerCloseGlyph = classnames(this._drawerGlyphClass, closeGlyph);\n }\n }\n\n /**\n * Method to call on click of drawer button.\n * @param event - Product DeliveryOption List.\n */\n public toggle = (event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>): void => {\n event.preventDefault();\n this._isManuallyToggled = true;\n if (this.props.onToggle) {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n this.props.onToggle(this.state);\n } else {\n this.setState(previousState => ({ isOpen: !previousState.isOpen }));\n }\n };\n\n public shouldComponentUpdate(nextProps: IQuickOrderGridDrawerProps, nextState: IQuickOrderGridDrawerState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const collapseProps: ICollapseProps = { ...this.props.collapseProps };\n\n // If the drawer is manually toggled by pressing the button, then we use the internal state\n if (collapseProps.isOpen === undefined || this._isManuallyToggled) {\n collapseProps.isOpen = this.state.isOpen;\n }\n collapseProps.children = this.props.children;\n const drawerClass = classnames('drawer', this.props.className);\n const drawerButtonClassName = `${this.props.className ? this.props.className : ''}__button`;\n this._isManuallyToggled = false;\n return (\n <div className={drawerClass}>\n <Button\n {...this.props.toggleButtonProps}\n onClick={this.toggle}\n aria-expanded={collapseProps.isOpen}\n block\n disabled={this.props.isDisabled}\n className={drawerButtonClassName}\n color='secondary'\n >\n {this._generateDrawerButtonInnerMarkup(collapseProps.isOpen, drawerClass)}\n </Button>\n <Collapse {...collapseProps} />\n </div>\n );\n }\n\n private _generateDrawerButtonInnerMarkup(isCollapseState: boolean, drawerClass: string): JSX.Element {\n const drawerButtonTextClass = classnames(\n 'drawer__buttontext',\n this.props.toggleButtonClassName ? this.props.toggleButtonClassName : ''\n );\n const headingDrawerClass = `${drawerClass}-heading`;\n const descriptionDrawerClass = `${drawerClass}-description`;\n return (\n <>\n <h2 className={classnames(drawerButtonTextClass, headingDrawerClass)}>{this.props.moduleHeadingText}</h2>\n <span className={classnames(drawerButtonTextClass, descriptionDrawerClass)}>{this.props.moduleDescriptionText}</span>\n {this._generateGlyphMarkup('drawer__glyph__end', isCollapseState)}\n </>\n );\n }\n\n private _generateGlyphMarkup(location: string, isCollapseState: boolean): JSX.Element {\n let glyphClass = isCollapseState ? this._drawerOpenGlyph : this._drawerCloseGlyph;\n glyphClass = `${glyphClass} ${location}`;\n return <span className={glyphClass} />;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Alert, Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridState } from './utilities';\n\n/**\n * Interface quick order grid form props.\n */\nexport interface IQuickOrderGridFormProps {\n isAddtoListDisabled: boolean | undefined;\n productTextInput: React.RefObject<HTMLInputElement>;\n quantityTextInput: React.RefObject<HTMLInputElement>;\n maxChars: number;\n maxQuantity?: number;\n moduleClassName: string;\n ariaLabelQuantity: string;\n ariaLabelProduct: string;\n ariaLabelAddtoCart: string;\n quickOrderGridState: IQuickOrderGridState;\n handleInputChange(query: string): void;\n handleQuantityChange(query: string): void;\n handleAddProductListClick(): Promise<void>;\n}\n\n/**\n * Interface quick order grid form view props.\n */\nexport interface IQuickOrderGridFormViewProps {\n product: React.ReactNode;\n quantity: React.ReactNode;\n addToListBtn: React.ReactNode;\n userMessage?: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Input change value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleInputChange(event.target.value || '');\n};\n\n/**\n * On Quantity Change functionality.\n * @param handleQuantityChange -Quantity change function.\n * @returns Quantity change value.\n */\nconst onQuantityChangeFunction = (handleQuantityChange: (query: string) => void) => (event: React.ChangeEvent<HTMLInputElement>) => {\n handleQuantityChange(event.target.value || '');\n};\n\n/**\n * Quick order grid form component.\n * @param props -Component form props.\n * @returns Quick order gridp view props..\n */\nexport const QuickOrderGridFormComponent = (props: IQuickOrderGridFormProps): IQuickOrderGridFormViewProps => {\n const {\n moduleClassName,\n productTextInput,\n quantityTextInput,\n quickOrderGridState,\n maxChars,\n maxQuantity,\n isAddtoListDisabled,\n ariaLabelQuantity,\n ariaLabelProduct,\n ariaLabelAddtoCart,\n handleQuantityChange,\n handleInputChange,\n handleAddProductListClick\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const onQuantityInputChange = onQuantityChangeFunction(handleQuantityChange);\n\n const productNode = (\n <div className={`${moduleClassName}__content-form-main-product`}>\n <h2 className={`${moduleClassName}__content-form-main-product-lable`} aria-label={ariaLabelProduct}>\n {ariaLabelProduct}\n </h2>\n <input\n className={`${moduleClassName}__content-form-main-product-input`}\n type='text'\n aria-label={ariaLabelProduct}\n ref={productTextInput}\n onChange={onInputChange}\n />\n </div>\n );\n\n const quantityNode = (\n <div className={`${moduleClassName}__content-form-main-quantity`}>\n <h2 className={`${moduleClassName}__content-form-main-quantity-lable`} aria-label={ariaLabelQuantity}>\n {ariaLabelQuantity}\n </h2>\n <input\n className={`${moduleClassName}__content-form-main-quantity-input`}\n pattern='[0-9]*'\n ref={quantityTextInput}\n onChange={onQuantityInputChange}\n maxLength={maxChars}\n type='number'\n aria-live='polite'\n aria-label={ariaLabelQuantity}\n aria-valuemin={0}\n aria-valuemax={maxQuantity}\n aria-valuenow={quickOrderGridState.quantity}\n />\n </div>\n );\n\n const addToListNode = (\n <div className={`${moduleClassName}__content-form-main-add-to-product-list`}>\n <Button\n className={`${moduleClassName}__content-form-main-add-to-product-list-button`}\n disabled={isAddtoListDisabled}\n aria-label={ariaLabelAddtoCart}\n onClick={handleAddProductListClick}\n >\n {ariaLabelAddtoCart}\n </Button>\n </div>\n );\n\n const userMessageNode = quickOrderGridState.stateMessage ? (\n <Alert color={quickOrderGridState.stateMessage.statusCssString} isOpen={quickOrderGridState.stateMessage.isOpen}>\n <span className={quickOrderGridState.stateMessage.messageGlyph} />\n <span>{quickOrderGridState.stateMessage.messageText}</span>\n </Alert>\n ) : (\n undefined\n );\n\n return {\n product: productNode,\n addToListBtn: addToListNode,\n quantity: quantityNode,\n userMessage: userMessageNode\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { QuickOrderTemplateLine } from '@msdyn365-commerce-modules/retail-actions';\nimport { observable } from 'mobx';\n\n/**\n * Represents a product for quick order grid.\n */\nexport class QuickOrderGridProduct {\n @observable\n public isSelected: boolean;\n\n public readonly productLine: QuickOrderTemplateLine;\n\n public constructor(productLine: QuickOrderTemplateLine) {\n this.productLine = productLine;\n this.isSelected = false;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IComponent, IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport classnames from 'classnames';\nimport React from 'react';\n\n/**\n * Interface for quick order grid table header resources.\n */\nexport interface IQuickOrderGridTableHeaderResources {\n quickOrderGridProductNumberText: string;\n quickOrderGridProductText: string;\n quickOrderGridUnitPriceText: string;\n quickOrderGridUnitOfMeasureText: string;\n quickOrderGridQuantityText: string;\n quickOrderGridActionsText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableHeaderProps extends IComponentProps {\n context: ICoreContext;\n className: string;\n\n isMobile: boolean;\n resources: IQuickOrderGridTableHeaderResources;\n}\n\n/**\n * Interface for quick order grid table header component.\n */\nexport interface IQuickOrderGridTableHeaderComponent extends IComponent<IQuickOrderGridTableHeaderProps> {}\n\n/**\n * Get the quick order grid header cells for desktop.\n * @param props -- The quick order grid table header props.\n * @returns The list of cells for quick order grid header component in desktop version.\n */\nconst QuickOrderGridDesktopHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n const columnWithNumberClassName = `${props.className}__row__column-with-number`;\n return (\n <>\n <th>\n <span className={classnames(`${props.className}__emptyColumn`)} />\n </th>\n <th>{resources.quickOrderGridProductNumberText}</th>\n <th>{resources.quickOrderGridProductText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridUnitPriceText}</th>\n <th>{resources.quickOrderGridUnitOfMeasureText}</th>\n <th className={columnWithNumberClassName}>{resources.quickOrderGridQuantityText}</th>\n <th>{resources.quickOrderGridActionsText}</th>\n </>\n );\n};\n\n/**\n * Get the quick order grid header cells for mobile.\n * @param props -- The quick order grid table header props.\n * @returns The quick order grid header component in desktop version.\n */\nconst QuickOrderGridMobileHeaderCellsComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const { resources } = props;\n return (\n <>\n <th className={classnames(`${props.className}__emptyColumn`)} />\n <th>{resources.quickOrderGridProductNumberText}</th>\n <th />\n </>\n );\n};\n\n/**\n * Quick order table header component.\n * @param props - Configuration of the component.\n * @returns React node with the header.\n */\nexport const QuickOrderGridTableHeaderComponent: React.FC<IQuickOrderGridTableHeaderProps> = (props: IQuickOrderGridTableHeaderProps) => {\n const rowClassName = `${props.className}__row`;\n\n let headerCells: JSX.Element;\n if (props.isMobile) {\n headerCells = <QuickOrderGridMobileHeaderCellsComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopHeaderCellsComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport MsDyn365, { IComponentProps, ICoreContext, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductPrice } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync, ObjectExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, IncrementalQuantity, isMobile, VariantType } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { QuickOrderGridProduct } from '../../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../../utilities';\n\n/**\n * Data required to render each quick order grid row.\n */\nexport interface IQuickOrderGridTableRowData {\n product: QuickOrderGridProduct;\n}\n\n/**\n * Resources for quick order grid table rows.\n */\nexport interface IQuickOrderGridTableRowResources {\n quickOrderGridQuantityMobileText: string;\n quickOrderGridProductDimensionsSeparator: string;\n quickOrderGridViewDetailsButtonText: string;\n quickOrderGridViewDetailsButtonAriaLabel: string;\n quickOrderGridRemoveItemButtonAriaLabel: string;\n quickOrderGridInputQuantityAriaLabel: string;\n quickOrderGridDecrementButtonAriaLabel: string;\n quickOrderGridIncrementButtonAriaLabel: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n}\n\n/**\n * Interface for quick order grid table props.\n */\nexport interface IQuickOrderGridTableRowProps extends IComponentProps<IQuickOrderGridTableRowData> {\n context: ICoreContext;\n className: string;\n productListLine: ProductListLine;\n price?: ProductPrice;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n imageSettings?: IImageSettings;\n isMobile: boolean;\n resources: IQuickOrderGridTableRowResources;\n index: number;\n callbacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * The default image settings for quick order grid table row.\n */\nconst defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=80&h=80&m=6', w: 0, h: 0 },\n lg: { q: 'w=147&h=147&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Renders product image for quick order grid row.\n * @param props - Quick order table row props.\n * @returns React element.\n */\nconst QuickOrderGridTableRowProductImageComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const fallbackImageUrl = getFallbackImageUrl(\n product?.ItemId,\n props.context.actionContext.requestContext.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n\n const containerClassName = `${props.className}__product-image-container`;\n\n return (\n <div className={containerClassName}>\n <Image\n requestContext={props.context.actionContext.requestContext}\n className={`${containerClassName}__product-image`}\n altText={product?.Name}\n src={product?.PrimaryImageUrl ?? ''}\n fallBackSrc={fallbackImageUrl}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n />\n </div>\n );\n};\n\nlet setShowPreviousActions: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderProductPrice = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const { context, moduleId, moduleTypeName, resources } = props;\n const price = props.price;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-quick-order-grid-row__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\n/**\n * Renders product price.\n * @param props - Props for price component.\n * @returns React element.\n */\nconst renderUnitOfMeasure = (props: IQuickOrderGridTableRowProps): JSX.Element | null => {\n const price = props.price;\n\n if (price) {\n return (\n <div className='ms-quick-order-grid-row__product-unit-of-measure'>\n {StringExtensions.isNullOrEmpty(props.productListLine.UnitOfMeasure) || price.UnitOfMeasure}\n </div>\n );\n }\n return null;\n};\n\n/**\n * On Change function.\n * @param onChangeQuantity -On change quantity function.\n * @param itemKey -String.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onChangeHandler = (\n onChangeQuantity: (\n orderTemplateLineId: string | undefined,\n quantity: number,\n props?: IQuickOrderGridTableRowProps | undefined\n ) => boolean,\n itemKey: string | undefined,\n props: IQuickOrderGridTableRowProps\n) => (newValue: number) => {\n onChangeQuantity(itemKey, newValue, props);\n return true;\n};\n\n/**\n * On Change function.\n * @param onRemoveItem -On change quantity function.\n * @param quickOrderGridProductKey -QuickOrderGridp Product.\n * @param props -Order template line props.\n * @returns Set change quantity.\n */\nconst onRemoveHandler = (\n onRemoveItem: (quickOrderGridProduct: QuickOrderGridProduct, props?: IQuickOrderGridTableRowProps | undefined) => void,\n quickOrderGridProductKey: QuickOrderGridProduct,\n props: IQuickOrderGridTableRowProps\n) => () => {\n onRemoveItem(quickOrderGridProductKey, props);\n};\n\n/**\n * Renders actions popup for the mobile view.\n * @param props - Configuration for popup.\n * @returns A react node with actions..\n */\nconst QuickOrderGridExtraActionsPopupComponent: React.FC<IQuickOrderGridTableRowProps> = (\n props: IQuickOrderGridTableRowProps\n): JSX.Element | null => {\n const {\n resources: { quickOrderGridViewDetailsButtonAriaLabel, quickOrderGridViewDetailsButtonText }\n } = props;\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const [shouldShowActions, setShowActions] = useState(false);\n let productUrl = '';\n if (product === undefined) {\n return null;\n }\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n const onClickViewDetails = React.useCallback(() => {\n if (MsDyn365.isBrowser) {\n window.location.href = productUrl;\n }\n }, [productUrl]);\n\n const toggle = React.useCallback(() => {\n const shouldShowActionsNewValue = !shouldShowActions;\n if (shouldShowActionsNewValue) {\n if (setShowPreviousActions) {\n setShowPreviousActions(false);\n }\n setShowActions(shouldShowActionsNewValue);\n setShowPreviousActions = setShowActions;\n } else {\n setShowPreviousActions = undefined;\n setShowActions(shouldShowActionsNewValue);\n }\n }, [shouldShowActions, setShowActions]);\n\n if (StringExtensions.isNullOrWhitespace(productUrl)) {\n return null;\n }\n\n const className = `${props.className}__extra-actions-cell`;\n const actionsContainerClassName = `${className}__actions-container`;\n\n return (\n <div className={className}>\n <Button className={`${className}__toggle`} onClick={toggle} />\n {shouldShowActions && (\n <div className={actionsContainerClassName}>\n <Button\n className={`${actionsContainerClassName}__view-details`}\n onClick={onClickViewDetails}\n aria-label={quickOrderGridViewDetailsButtonAriaLabel}\n >\n {quickOrderGridViewDetailsButtonText}\n </Button>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n >\n {props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Renders quick order grid table rows for desktop view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for desktop view.\n */\nexport const QuickOrderGridDesktopTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { quantity } = props;\n const columnWithNumberClassName = `${props.className}__column-with-number`;\n if (product !== undefined) {\n let productUrl = '';\n if (!StringExtensions.isNullOrWhitespace(product.Name) && !ObjectExtensions.isNullOrUndefined(product.RecordId)) {\n productUrl = getProductPageUrlSync(product.Name!, product.RecordId, props.context.actionContext);\n }\n\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>{product.ItemId}</td>\n <td>\n <div className={`${props.className}__product-info`}>\n <a className={`${props.className}__product-name`} href={productUrl}>\n {product.Name}\n </a>\n <span className={`${props.className}__product-dimensions`}>\n {product.Dimensions?.map(dimension => dimension.DimensionValue?.Value)\n .filter(dimensionValue => !StringExtensions.isNullOrWhitespace(dimensionValue))\n .join(props.resources.quickOrderGridProductDimensionsSeparator)}\n </span>\n </div>\n </td>\n <td className={columnWithNumberClassName}>{renderProductPrice(props)}</td>\n <td>{renderUnitOfMeasure(props)}</td>\n <td className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n max={10}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </td>\n <td>\n <Button\n className={`${props.className}__product-remove`}\n aria-label={props.resources.quickOrderGridRemoveItemButtonAriaLabel}\n onClick={onRemoveHandler(props.callbacks.onRemoveItem, props.data.product, props)}\n />\n </td>\n </>\n );\n }\n\n return null;\n};\n\n/**\n * Renders rows for mobile view.\n * @param props - Configuration for the rows.\n * @returns A react node with a list of quick order grid rows for mobile view.\n */\nexport const QuickOrderGridMobileTableRowCellComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const product = props.data.product.productLine.fullProduct?.ProductDetails;\n const productListLine = props.data.product.productLine.productListLine;\n const { quantity } = props;\n if (product !== undefined) {\n return (\n <>\n <td>\n <QuickOrderGridTableRowProductImageComponent {...props} />\n </td>\n <td>\n <div className={`${props.className}__product-info`}>\n <span className={`${props.className}__product-name`}>{product.RecordId}</span>\n <span className={`${props.className}__product-quantity`}>\n <IncrementalQuantity\n id={`msc-quick-order-grid-row__quantity_${product.RecordId}-${productListLine.LineId ?? ''}`}\n max={10}\n currentCount={quantity}\n inputQuantityAriaLabel={props.resources.quickOrderGridInputQuantityAriaLabel}\n decrementButtonAriaLabel={props.resources.quickOrderGridDecrementButtonAriaLabel}\n incrementButtonAriaLabel={props.resources.quickOrderGridIncrementButtonAriaLabel}\n key={productListLine.LineId}\n isGiftCard={product.IsGiftCard}\n onChange={onChangeHandler(props.callbacks.onChangeQuantity, productListLine.LineId, props)}\n />\n </span>\n </div>\n </td>\n <td>\n <QuickOrderGridExtraActionsPopupComponent {...props} />\n </td>\n </>\n );\n }\n return null;\n};\n\n/**\n * Quick order table row component.\n * @param props - Configuration of the component.\n * @returns React node for the row.\n */\nexport const QuickOrderGridTableRowComponent: React.FC<IQuickOrderGridTableRowProps> = (props: IQuickOrderGridTableRowProps) => {\n const rowClassName = `${props.className}__row`;\n const isMobileView = isMobile({ variant: VariantType.Viewport, context: props.context.request }) === 'xs';\n let headerCells: JSX.Element;\n if (isMobileView) {\n headerCells = <QuickOrderGridMobileTableRowCellComponent {...props} />;\n } else {\n headerCells = <QuickOrderGridDesktopTableRowCellComponent {...props} />;\n }\n\n return (\n <thead className={props.className}>\n <tr className={rowClassName}>{headerCells}</tr>\n </thead>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IComponent, IComponentProps, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport React from 'react';\n\nimport { QuickOrderGridProduct } from '../quick-order-grid-product';\nimport { IQuickOrderGridRowCallbacks } from '../utilities';\nimport {\n IQuickOrderGridTableHeaderResources,\n IQuickOrderGridTableRowResources,\n QuickOrderGridTableHeaderComponent,\n QuickOrderGridTableRowComponent\n} from './components';\n\n/**\n * Quick order table data interface.\n */\ninterface IQuickOrderGridTableData {\n quickOrderGridProducts: QuickOrderGridProduct[];\n}\n\n/**\n * Quick order table resources.\n */\nexport interface IQuickOrderGridTableResources extends IQuickOrderGridTableHeaderResources, IQuickOrderGridTableRowResources {}\n\n/**\n * Quick order table props.\n */\nexport interface IQuickOrderGridTableProps extends IComponentProps<IQuickOrderGridTableData> {\n context: ICoreContext;\n className: string;\n moduleId: string;\n moduleTypeName: string;\n\n resources: IQuickOrderGridTableResources;\n isMobileView: boolean;\n imageSettings?: IImageSettings;\n callBacks: IQuickOrderGridRowCallbacks;\n}\n\n/**\n * Quick order table component.\n */\nexport interface IQuickOrderGridTableComponent extends IComponent<IQuickOrderGridTableProps> {}\n\n/**\n * The quick order table.\n * @param props -- The quick order table props.\n * @returns The quick order table element.\n */\nexport const QuickOrderGridTableComponent: React.FC<IQuickOrderGridTableProps> = (props: IQuickOrderGridTableProps) => {\n const [isMobile, setIsMobile] = React.useState(props.isMobileView);\n const quickOrderGridProducts = props.data.quickOrderGridProducts;\n\n /**\n * Update the view port.\n */\n const updateViewport = () => {\n setIsMobile(props.isMobileView);\n };\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', updateViewport);\n }\n\n const headerClassName = `${props.className}__header`;\n const rowClassName = `${props.className}__row`;\n\n return (\n <table className={props.className}>\n <QuickOrderGridTableHeaderComponent\n context={props.context}\n typeName={props.typeName}\n id={headerClassName}\n className={headerClassName}\n isMobile={isMobile}\n resources={props.resources}\n data={{}}\n />\n {quickOrderGridProducts.map((quickOrderProduct, index) => {\n const price = quickOrderProduct.productLine.fullProduct?.ProductPrice;\n const quantity = quickOrderProduct.productLine.productListLine.Quantity!;\n return (\n <QuickOrderGridTableRowComponent\n context={props.context}\n typeName={props.typeName}\n id={`${rowClassName}-${index}`}\n key={quickOrderProduct.productLine.fullProduct?.ProductDetails.RecordId}\n className={rowClassName}\n resources={props.resources}\n isMobile={isMobile}\n price={price}\n moduleId={props.moduleId}\n moduleTypeName={props.moduleTypeName}\n quantity={quantity}\n index={index}\n imageSettings={props.imageSettings}\n productListLine={quickOrderProduct.productLine.productListLine}\n callbacks={props.callBacks}\n data={{\n product: quickOrderProduct\n }}\n />\n );\n })}\n </table>\n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getProductConfigure,\n IProductDimensionCallbacks,\n IProductDimensionConfigureResources,\n IProductDimensionConfigureViewProps\n} from '@msdyn365-commerce/components';\nimport {\n ProductDimension,\n ProductDimensionType,\n ProductDimensionValue,\n ProductListsDataActions,\n ProductListType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n addItemToProductListAction,\n AddItemToProductListInput,\n ArrayExtensions,\n createProductList,\n CreateProductListInput,\n FinitePromiseQueue,\n FinitePromiseQueueError,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getScanResult,\n GetScanResultInput,\n getSelectedVariant,\n IDimensionForSelectedVariant,\n IPromiseQueue,\n QuickOrderTemplate,\n QuickOrderTemplateLine,\n SelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n Heading,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { ActiveProductListInput } from './actions';\nimport {\n IQuickOrderGridActionsProps,\n IQuickOrderGridActionsViewProps,\n IQuickOrderGridRowCallbacks,\n IQuickOrderGridState,\n QuickOrderGridActionsView,\n QuickOrderGridDrawer,\n QuickOrderGridFormComponent,\n QuickOrderGridProduct,\n QuickOrderGridTableComponent\n} from './components';\nimport { IQuickOrderGridData } from './quick-order-grid.data';\nimport { IQuickOrderGridProps, IQuickOrderGridResources } from './quick-order-grid.props.autogenerated';\n\n/**\n * QuickOrder Grid View props.\n */\nexport interface IQuickOrderGridViewProps extends IQuickOrderGridProps<IQuickOrderGridData> {\n header: JSX.Element;\n actions?: INodeProps;\n isB2bCustomer?: boolean;\n isQuickOrderGridFormExpanded: boolean;\n contentProps: INodeProps;\n drawer: INodeProps;\n loading?: React.ReactNode;\n quickOrderGridForm: INodeProps;\n quickOrderGridFormProductContent: INodeProps;\n quickOrderGridFormMsgContent: INodeProps;\n quickOrderGridProps: IModuleProps;\n form: React.ReactNode;\n configure?: IProductDimensionConfigureViewProps;\n isMobileView: boolean;\n container?: JSX.Element;\n orderActions?: IQuickOrderGridActionsViewProps | null;\n bulkPurchase?: React.ReactNode;\n}\n\n/**\n * QuickOrder Grid View port.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * QuickOrderGrid component.\n * @extends {React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>>}\n */\nclass QuickOrderGrid extends React.PureComponent<IQuickOrderGridProps<IQuickOrderGridData>, IQuickOrderGridState> {\n private readonly _productTextInput: React.RefObject<HTMLInputElement>;\n\n private readonly _quantityInput: React.RefObject<HTMLInputElement>;\n\n private readonly _waitTime: number = 500;\n\n private readonly _dimensionUpdateQueueMaxLength: number = 2;\n\n private readonly _errorCssClass: string = 'danger';\n\n private readonly _errorCssGlyphClass: string = 'fas fa-exclamation-triangle';\n\n private readonly _quickOrderGridFormClass: string;\n\n private readonly _quickOrderGridFormProductContent: string;\n\n private readonly _quickOrderGridFormMsgContent: string;\n\n private readonly _telemetryContent: ITelemetryContent;\n\n private readonly _dimensionUpdateQueue: IPromiseQueue<void> = new FinitePromiseQueue<void>(this._dimensionUpdateQueueMaxLength);\n\n private _dimensions: { [id: number]: string } = {};\n\n private readonly _cssClassNameConfigure: string = 'ms-quick-order_grid__content-form-main';\n\n private readonly _className: string = 'ms-quick-order-grid';\n\n // @ts-expect-error: Debouce needs to be used as type.\n private _cancellabelDebounce: debounce;\n\n private readonly _quickOrderGridCallbacks: IProductDimensionCallbacks = {\n /**\n * Get Dropdown name.\n * @param selectedDimensionId - Dimension type.\n * @param selectedDimensionValueId - Resources.\n * @returns Dropdown name.\n */\n dimensionSelectedAsync: async (selectedDimensionId: number, selectedDimensionValueId: string): Promise<void> => {\n this._dimensions[selectedDimensionId] = selectedDimensionValueId;\n return this._dimensionUpdateQueue\n .enqueue(async () => {\n return this._updateDimensions();\n })\n .catch((error: string) => {\n // Ignore discarded processes.\n if (error !== FinitePromiseQueueError.ProcessWasDiscardedFromTheQueue) {\n throw new Error(error);\n }\n });\n },\n\n /**\n * Get Dropdown name.\n * @param dimensionType - Dimension type.\n * @param resources - Resources.\n * @returns Dropdown name.\n */\n getDropdownName: (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n return this._getDropdownName(dimensionType, resources);\n },\n\n /**\n * Method to call on dimension change.\n * @param isUpdatingDimension - Flag to update dimension.\n */\n changeUpdatingDimension: (isUpdatingDimension: boolean): void => {\n this.setState({ isUpdatingDimension });\n }\n };\n\n private readonly _quickOrderGridRowCallbacks: IQuickOrderGridRowCallbacks = {\n /**\n * Method to call remove button.\n * @param line - Grid row product.\n */\n onRemoveItem: (line: QuickOrderGridProduct): void => {\n this._removeItemRowFromTable(line.productLine);\n },\n\n /**\n * Method to call on change quantity button.\n * @param productListLineId - Grid row product list line id.\n * @param quantity - Product quantity.\n * @returns - Falg to get confirmation for action.\n */\n onChangeQuantity: (productListLineId: string | undefined, quantity: number): boolean => {\n return this._changeRowQuantity(productListLineId, quantity);\n }\n };\n\n public constructor(props: IQuickOrderGridProps<IQuickOrderGridData>) {\n super(props);\n this._productTextInput = React.createRef();\n this._quantityInput = React.createRef<HTMLInputElement>();\n\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.state = {\n isQuickOrderGridFormExpanded: false,\n quantity: 1,\n productResponse: undefined,\n productDimensions: undefined,\n productDimensionErrorState: {\n configureErrors: {}\n },\n isMobile: this.isMobile,\n products: [],\n isUpdatingDimension: false,\n productListId: ''\n };\n\n this._quickOrderGridFormClass = 'ms-quick-order-grid__content-form';\n this._quickOrderGridFormProductContent = 'ms-quick-order-grid__content-form-main';\n this._quickOrderGridFormMsgContent = 'ms-quick-order-grid__content-form-msg';\n }\n\n @computed public get isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public render(): JSX.Element | null {\n const { data } = this.props;\n if (!data.customerInformation.result) {\n return null;\n }\n const quickOrderTemplate = data.quickOrderTemplate;\n\n if (quickOrderTemplate?.result !== undefined) {\n this.setState({\n products: quickOrderTemplate.result.quickOrderTemplateLines,\n productListId: quickOrderTemplate.result.productList.Id\n });\n }\n const { className = '', maxQuantity } = this.props.config;\n const customerInfo = this.props.data.customerInformation.result;\n const {\n quickOrderGridModuleHeading,\n quickOrderGridModuleDescription,\n quickOrderGridAddtogrid,\n quickOrderGridProductQuantityInputLabel,\n quickOrderGridProductInputLabel,\n quickOrderGridProductDimensionTypeColor,\n quickOrderGridProductDimensionTypeConfiguration,\n quickOrderGridSelectDimensionFormatString,\n quickOrderGridProductDimensionTypeSize,\n quickOrderGridProductDimensionTypeStyle,\n quickOrderGridProductDimensionTypeAmount,\n quickOrderGridModulePageHeading\n } = this.props.resources;\n\n const productConfigureResources: IProductDimensionConfigureResources = {\n selectDimensionFormatString: quickOrderGridSelectDimensionFormatString,\n productDimensionTypeColor: quickOrderGridProductDimensionTypeColor,\n productDimensionTypeConfiguration: quickOrderGridProductDimensionTypeConfiguration,\n productDimensionTypeSize: quickOrderGridProductDimensionTypeSize,\n productDimensionTypeStyle: quickOrderGridProductDimensionTypeStyle,\n productDimensionTypeAmount: quickOrderGridProductDimensionTypeAmount\n };\n\n const { isQuickOrderGridFormExpanded, productDimensionErrorState, productResponse, productDimensions } = this.state;\n\n const headerClassName = `${this._className}__header`;\n\n const header = (\n <div className={headerClassName}>\n <Heading className={`${headerClassName}-heading`} text={quickOrderGridModulePageHeading} />\n </div>\n );\n\n const viewProps: IQuickOrderGridViewProps = {\n ...(this.props as IQuickOrderGridProps<IQuickOrderGridData>),\n\n quickOrderGridProps: { className: classnames('ms-quick-order-grid', className), moduleProps: this.props },\n contentProps: { className: 'ms-quick-order-grid__content' },\n isB2bCustomer: customerInfo?.IsB2b,\n header,\n actions: {\n className: `${this._className}-action-bar`,\n tag: 'div'\n },\n drawer: {\n tag: QuickOrderGridDrawer,\n className: `${this._className}__drawer`,\n collapseProps: { isOpen: this.state.isQuickOrderGridFormExpanded },\n moduleHeadingText: quickOrderGridModuleHeading,\n moduleDescriptionText: quickOrderGridModuleDescription,\n requestContext: this.props.context.request,\n telemetryContent: this._telemetryContent\n },\n bulkPurchase: this._renderBulkPurchase(),\n quickOrderGridForm: {\n className: `${this._quickOrderGridFormClass} ${isQuickOrderGridFormExpanded ? 'qo-show' : 'qo-hide'}`\n },\n quickOrderGridFormProductContent: {\n className: this._quickOrderGridFormProductContent\n },\n quickOrderGridFormMsgContent: {\n className: this._quickOrderGridFormMsgContent\n },\n form: QuickOrderGridFormComponent({\n productTextInput: this._productTextInput,\n quantityTextInput: this._quantityInput,\n isAddtoListDisabled: !productResponse,\n ariaLabelAddtoCart: quickOrderGridAddtogrid,\n ariaLabelProduct: quickOrderGridProductInputLabel,\n ariaLabelQuantity: quickOrderGridProductQuantityInputLabel,\n maxChars: 50,\n maxQuantity,\n moduleClassName: this._className,\n quickOrderGridState: this.state,\n handleInputChange: this._handleInputChange,\n handleQuantityChange: this._handleQuantityChange,\n handleAddProductListClick: this._addItemToProductListLine\n }),\n configure:\n productResponse && productDimensions\n ? getProductConfigure(\n this._cssClassNameConfigure,\n this.props.context,\n this.props.friendlyName,\n this.props.telemetry,\n quickOrderGridSelectDimensionFormatString,\n productConfigureResources,\n this._quickOrderGridCallbacks,\n productResponse,\n productDimensions,\n productDimensionErrorState\n )\n : undefined,\n isQuickOrderGridFormExpanded: this.state.isQuickOrderGridFormExpanded,\n isMobileView: this.state.isMobile,\n container: ArrayExtensions.hasElements(this.state.products) ? this._renderListContainer() : undefined,\n orderActions: this._renderQuickOrderGridActions(quickOrderTemplate?.result)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _renderQuickOrderGridActions(quickOrderTemplate: QuickOrderTemplate | undefined): IQuickOrderGridActionsViewProps | null {\n const { typeName, context, resources } = this.props;\n const {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n } = resources;\n if (ArrayExtensions.hasElements(quickOrderTemplate?.quickOrderTemplateLines)) {\n const quickOrderGridActions: IQuickOrderGridActionsProps = {\n data: { quickOrderTemplate },\n moduleClassName: this._className,\n id: 'quick-order-grid',\n typeName,\n context,\n handlers: {\n removeProductList: this._removeProductList\n },\n resources: {\n quickOrderGridDeleteButtonText,\n quickOrderGridBuySelectedButtonText,\n quickOrderGridBuySelectedButtonAriaLabel,\n quickOrderGridBuySelectedAddingToCartErrorNotificationTitle,\n quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel,\n quickOrderGridGoToCartText,\n quickOrderGridDialogCloseText,\n quickOrderGridSingleItemText,\n quickOrderGridMultiLineItemFormatText,\n quickOrderGridMultiLinesFormatText,\n quickOrderGridHeaderMessageText,\n addedQuantityText,\n originalPriceText,\n currentPriceText,\n freePriceText\n }\n };\n\n return QuickOrderGridActionsView(quickOrderGridActions);\n }\n return null;\n }\n\n /**\n * Renders bulk purchase module.\n * @returns Bulk purchase module react node.\n */\n private _renderBulkPurchase(): React.ReactNode {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Temporary switch for the feature which is under development.\n if (!this.props.context.app.config.isBulkPurchaseEnabled) {\n return null;\n }\n\n if (!ArrayExtensions.hasElements(this.props.slots.bulkPurchaseSlots)) {\n return null;\n }\n\n const containerClass = `${this._className}__bulk-purchase`;\n return (\n <div className={containerClass}>\n {React.cloneElement(this.props.slots.bulkPurchaseSlots[0] as React.ReactElement, {\n productDimensions: this.state.productDimensions\n })}\n </div>\n );\n }\n\n /**\n * Render list container.\n * @returns JSX element.\n */\n private _renderListContainer(): JSX.Element {\n const containerClass = `${this._className}__table-content`;\n return <div className={containerClass}>{this._renderQuickOrderTable(this._className)}</div>;\n }\n\n /**\n * Initial the products on quick order.\n * @returns List of quick order products or undefined.\n */\n private _initQuickOrderGridProducts(): QuickOrderGridProduct[] {\n const products: QuickOrderTemplateLine[] = this.state.products;\n\n const quickOrderGridProduct: QuickOrderGridProduct[] = products.map((product: QuickOrderTemplateLine) => {\n return new QuickOrderGridProduct(product);\n });\n\n return ArrayExtensions.validValues(quickOrderGridProduct);\n }\n\n /**\n * Method to call on clear button.\n */\n private readonly _removeProductList = () => {\n const { context, data, telemetry, resources } = this.props;\n const { quickOrderTemplate } = data;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && quickOrderTemplate && quickOrderTemplate.result) {\n ProductListsDataActions.deleteAsync({ callerContext: context.actionContext }, quickOrderTemplate.result.productList)\n .then(() => {\n window.location.reload();\n })\n .catch((error: string) => {\n telemetry.warning('[quick-order-grid] Unable to delete product list.');\n telemetry.error(error);\n this._updateStatusState(\n resources.quickOrderGridDeleteProductListFailedText,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n });\n } else {\n telemetry.warning('[quick-order-grid] Failed to delete product list. Product List was not found');\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param className - Class name.\n * @returns JSX element.\n */\n private _renderQuickOrderTable(className: string): JSX.Element {\n const tableClassName = `${className}__table-list`;\n\n return (\n <QuickOrderGridTableComponent\n id={tableClassName}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n typeName={this.props.typeName}\n key={tableClassName}\n className={tableClassName}\n data={{\n quickOrderGridProducts: this._initQuickOrderGridProducts()\n }}\n context={this.props.context}\n resources={this.props.resources}\n isMobileView={this.state.isMobile}\n callBacks={this._quickOrderGridRowCallbacks}\n />\n );\n }\n\n /**\n * Method to called on product input change.\n * @param query - Product inventory info.\n */\n private readonly _handleInputChange = (query: string): void => {\n const queryMinLength = 4;\n if (!query || query.length > queryMinLength) {\n this.setState({ quantity: 0, productDimensions: [], productResponse: undefined });\n this._updateStatusState('', '', '', false);\n }\n if (this._cancellabelDebounce) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call -- existing code.\n this._cancellabelDebounce.cancel();\n }\n\n const { telemetry, context } = this.props;\n const zeroNumber = 0;\n if (!StringExtensions.isNullOrEmpty(query)) {\n this._cancellabelDebounce = debounce(() => {\n getScanResult(\n new GetScanResultInput(\n context.actionContext.requestContext.apiSettings,\n query,\n context.actionContext.requestContext.apiSettings.channelId\n ),\n this.props.context.actionContext\n )\n .then(results => {\n this.setState({\n productResponse: results?.Product,\n productDimensions: results?.ProductDimensionFull,\n isQuickOrderGridFormExpanded: true\n });\n })\n .catch((error: Error) => {\n telemetry.exception(error);\n telemetry.debug('Unable to get scan results');\n });\n }, this._waitTime);\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- Existing code.\n this._cancellabelDebounce();\n }, zeroNumber);\n this.setState({ isQuickOrderGridFormExpanded: true });\n } else {\n this.setState({ productResponse: undefined, isQuickOrderGridFormExpanded: true });\n }\n };\n\n /**\n * Method to called on quantity change.\n * @param value - Quantity value.\n */\n private readonly _handleQuantityChange = (value: string): void => {\n const currentValue = Number.parseInt(value, 10);\n const inputElement = this._quantityInput.current instanceof HTMLInputElement && this._quantityInput.current;\n const quantityChangeDebounceTimeout = 200;\n const minimumQuantity = 0;\n\n this.setState({ quantity: currentValue }, () => {\n debounce(() => {\n if (!Number.isNaN(this.state.quantity) && !(this.state.quantity < minimumQuantity) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, quantityChangeDebounceTimeout)();\n });\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionType - Dimension Type.\n * @param resources - String resources.\n * @returns Dropdwon label.\n */\n private readonly _getDropdownName = (dimensionType: number, resources: IProductDimensionConfigureResources): string => {\n const isGiftCard = this.state.productResponse?.IsGiftCard;\n\n switch (dimensionType) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.productDimensionTypeColor;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.productDimensionTypeConfiguration;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.productDimensionTypeSize;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? resources.productDimensionTypeAmount : resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n /**\n * Method to update dimension and product in UI.\n */\n private readonly _updateDimensions = async (): Promise<void> => {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { productDimensions, productResponse } = this.state;\n const hasProductDimensions = ArrayExtensions.hasElements(productDimensions);\n if (!productResponse || !hasProductDimensions) {\n return;\n }\n\n const dimensionsToUpdate: { [id: number]: string } = { ...this._dimensions };\n this.setState({ isUpdatingDimension: true });\n\n // eslint-disable-next-line no-console -- Testing.\n console.log(this.state.isUpdatingDimension);\n\n // Step 1: Update state to indicate which dimensions are selected\n if (this.state.productDimensionErrorState.otherError) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const clearOtherErrorState = { ...this.state.productDimensionErrorState };\n clearOtherErrorState.otherError = undefined;\n this.setState({ productDimensionErrorState: clearOtherErrorState });\n }\n\n // Step 2: Clear any errors indicating the dimension wasn't selected\n for (const dimensionKey of Object.keys(dimensionsToUpdate)) {\n if (this.state.productDimensionErrorState.configureErrors[dimensionKey]) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code.\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors[dimensionKey] = undefined;\n\n this.setState({ productDimensionErrorState: errorState });\n }\n }\n\n // Step 3, Build the actually selected dimensions, prioritizing the information in state\n // over the information in data\n const mappedDimensions = productDimensions\n ?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, dimensionsToUpdate[dimension.DimensionTypeValue]) ?? dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension.DimensionValue;\n });\n\n // Step 4. Use these dimensions hydrate the product. Wrap this in a promise\n // so that places like add to cart can await it\n // eslint-disable-next-line no-async-promise-executor -- existing code\n const selectedProduct = new Promise<SimpleProduct | null>(async resolve => {\n const newProduct = await getSelectedVariant(\n new SelectedVariantInput(\n productResponse.MasterProductId ? productResponse.MasterProductId : productResponse.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n if (newProduct) {\n await getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(\n newProduct.MasterProductId ? newProduct.MasterProductId : newProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n ),\n actionContext\n );\n }\n\n resolve(newProduct);\n });\n\n const variantProduct = await selectedProduct;\n this.setState({ productResponse: variantProduct !== null ? variantProduct : undefined });\n };\n\n /**\n * Method to get updated dimension value.\n * @param productDimensionFull - Product dimension full.\n * @param newValueId - New Dimension value.\n * @returns Dimension Value.\n */\n private readonly _updateDimensionValue = (\n productDimensionFull: IDimensionForSelectedVariant,\n newValueId: string | undefined\n ): ProductDimensionValue | undefined => {\n if (newValueId && productDimensionFull.DimensionValues) {\n return productDimensionFull.DimensionValues.find(dimension => dimension.RecordId === +newValueId);\n }\n\n return undefined;\n };\n\n /**\n * Method to get dropdwon name.\n * @param dimensionTypeValue - Dimension Type.\n * @param resources - String resources.\n * @param isGiftCard - Flag to check if its a giftcard product.\n * @returns Dropdwon error label.\n */\n private readonly _getDimensionErrorString = (\n dimensionTypeValue: number,\n resources: IQuickOrderGridResources,\n isGiftCard?: boolean\n ): string => {\n const amountErrorMessage = resources.quickOrderGridproductDimensionTypeAmountErrorMessage;\n\n switch (dimensionTypeValue) {\n case ProductDimensionType.Color: // ProductDimensionType.Color\n return resources.quickOrderGridproductDimensionTypeColorErrorMessage;\n case ProductDimensionType.Configuration: // ProductDimensionType.Configuration\n return resources.quickOrderGridproductDimensionTypeConfigurationErrorMessage;\n case ProductDimensionType.Size: // ProductDimensionType.Size\n return resources.quickOrderGridproductDimensionTypeSizeErrorMessage;\n case ProductDimensionType.Style: // ProductDimensionType.Style\n return isGiftCard ? amountErrorMessage : resources.quickOrderGridproductDimensionTypeStyleErrorMessage;\n default:\n return '';\n }\n };\n\n /**\n * Initial the products on quick order.\n * @param productResponse - Simple Product.\n * @param quantity - Product Quantity.\n * @returns Flag to validate productlistline.\n */\n private readonly _validateCart = (productResponse: SimpleProduct, quantity: number): boolean => {\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- existing code\n const missingDimensions = productResponse.Dimensions?.filter(\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\n );\n const minimumQuantity = 0;\n if (ArrayExtensions.hasElements(missingDimensions)) {\n const userMessage = this._getConfigureErrors(missingDimensions, false);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code\n if (this.state.productDimensionErrorState.configureErrors) {\n // eslint-disable-next-line react/no-access-state-in-setstate -- existing code\n const errorState = { ...this.state.productDimensionErrorState };\n errorState.configureErrors = userMessage;\n\n this.setState({ productDimensionErrorState: errorState });\n return false;\n }\n }\n\n if (quantity <= minimumQuantity) {\n const resources = this.props.resources;\n this._updateStatusState(resources.quickOrderGridWrongQuantityErrorMsg, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n }\n return true;\n };\n\n /**\n * Initial the products on quick order.\n * @param result - Simple Product.\n * @param isGiftCard - Product Quantity.\n * @returns Flag to validate cart.\n */\n private _getConfigureErrors(\n result: ProductDimension[] | undefined,\n isGiftCard?: boolean\n ): { [configureId: string]: string | undefined } {\n if (!result) {\n return {};\n }\n const dimensions: { [configureId: string]: string | undefined } = {};\n const resources = this.props.resources;\n for (const dimension of result) {\n dimensions[dimension.DimensionTypeValue] = this._getDimensionErrorString(dimension.DimensionTypeValue, resources, isGiftCard);\n }\n return dimensions;\n }\n\n /**\n * Method to call on quantity change in row.\n * @param itemKey - Product Key.\n * @param quantity - Product quantity.\n * @returns Flag to update status.\n */\n private readonly _changeRowQuantity = (itemKey: string | undefined, quantity: number): boolean => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n if (quickOrderTemplate?.result) {\n const quickOrderTemplateLinesData = quickOrderTemplate.result.quickOrderTemplateLines;\n if (ArrayExtensions.hasElements(quickOrderTemplateLinesData)) {\n const orderLineIndex = quickOrderTemplateLinesData.findIndex(\n (lines: QuickOrderTemplateLine) => lines.productListLine.LineId === itemKey\n );\n const newProductListLine = { ...quickOrderTemplateLinesData[orderLineIndex] };\n if (quickOrderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return true;\n }\n const previousQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n ProductListsDataActions.updateProductListLinesAsync(\n { callerContext: context.actionContext },\n quickOrderTemplate.result.productList.Id,\n [line.productListLine]\n )\n .then(list => {\n if (ArrayExtensions.hasElements(list)) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n quickOrderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...quickOrderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedProductList = { ...quickOrderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(\n new ActiveProductListInput(context.actionContext.requestContext),\n updatedProductList\n );\n return true;\n }\n\n return false;\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable to update product quantity.');\n telemetry.error(error.message);\n const userMessage = 'Failed to update quantity value.';\n newProductListLine.productListLine.Quantity = previousQuantity;\n this._updateStatusState(userMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return false;\n });\n }\n return false;\n }\n\n return false;\n };\n\n /**\n * Method to call on remove item from table.\n * @param line - Order Template Line.\n */\n private readonly _removeItemRowFromTable = (line: QuickOrderTemplateLine): void => {\n const { context, data, telemetry } = this.props;\n const { quickOrderTemplate } = data;\n\n if (quickOrderTemplate?.result) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken) {\n ProductListsDataActions.removeProductListLinesAsync(\n { callerContext: context.actionContext },\n line.productListLine.ProductListId!,\n [line.productListLine]\n )\n .then(() => {\n window.location.reload(false);\n })\n .catch((error: Error) => {\n telemetry.warning('[quick-order-grid] Unable remove item from product list grid');\n telemetry.error(error.message);\n });\n } else {\n telemetry.warning('[quick-order-grid] Unable remove items from product list grid user token was not found');\n }\n }\n };\n\n /**\n * Method to call on add item from form.\n */\n private readonly _addItemToProductListLine = async (): Promise<void> => {\n const {\n context: { actionContext },\n resources,\n telemetry\n } = this.props;\n const {\n quickOrderGridAddedToGridSuccessMessage,\n quickOrderGridAddedToGridFailureMessage,\n quickOrderGridAddedToGridDuplicateError\n } = resources;\n const { productResponse, quantity, productListId } = this.state;\n\n this._updateStatusState('', '', '', false);\n\n if (productResponse !== undefined && this._validateCart(productResponse, quantity)) {\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n await this._createProductList();\n }\n\n if (StringExtensions.isNullOrWhitespace(this.state.productListId)) {\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return;\n }\n const input = new AddItemToProductListInput(\n this.state.productListId,\n productResponse.RecordId,\n quantity,\n productResponse.DefaultUnitOfMeasure ?? 'ea'\n );\n\n await addItemToProductListAction(input, actionContext)\n .then(result => {\n if (result.ProductListId) {\n this._updateStatusState(quickOrderGridAddedToGridSuccessMessage, 'success', 'fas fa-check', true);\n window.location.reload();\n this.setState({});\n }\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error trying to Update Grid Line from the quick order grid');\n if (error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n this._updateStatusState(\n quickOrderGridAddedToGridDuplicateError,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n } else {\n this._updateStatusState(\n quickOrderGridAddedToGridFailureMessage,\n this._errorCssClass,\n this._errorCssGlyphClass,\n true\n );\n }\n });\n }\n };\n\n /**\n * Method to create product list.\n * @returns - ProductListId.\n */\n private _createProductList = async (): Promise<string> => {\n const {\n context: { actionContext },\n telemetry,\n resources\n } = this.props;\n const { productListId } = this.state;\n const { quickOrderGridAddedToGridFailureMessage } = resources;\n\n if (StringExtensions.isNullOrWhitespace(productListId)) {\n const input = new CreateProductListInput('', ProductListType.QuickOrder);\n\n await createProductList(input, actionContext)\n .then(result => {\n if (!StringExtensions.isNullOrWhitespace(result.Id)) {\n this.setState({ productListId: result.Id });\n return result.Id;\n }\n return '';\n })\n .catch((error: Error) => {\n telemetry.debug('[quick-order-grid] Error on creating productlist from quick order grid');\n telemetry.error(error.message);\n this._updateStatusState(quickOrderGridAddedToGridFailureMessage, this._errorCssClass, this._errorCssGlyphClass, true);\n return '';\n });\n return '';\n }\n\n return productListId;\n };\n\n /**\n * Method to create product list.\n * @param messageText - Message Text.\n * @param statusCssString - Css class names.\n * @param messageGlyph - Glyph string.\n * @param isOpen - Flag to show.\n */\n private readonly _updateStatusState = (messageText: string, statusCssString: string, messageGlyph: string, isOpen: boolean): void => {\n this.setState({\n // eslint-disable-next-line react/no-unused-state -- Showing user message in Form component.\n stateMessage: {\n messageText,\n statusCssString,\n messageGlyph,\n isOpen\n }\n });\n };\n}\nexport default QuickOrderGrid;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductDimensionConfigureDropdownViewProps, IProductDimensionConfigureViewProps } from '@msdyn365-commerce/components';\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IQuickOrderGridFormViewProps } from './components';\nimport { IQuickOrderGridViewProps } from './quick-order-grid';\n\n/**\n * Render product dimension/configure dropdown.\n * @param dropdown -- Product dimension drop down.\n * @returns Dropdown.\n */\nconst renderConfigureDropdown = (dropdown: IProductDimensionConfigureDropdownViewProps): JSX.Element => {\n const { containerProps, labelContainerProps, heading, errors, select } = dropdown;\n\n return (\n <Node {...containerProps}>\n <Node {...labelContainerProps}>{heading}</Node>\n {errors}\n {select}\n </Node>\n );\n};\n\n/**\n * Render product dimension/configure container.\n * @param configure -- Product dimension configuration.\n * @returns Container to have dimension dropdown.\n */\nconst renderConfigure = (configure?: IProductDimensionConfigureViewProps): JSX.Element | null => {\n if (configure !== undefined) {\n const { containerProps, dropdowns } = configure;\n\n return <Node {...containerProps}>{dropdowns.map(renderConfigureDropdown)}</Node>;\n }\n return null;\n};\n\n/**\n * Render product dimension/configure container.\n * @param form -- Form props.\n * @param isMobileView -- Flag to check mobile view.\n * @param quickOrderForm - Form component container.\n * @param quickOrderProductContent - Form product component.\n * @param quickOrderMessageContent - Form user message component.\n * @param configure - Product Dimension component.\n * @returns Jsx element of quick order form component.\n */\nconst renderForm = (\n form: IQuickOrderGridFormViewProps,\n isMobileView: boolean,\n quickOrderForm: INodeProps,\n quickOrderProductContent: INodeProps,\n quickOrderMessageContent: INodeProps,\n configure?: IProductDimensionConfigureViewProps\n) => {\n return isMobileView ? (\n <Node {...quickOrderForm}>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n {form.addToListBtn}\n </Node>\n </Node>\n ) : (\n <Node {...quickOrderForm}>\n <Node {...quickOrderMessageContent}>{form.userMessage}</Node>\n <Node {...quickOrderProductContent}>\n {form.product}\n {renderConfigure(configure)}\n {form.quantity}\n {form.addToListBtn}\n </Node>\n </Node>\n );\n};\n\n/**\n * Retrieves current sort criteria.\n * @param props - QuickOrder Grid view props.\n * @returns - Render View.\n */\nconst quickOrderGridView: React.FC<IQuickOrderGridViewProps> = props => {\n const {\n quickOrderGridProps,\n contentProps,\n form,\n quickOrderGridForm,\n drawer,\n configure,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n isMobileView,\n header,\n container,\n actions,\n orderActions\n } = props;\n\n return (\n <Module {...quickOrderGridProps}>\n {header}\n {actions && (\n <Node {...actions}>\n {orderActions?.addProductListToBag}\n {orderActions?.removeProductList}\n </Node>\n )}\n <Node {...drawer}>\n <Node {...contentProps}>\n {renderForm(\n form as IQuickOrderGridFormViewProps,\n isMobileView,\n quickOrderGridForm,\n quickOrderGridFormProductContent,\n quickOrderGridFormMsgContent,\n configure\n )}\n {props.bulkPurchase}\n </Node>\n </Node>\n {container}\n </Module>\n );\n};\n\nexport default quickOrderGridView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\nimport { format, INodeProps, Progress } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface IHistogramItemsProps {\n ratingsSummary: RatingsSummary;\n resources: IHistogramItemsResources;\n locale: string;\n onClick(stars: number): void;\n}\n\nexport interface IHistogramItemsResources {\n barItemAriaLabel: string;\n}\n\nexport interface IHistogramItemViewProps {\n starLabel: React.ReactElement;\n bar: React.ReactElement;\n percentage: React.ReactElement;\n buttonProps: INodeProps;\n}\n\n/**\n * CartLineItems component.\n */\n\nexport const HistogramItems = (props: IHistogramItemsProps): IHistogramItemViewProps[] => {\n const { ratingsSummary } = props;\n const totalRatingsCount: number = ratingsSummary.totalRatingsCount || 0;\n if (totalRatingsCount === 0) {\n return [];\n }\n return [\n renderItem(props, 5, ratingsSummary.star5Count, totalRatingsCount),\n renderItem(props, 4, ratingsSummary.star4Count, totalRatingsCount),\n renderItem(props, 3, ratingsSummary.star3Count, totalRatingsCount),\n renderItem(props, 2, ratingsSummary.star2Count, totalRatingsCount),\n renderItem(props, 1, ratingsSummary.star1Count, totalRatingsCount)\n ];\n};\n\nconst renderItem = (props: IHistogramItemsProps, stars: number, count?: number, totalCount?: number): IHistogramItemViewProps => {\n count = count || 0;\n totalCount = totalCount || 0;\n const percentage = totalCount === 0 ? 0 : count / totalCount;\n const formattedPercent = new Intl.NumberFormat(props.locale, { style: 'percent' }).format(percentage);\n const ariaLabel = format(props.resources.barItemAriaLabel, stars, formattedPercent);\n\n return {\n starLabel: (\n <span aria-hidden='true' className='ms-ratings-histogram__star'>\n {stars}\n </span>\n ),\n percentage: (\n <span aria-hidden='true' className='ms-ratings-histogram__percentage'>\n {formattedPercent}\n </span>\n ),\n bar: <Progress value={percentage * 100} max={100} ariaLabel={ariaLabel} className='ms-ratings-histogram__bar' />,\n buttonProps: {\n tag: 'button',\n className: 'ms-ratings-histogram__item',\n onClick: () => {\n props.onClick(stars);\n }\n }\n };\n};\n\nexport const AverageRatingNumber: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return (\n <p className='ms-ratings-histogram__average'>\n {props.summary.averageRating}\n {` `}/ 5\n </p>\n );\n};\n\nexport const TotalReviews: React.FC<{ summary: RatingsSummary }> = (props: { summary: RatingsSummary }) => {\n return <p className='ms-ratings-histogram__total'>{props.summary.totalRatingsCount}</p>;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { RatingComponent } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { format, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classname from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { createRatingsReviewsStateInput } from '../../actions/ratings-reviews-state-data-action';\nimport { AverageRatingNumber, HistogramItems, IHistogramItemViewProps, TotalReviews } from './component/components';\nimport { IRatingsHistogramData } from './ratings-histogram.data';\nimport { IRatingsHistogramProps } from './ratings-histogram.props.autogenerated';\n\nexport interface IRatingsHistogramViewProps extends IRatingsHistogramProps<IRatingsHistogramData> {\n className: string;\n histogramItems: IHistogramItemViewProps[];\n moduleProps: IModuleProps;\n heading: React.ReactNode;\n averageRating: React.ReactNode;\n averageNumber: React.ReactNode;\n totalReviews: React.ReactNode;\n histogramProps: INodeProps;\n ratingsSummaryProps: INodeProps;\n callbacks: IRatingsHistogramCallbacks;\n}\n\nexport interface IRatingsHistogramCallbacks {\n selectFilterBy(stars: number): void;\n}\n\n/**\n * RatingsHistogram component.\n * @extends {React.Component<IRatingsHistogramProps<IRatingsHistogramData>>}\n */\n@observer\nclass RatingsHistogram extends React.PureComponent<IRatingsHistogramProps<IRatingsHistogramData>> {\n constructor(props: IRatingsHistogramProps<IRatingsHistogramData>) {\n super(props);\n this.selectFilterBy = this.selectFilterBy.bind(this);\n }\n\n public render(): JSX.Element | null {\n const { resources } = this.props;\n const { className, heading } = this.props.config;\n const {\n ratingsSummary: { result: ratingsSummary }\n } = this.props.data;\n const ratingCount = ratingsSummary && ratingsSummary.totalRatingsCount ? `${ratingsSummary.totalRatingsCount}` : '0';\n\n const completeClass = classname('ms-ratings-histogram', className);\n const viewProps: IRatingsHistogramViewProps = {\n ...this.props,\n className: completeClass,\n callbacks: {\n selectFilterBy: this.selectFilterBy\n },\n moduleProps: {\n moduleProps: this.props,\n className: completeClass\n },\n histogramItems: ratingsSummary\n ? HistogramItems({\n ratingsSummary,\n resources: { ...resources },\n locale: this.props.context.request.locale,\n onClick: this.selectFilterBy\n })\n : [],\n averageRating: ratingsSummary && (\n <RatingComponent\n avgRating={ratingsSummary.averageRating!}\n ratingCount={ratingCount}\n ariaLabel={format(this.props.resources.averageRatingAriaLabel, ratingsSummary.averageRating, '5')}\n readOnly\n context={this.props.context}\n hideCount\n id={this.props.id}\n typeName={this.props.typeName}\n data={{}}\n />\n ),\n averageNumber: ratingsSummary && <AverageRatingNumber summary={ratingsSummary} />,\n totalReviews: ratingsSummary && <TotalReviews summary={ratingsSummary} />,\n ratingsSummaryProps: { className: 'ms-ratings-histogram__summary' },\n heading: heading && (\n <Msdyn365.Text\n className='ms-ratings-histogram__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n ),\n histogramProps: { className: 'ms-ratings-histogram__histogram' }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n public selectFilterBy(stars: number): void {\n const filterKey = `${stars}`;\n this.props.context.actionContext.update(createRatingsReviewsStateInput({ filterKey }), { filterKey });\n }\n}\n\nexport default RatingsHistogram;\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 { IHistogramItemViewProps } from './component/components';\nimport { IRatingsHistogramViewProps } from './ratings-histogram';\n\nconst RatingsHistogramView: React.FC<IRatingsHistogramViewProps> = props => {\n const { heading, histogramItems, histogramProps, moduleProps } = props;\n\n return (\n <Module {...moduleProps}>\n {heading}\n <Node {...histogramProps}>\n {histogramItems.map(item => {\n return histogramItem(item);\n })}\n </Node>\n </Module>\n );\n};\n\nconst histogramItem = (props: IHistogramItemViewProps) => {\n return (\n <Node {...props.buttonProps}>\n {props.starLabel}\n {props.bar}\n {props.percentage}\n </Node>\n );\n};\n\nexport default RatingsHistogramView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport interface IWishlistItemDimension {\n key: string;\n className?: string;\n dimensionType: string;\n dimensionValue: string;\n}\n\nexport const WishlistItemDimension: React.FC<IWishlistItemDimension> = ({ key, className, dimensionType, dimensionValue }) => (\n <div key={key} className={className}>\n <span className='msc-wishlist-dimension__label'>{dimensionType}:</span>\n <span className='msc-wishlist-dimension__value'>{dimensionValue}</span>\n </div>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric, IImageSettings, Image, ITelemetry, msdyn365Commerce } from '@msdyn365-commerce/core';\nimport {\n CommerceListLine,\n ProductPrice,\n ReleasedProductType,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n convertProductDimensionTypeToDimensionTypes,\n getFallbackImageUrl,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IWishlistItemActionMessageState } from '../wishlist-items';\nimport { WishlistItemDimension } from './wishlist-items-dimensions';\n\nexport interface IWishlistItemProps extends CommerceListLine {\n product: SimpleProduct;\n wishlistState: IWishlistItemActionMessageState;\n price?: ProductPrice;\n context: ICoreContext<IGeneric<IAny>>;\n productUrl: string;\n imageSettings?: IImageSettings;\n removeFromWishlistText: string;\n isInStock: boolean;\n addToCartText: string;\n outOfStockText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n enableImageProductLink?: boolean;\n inventoryInformationLabel?: string;\n inventoryLabelClassName?: string;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onAddToCart(product: SimpleProduct, itemKey: string): void;\n onRemoveItem(productId: number): void | undefined;\n onDismiss(): void;\n };\n resources: {\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n };\n}\n\nexport interface IWishlistItemViewProps {\n key: string;\n productImage: React.ReactNode;\n productLink: React.ReactNode;\n productDimensions?: React.ReactNode[];\n productPrice?: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productStatusMessage?: React.ReactNode;\n productName?: React.ReactNode;\n productAriaLabel?: string;\n entireProductLink?: string;\n inventoryInformation?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n}\n\nconst _addItemToCart = (props: IWishlistItemProps): void => {\n const { product, itemKey, handlers } = props;\n const { onAddToCart } = handlers;\n\n onAddToCart && product && itemKey && onAddToCart(product, itemKey);\n};\n\nconst _removeItemFromWishlist = (props: IWishlistItemProps): void => {\n const { onRemoveItem } = props.handlers;\n const { RecordId } = props.product;\n\n onRemoveItem && RecordId && onRemoveItem(RecordId);\n};\n\nconst WishListItemActions = {\n addToCart: _addItemToCart,\n removeItem: _removeItemFromWishlist\n};\n\nconst _getFullProductLink = (props: IWishlistItemProps): string => {\n if (!msdyn365Commerce.isBrowser) {\n return '';\n }\n\n const fullUrl = new URL(props.productUrl, window.location.href);\n for (const dimension of props.product.Dimensions ?? []) {\n const dimensionValue = dimension.DimensionValue?.Value;\n if (!StringExtensions.isNullOrWhitespace(dimensionValue)) {\n const dimensionName = convertProductDimensionTypeToDimensionTypes(dimension.DimensionTypeValue);\n fullUrl.searchParams.set(dimensionName, dimensionValue!);\n }\n }\n return fullUrl.href;\n // return updateProductUrl(productUrl, context, swatch);\n};\n\nconst _renderAriaLabel = (props: IWishlistItemProps): string => {\n const { product, price, context, resources } = props;\n\n const { Name, Dimensions } = product;\n const { productDimensionTypeColor, productDimensionTypeSize, productDimensionTypeStyle } = resources;\n\n let formattedPrice = 'Free';\n let dimensions = null;\n\n if (price) {\n formattedPrice =\n price.BasePrice === 0 ? resources.freePriceText : context.cultureFormatter.formatCurrency(price.BasePrice!, price.CurrencyCode);\n }\n\n if (Dimensions) {\n dimensions = Dimensions.map(productDimension => {\n switch (productDimension.DimensionTypeValue) {\n case 1:\n return `${productDimensionTypeColor}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 3:\n return `${productDimensionTypeSize}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n case 4:\n return `${productDimensionTypeStyle}${productDimension.DimensionValue && productDimension.DimensionValue.Value}`;\n default:\n return '';\n }\n });\n }\n\n return `${Name} ${formattedPrice} ${(dimensions && dimensions.join('')) || ''}`;\n};\n\n/**\n * Renders a link to a product based on the given props.\n * @param input - Wishlist item props with the info about the product.\n * @param productUrl - The url to the product.\n * @returns React component with a link to a product.\n */\nconst renderProductLink = (input: IWishlistItemProps, productUrl: string) => {\n const { telemetryContent } = input;\n const { RecordId: recordId, Name: productName } = input.product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', recordId.toString());\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPageUrlWithSwatch = productUrl;\n return (\n !StringExtensions.isNullOrWhitespace(productPageUrlWithSwatch) && (\n <a\n href={productPageUrlWithSwatch}\n className='ms-wishlist-items__product-link'\n {...productAttributes}\n aria-label={_renderAriaLabel(input)}\n >\n {productName}\n </a>\n )\n );\n};\n\n/**\n * Renders a product name box.\n * @param productName - The text to display.\n * @returns React component with a name of a product.\n */\nconst renderProductName = (productName: string) => {\n return <div className='ms-wishlist-items__product-title'>{productName}</div>;\n};\n\n/**\n * Renders inventory information.\n * @param inventoryInformationLabel - The text to display.\n * @param inventoryLabelClassName - The component class name.\n * @returns React component.\n */\nconst renderInventoryInformationLabel = (inventoryInformationLabel: string | undefined, inventoryLabelClassName: string | undefined) => {\n const inventoryCssName = inventoryLabelClassName\n ? `ms-wishlist-items__inventory-label ${inventoryLabelClassName}`\n : 'ms-wishlist-items__inventory-label';\n return (\n !StringExtensions.isNullOrWhitespace(inventoryInformationLabel) && (\n <span className={inventoryCssName}>{inventoryInformationLabel}</span>\n )\n );\n};\n\n/**\n * Renders add to cart button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemAddToCartButtonComponent = (input: IWishlistItemProps) => {\n const { isInStock, addToCartText, outOfStockText } = input;\n\n // Check if the product is service or not by product type.\n const isServiceItem = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n const addItemAction = React.useCallback(() => {\n WishListItemActions.addToCart(input);\n }, [input]);\n\n return (\n <Button\n className='ms-wishlist-items__product-add-button'\n title={((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n onClick={addItemAction}\n disabled={!(isServiceItem || isInStock)}\n >\n {((isServiceItem || isInStock) && addToCartText) || outOfStockText}\n </Button>\n );\n};\n\n/**\n * Renders remove from wishlist button.\n * @param input - Wishlist item props with the configuration.\n * @returns React component.\n */\nconst WishlistItemRemoveFromWishlistButtonComponent = (input: IWishlistItemProps) => {\n const { removeFromWishlistText } = input;\n\n const removeItemAction = React.useCallback(() => {\n WishListItemActions.removeItem(input);\n }, [input]);\n\n return <button className='ms-wishlist-items__product-remove-button' aria-label={removeFromWishlistText} onClick={removeItemAction} />;\n};\n\n/**\n * Gets the react node for product unit of measure display.\n * @param context - Module context.\n * @param unitOfMeasure - Product unit of measure.\n * @returns The node representing markup for unit of measure component.\n */\nconst renderUnitOfMeasure = (context: ICoreContext<IGeneric<IAny>>, unitOfMeasure?: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for appsettings\n if (context.app.config && (!context.app.config.unitOfMeasureDisplayType || context.app.config.unitOfMeasureDisplayType === 'none')) {\n return undefined;\n }\n\n if (!unitOfMeasure) {\n return undefined;\n }\n\n return (\n <div className='msc-wishlistitems__product-unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n};\n\nexport const WishlistItem = (input: IWishlistItemProps): IWishlistItemViewProps | null => {\n const {\n product,\n price,\n context,\n imageSettings,\n wishlistState,\n itemKey,\n handlers,\n inventoryInformationLabel,\n enableImageProductLink,\n inventoryLabelClassName\n } = input;\n\n if (!product) {\n return null;\n }\n\n const { RecordId, Name, PrimaryImageUrl, Dimensions } = product;\n if (product.RecordId) {\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const productUrl = _getFullProductLink(input);\n return {\n key: `${RecordId}-item`,\n productImage:\n PrimaryImageUrl && Name && _renderProductImage(context, product.Name!, PrimaryImageUrl, fallbackImage, imageSettings),\n productLink: renderProductLink(input, productUrl),\n productDimensions: Dimensions && _renderProductDimensions(input),\n productPrice: price && _renderPrice(input),\n productUnitOfMeasure: product.DefaultUnitOfMeasure && renderUnitOfMeasure(context, product.DefaultUnitOfMeasure),\n entireProductLink: enableImageProductLink ? productUrl : undefined,\n productAriaLabel: enableImageProductLink ? _renderAriaLabel(input) : undefined,\n productName: enableImageProductLink && Name && renderProductName(Name),\n\n addToCartButton: <WishlistItemAddToCartButtonComponent {...input} />,\n inventoryInformation: renderInventoryInformationLabel(inventoryInformationLabel, inventoryLabelClassName),\n removeButton: <WishlistItemRemoveFromWishlistButtonComponent {...input} />,\n productStatusMessage: wishlistState &&\n wishlistState.isOpen &&\n wishlistState.productId === RecordId &&\n wishlistState.itemKey === itemKey && (\n <div className='ms-wishlist-items__product-status'>\n <Alert color={wishlistState.statusCssString} isOpen={wishlistState.isOpen} toggle={handlers.onDismiss}>\n <span>{wishlistState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n }\n return null;\n};\n\nconst _renderProductImage = (\n context: ICoreContext,\n heading: string,\n image?: string,\n fallbackImage?: string,\n imageSettings?: IImageSettings\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n lg: { q: 'w=315&h=315&m=6', w: 0, h: 0 },\n xl: { q: 'w=315&h=315&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (image) {\n return (\n <Image\n requestContext={context.actionContext.requestContext}\n className='ms-wishlist-items__product-image'\n altText={heading}\n title={heading}\n src={image}\n fallBackSrc={fallbackImage}\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings || defaultImageSettings}\n loadFailureBehavior='empty'\n />\n );\n }\n return null;\n};\n\nconst _renderPrice = (props: IWishlistItemProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n <PriceComponent\n id={moduleId}\n typeName={moduleTypeName}\n data={{ price }}\n className='ms-wishlist-items__product-price'\n freePriceText={resources.freePriceText}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n context={context}\n />\n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IWishlistItemProps): (React.ReactNode | undefined)[] => {\n const { product, resources } = props;\n\n if (!product || !product.Dimensions) {\n return [];\n }\n\n return product.Dimensions.map((dimension, index) => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n let type = '';\n\n switch (dimension.DimensionTypeValue) {\n case 1: {\n type = resources.productDimensionTypeColor;\n break;\n }\n case 3: {\n type = resources.productDimensionTypeSize;\n break;\n }\n case 4: {\n type = resources.productDimensionTypeStyle;\n break;\n }\n default:\n return undefined;\n }\n\n return (\n <WishlistItemDimension\n key={`${product.RecordId}-dimensions-${index}`}\n className='msc-price ms-wishlist-items__product-dimension'\n dimensionType={type}\n dimensionValue={dimension.DimensionValue.Value}\n />\n );\n });\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { wishlistStatus } from '../wishlist-items';\n\nexport interface IWishlistItemsStatusMessageProps {\n className?: string;\n errorType: wishlistStatus;\n text?: string;\n}\n\nexport const WishlistItemsStatusMessage: React.FC<IWishlistItemsStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-wishlist-items__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-wishlist-items__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className={className ? 'ms-wishlist-items__message-exists-product' : 'ms-wishlist-items__message-waiting'}>{text}</p>;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { FullProduct } from '@msdyn365-commerce/commerce-entities';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport { AsyncResult, CommerceList, CommerceListLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { createGetByCustomerInput, removeLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CommerceListsDataActions.g';\nimport { getDeliveryOptionsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n getProductUrlSync,\n IProductInventoryInformation,\n QueryResultSettingsProxy\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n updateMaxQuantityForCartLineItem\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport getItemsInWishlists, { ActiveWishlistInput } from './actions/get-items-in-wishlists';\nimport { IWishlistItemViewProps, WishlistItem, WishlistItemsStatusMessage } from './components';\nimport { IWishlistItemsData } from './wishlist-items.data';\nimport { IHeadingData, IWishlistItemsProps } from './wishlist-items.props.autogenerated';\n\nexport interface IWishlistItemActionMessageState {\n productId: number;\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isError: boolean;\n}\n\nexport type wishlistStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IWishlistItemsViewProps extends IWishlistItemsProps<IWishlistItemsData> {\n WishlistItems: IModuleProps;\n status?: wishlistStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n Products?: INodeProps;\n Product?: INodeProps;\n ProductDetails?: INodeProps;\n ProductDimensions?: INodeProps;\n products?: IWishlistItemViewProps[];\n telemetryContent?: ITelemetryContent;\n statusNotExistsMessage?: React.ReactNode;\n}\n\n/**\n *\n * WishlistItems component.\n * @extends {React.PureComponent<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState>}\n */\n@observer\nclass WishlistItems extends React.Component<IWishlistItemsProps<IWishlistItemsData>, IWishlistItemActionMessageState> {\n private readonly telemetryContent: ITelemetryContent;\n constructor(props: IWishlistItemsProps<IWishlistItemsData>) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public async componentDidMount(): Promise<void> {\n this.setState({ isError: false });\n }\n\n public shouldComponentUpdate(nextProps: IWishlistItemsProps<IWishlistItemsData>, nextState: IWishlistItemActionMessageState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyWishlistText, wishlistErrorGettingWishlist, noLongerExitsWishlistItemText } = this.props.resources;\n const { cart, productAvailability, wishlists, products } = this.props.data;\n\n if (cart.status === 'LOADING' || productAvailability.status === 'LOADING' || wishlists.status === 'LOADING') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'LOADING',\n\n statusMessage: <WishlistItemsStatusMessage errorType='LOADING' text='Loading...' />,\n heading: this._renderHeading(heading)\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || productAvailability.status === 'FAILED' || wishlists.status === 'FAILED') {\n const errorProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'FAILED',\n statusMessage: <WishlistItemsStatusMessage errorType='FAILED' text={wishlistErrorGettingWishlist} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(errorProps);\n }\n\n const productsList = products && (products as AsyncResult<FullProduct[]>).result;\n\n if (productsList && productsList.length === 0) {\n const emptyViewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'EMPTY',\n statusMessage: <WishlistItemsStatusMessage errorType='EMPTY' text={emptyWishlistText} />,\n heading: this._renderHeading(heading)\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IWishlistItemsViewProps = {\n ...(this.props as IWishlistItemsProps<IWishlistItemsData>),\n WishlistItems: {\n moduleProps: this.props,\n className: classnames('ms-wishlist-items', className)\n },\n status: 'SUCCESS',\n heading: this._renderHeading(heading),\n Products: {\n className: 'ms-wishlist-items__products',\n tag: 'ul'\n },\n Product: {\n className: 'ms-wishlist-items__product',\n tag: 'li'\n },\n ProductDetails: {\n className: 'ms-wishlist-items__product-link',\n tag: 'a'\n },\n telemetryContent: this.telemetryContent,\n ProductDimensions: {\n className: 'ms-wishlist-items__product-dimensions'\n },\n products: productsList && this._renderProductList(productsList),\n statusNotExistsMessage:\n productsList && this._getProductNotExists(productsList, emptyWishlistText, noLongerExitsWishlistItemText)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleHeadingChange = (event: MsDyn365.ContentEditableEvent) => (this.props.config.heading!.text = event.target.value);\n\n private _getProductNotExists(products: FullProduct[], emptytext: string, noLongerExisttext: string): JSX.Element | null {\n if (this.state && this.state.isError) {\n if (products.length === 0) {\n return <WishlistItemsStatusMessage errorType='SUCCESS' text={emptytext} />;\n }\n return (\n <WishlistItemsStatusMessage\n className={'ms-wishlist-items__message-exists-product'}\n errorType='SUCCESS'\n text={noLongerExisttext}\n />\n );\n }\n return null;\n }\n private _renderProductList(products: FullProduct[]): IWishlistItemViewProps[] {\n const {\n priceFree,\n originalPriceText,\n currentPriceText,\n addToCartButtonText,\n outOfStockText,\n removeButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n productDimensionTypeAmount\n } = this.props.resources;\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n\n return products.map((product: FullProduct, index) => {\n const currentProductProps = {\n product: product.ProductDetails,\n price: product.ProductPrice,\n context,\n wishlistState: this.state,\n productUrl: getProductUrlSync(product.ProductDetails, context.actionContext, undefined),\n imageSettings,\n removeFromWishlistText: removeButtonText,\n isInStock: this._isProductInStock(product),\n addToCartText: addToCartButtonText,\n outOfStockText,\n index,\n itemKey: `${product.ProductDetails.RecordId}-${product.ProductDetails.ItemId}-${index}`,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n enableImageProductLink,\n inventoryInformationLabel: this._inventoryLabel(product),\n inventoryLabelClassName: this._inventoryClassName(product),\n telemetryContent: this.telemetryContent,\n handlers: {\n onAddToCart: this._addItemToCart,\n onRemoveItem: this._removeItemFromWishlist,\n onDismiss: this._onDismiss\n },\n resources: {\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle: product.ProductDetails.IsGiftCard ? productDimensionTypeAmount : productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText\n }\n };\n return WishlistItem(currentProductProps)!;\n });\n }\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _renderHeading = (heading?: IHeadingData): JSX.Element | undefined => {\n if (!heading) {\n return undefined;\n }\n return (\n <MsDyn365.Text\n className='ms-wishlist-items__heading'\n tag={heading.tag || 'h2'}\n text={heading.text}\n editProps={{ onEdit: this.handleHeadingChange, requestContext: this.props.context.request }}\n />\n );\n };\n\n private readonly _addItemToCart = async (product: SimpleProduct, itemKey: string): Promise<void> => {\n const { context, data, resources, telemetry } = this.props;\n const { cart, productAvailability } = data;\n const { addedToCartSuccessMessage, addedToCartFailureMessage, invoiceInCartErrorMessage } = resources;\n\n const productInventoryInformation = this._getProductInventory({ ProductDetails: product }, productAvailability.result);\n\n if (context) {\n if (cart.result) {\n // Check if the product delivery mode is electronic\n const emailDeliveryModeCode = this.props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n\n const deliveryOptions = await getDeliveryOptionsAsync(\n {\n callerContext: this.props.context.actionContext,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(this.props.context.actionContext)\n },\n [product.RecordId]\n );\n const validateQuantity = this.isQuantityValidationRequired();\n const quantity = this.respectQuantityLimits() ? product?.Behavior?.MinimumQuantity ?? 1 : 1;\n\n const addProductToCartInput = {\n product,\n count: quantity,\n enableStockCheck: context.app.config.enableStockCheck,\n availableQuantity: productInventoryInformation\n ? productInventoryInformation.ProductAvailableQuantity.AvailableQuantity\n : 0,\n additionalProperties: { validateQuantity: validateQuantity },\n isAddEmailDeliveryItemToCart:\n ArrayExtensions.hasElements(deliveryOptions) &&\n ArrayExtensions.hasElements(deliveryOptions[0].DeliveryOptions) &&\n deliveryOptions[0].DeliveryOptions[0].Code === emailDeliveryModeCode\n };\n\n cart.result\n .addProductToCart(addProductToCartInput)\n .then(async result => {\n if (result.status === 'SUCCESS') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n } else if (result.substatus === 'MAXQUANTITY') {\n const curQuantity =\n (await cart).cart?.CartLines?.find(item => item.ProductId === product.RecordId)?.Quantity || 0;\n const maxQtyLimitReachedMessage = this._getInventoryValueMessage(productInventoryInformation, curQuantity);\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'QUANTITYLIMITS' && validateQuantity) {\n const maxQtyLimitReachedMessage = result.errorDetails?.LocalizedMessage!;\n\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: maxQtyLimitReachedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else if (result.substatus === 'INVOICEINCART') {\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || invoiceInCartErrorMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.props.telemetry.debug('[wishlist-items] Unable to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n })\n .catch(error => {\n telemetry.warning(error);\n telemetry.debug('[wishlist-items] Error trying to Update Cart Line from the wishlist');\n this.setState({\n productId: product.RecordId,\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n }\n }\n };\n\n private isQuantityValidationRequired = (): boolean => {\n const isChannelQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled || false;\n\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n return isOrderQuantityLimitsFeatureEnabled || isChannelQuantityLimitsFeatureEnabledInHq;\n };\n\n private respectQuantityLimits = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabled = this.isOrderQuantityLimitsFeatureEnabled();\n const validateLimitsPerLine = this.props.data.cartConfiguration?.result?.ValidateDefaultOrderSettingsPerLine ?? false;\n return isOrderQuantityLimitsFeatureEnabled && validateLimitsPerLine;\n };\n\n private isOrderQuantityLimitsFeatureEnabled = (): boolean => {\n const isOrderQuantityLimitsFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n\n const customerInfo = this.props.data.customerInformation.result;\n\n const isOrderQuantityLimitsFeatureEnabledInSiteSettings =\n defaultOrderQuantityLimitsFeatureConfig === 'all' ||\n ((customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))) ??\n false);\n\n return isOrderQuantityLimitsFeatureEnabledInHq && isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n };\n\n private readonly _removeItemFromWishlist = (productId: number): void => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n let noLongerLineExist: CommerceListLine[] | undefined = [];\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n const wishlistLineId = this._getWishlistLineIdFromProductId(productId);\n if (userToken && wishlists.result && wishlists.result[0] && wishlistLineId) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, [{ LineId: wishlistLineId }])\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n noLongerLineExist = this._getProductsNoLongerExists(castCommerceList);\n if (noLongerLineExist && noLongerLineExist.length > 0) {\n this._removeNoLongerExistsLines(noLongerLineExist);\n } else {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: false });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n\n private _getInventoryValueMessage(product: IProductInventoryInformation | undefined, curQuantity: number): string {\n const { context, resources } = this.props;\n const { maxQuantityLimitText } = resources;\n\n const maxQuantityForLineItem = updateMaxQuantityForCartLineItem(context.app.config.maxQuantityForCartLineItem);\n\n if (!product || !product.ProductAvailableQuantity.AvailableQuantity || !context.app.config.enableStockCheck) {\n return maxQuantityLimitText\n .replace('{maxQuantity}', maxQuantityForLineItem.toString())\n .replace('{curQuantity}', curQuantity.toString());\n }\n\n const minInventory = Math.min(maxQuantityForLineItem, product.ProductAvailableQuantity.AvailableQuantity);\n\n return maxQuantityLimitText.replace('{maxQuantity}', minInventory.toString()).replace('{curQuantity}', curQuantity.toString());\n }\n\n private _getProductInventory(\n product: FullProduct,\n productInventoryCollection: IProductInventoryInformation[] | undefined\n ): IProductInventoryInformation | undefined {\n if (productInventoryCollection && productInventoryCollection.length > 0) {\n for (const productResult of productInventoryCollection) {\n if (product.ProductDetails.RecordId === productResult.ProductAvailableQuantity.ProductId) {\n return productResult;\n }\n }\n }\n return undefined;\n }\n\n private readonly _inventoryLabel = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation) {\n return productInventoryInformation.StockLevelLabel;\n }\n }\n\n return undefined;\n };\n\n private readonly _inventoryClassName = (product: FullProduct): string | undefined => {\n const { productAvailability } = this.props.data;\n if (productAvailability && productAvailability.result) {\n const productInventoryInformation = this._getProductInventory(product, productAvailability.result);\n if (productInventoryInformation && productInventoryInformation.StockLevelCode) {\n return `ms-wishlist-items__${productInventoryInformation.StockLevelCode.toLowerCase()}`;\n }\n }\n\n return undefined;\n };\n\n private readonly _isProductInStock = (product: FullProduct): boolean => {\n const { data, context } = this.props;\n const { productAvailability } = data;\n\n if (!context.app.config.enableStockCheck) {\n return true;\n }\n\n if (!productAvailability.result || !product.ProductDetails) {\n return false;\n }\n\n for (const productResult of productAvailability.result) {\n if (\n productResult.ProductAvailableQuantity &&\n productResult.ProductAvailableQuantity.ProductId &&\n productResult.ProductAvailableQuantity.ProductId === product.ProductDetails.RecordId\n ) {\n return productResult.IsProductAvailable;\n }\n }\n\n return false;\n };\n\n private readonly _getWishlistLineIdFromProductId = (productId: number): number | null => {\n const { wishlists } = this.props.data;\n\n if (\n !wishlists.result ||\n wishlists.result.length === 0 ||\n !wishlists.result[0].CommerceListLines ||\n wishlists.result[0].CommerceListLines.length === 0\n ) {\n this.props.telemetry.error('Wishlist content is empty, module wont render.');\n return null;\n }\n\n const foundWishlistItem = wishlists.result[0].CommerceListLines.filter(commerceListLine => {\n return commerceListLine.ProductId === productId;\n });\n\n if (foundWishlistItem && foundWishlistItem[0].LineId) {\n return foundWishlistItem[0].LineId;\n }\n return null;\n };\n\n private readonly _getProductsNoLongerExists = (castCommerceList: CommerceList): CommerceListLine[] | undefined => {\n const noLongerExist: CommerceListLine[] | undefined = [];\n castCommerceList.CommerceListLines?.map(line => {\n const { products } = this.props.data;\n const productsList = products && (products as AsyncResult<FullProduct[]>).result!;\n\n const skipRemove = productsList.filter(product => product.ProductDetails.RecordId === line.ProductId);\n if (skipRemove.length === 0) {\n noLongerExist?.push({ LineId: line.LineId });\n }\n });\n return noLongerExist;\n };\n\n private readonly _removeNoLongerExistsLines = (noLongerLineExist: CommerceListLine[]) => {\n const { context, data, telemetry } = this.props;\n const { wishlists } = data;\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && wishlists.result && wishlists.result[0]) {\n removeLinesAsync({ callerContext: context.actionContext }, wishlists.result[0].Id, noLongerLineExist)\n .then(commerceList => {\n const castCommerceList: CommerceList | null = commerceList as CommerceList | null;\n if (castCommerceList && castCommerceList.Id && context.request.user.isAuthenticated) {\n context.actionContext.update(createGetByCustomerInput({}, null), [castCommerceList]);\n getItemsInWishlists(new ActiveWishlistInput(), context.actionContext)\n .then(products => {\n const castSimpleProducts: FullProduct[] | null = products as FullProduct[] | null;\n if (castSimpleProducts && castSimpleProducts.length > 0) {\n this.setState({ isError: true });\n context.actionContext.update(new ActiveWishlistInput(), castSimpleProducts);\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable to hyderate the wishlist with product information');\n telemetry.error(error);\n });\n }\n })\n .catch(error => {\n telemetry.warning('[wishlist-items] Unable remove items from the wishlist');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\"[wishlist-items] Unable remove items from the wishlist user token or lineItemID wasn't found\");\n }\n }\n };\n}\n\nexport default WishlistItems;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n ITelemetryContent,\n Module,\n Node\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IWishlistItemViewProps } from '../..';\nimport { IWishlistItemsViewProps } from './wishlist-items';\n\nconst WishlistItemsView: React.FC<IWishlistItemsViewProps> = props => {\n const {\n WishlistItems,\n status,\n statusMessage,\n heading,\n Products,\n products,\n Product,\n ProductDetails,\n ProductDimensions,\n telemetryContent,\n statusNotExistsMessage\n } = props;\n\n return (\n <Module {...WishlistItems}>\n {heading}\n {statusNotExistsMessage}\n {status !== 'SUCCESS' && statusMessage}\n {Products && products && products.length > 0 && (\n <Node {...Products}>\n {products &&\n products.map(product => {\n return product && _renderItem(product, Product, ProductDimensions, ProductDetails, telemetryContent);\n })}\n </Node>\n )}\n </Module>\n );\n};\n\nconst _renderItem = (\n product: IWishlistItemViewProps,\n Product?: INodeProps,\n ProductDimensions?: INodeProps,\n ProductDetails?: INodeProps,\n telemetryContent?: ITelemetryContent\n): JSX.Element | null => {\n const {\n key,\n productImage,\n productLink,\n productPrice,\n productDimensions,\n addToCartButton,\n removeButton,\n productStatusMessage,\n entireProductLink,\n productName,\n productAriaLabel,\n inventoryInformation,\n productUnitOfMeasure\n } = product;\n const payLoad = getPayloadObject('click', telemetryContent!, '', key);\n const productAttributes = getTelemetryAttributes(telemetryContent!, payLoad);\n if (entireProductLink) {\n return (\n <Node key={key} className={Product!.className} {...Product}>\n <Node\n href={entireProductLink}\n className={classnames('entire-product-link ', ProductDetails!.className)}\n {...productAttributes}\n aria-label={productAriaLabel}\n tag={ProductDetails!.tag}\n >\n {productImage}\n {productName}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {productUnitOfMeasure}\n </Node>\n {inventoryInformation}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n }\n return (\n <Node key={key} className={Product!.className} {...Product}>\n {productImage}\n {productLink}\n {productDimensions && ProductDimensions && (\n <Node {...ProductDimensions}>\n {productDimensions.map(dimension => {\n return dimension;\n })}\n </Node>\n )}\n {productPrice}\n {addToCartButton}\n {removeButton}\n {productStatusMessage}\n </Node>\n );\n};\n\nexport default WishlistItemsView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddToCartBehavior } from '@msdyn365-commerce/components';\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\nimport { ICartIconViewProps, ICartViewProps, IFlyoutCartLineItemViewProps } from '@msdyn365-commerce-modules/cart';\nimport { Button, getPayloadObject, INodeProps, KeyCodes, Modal, Node, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { ICartIconProps as ICartIconExtensionProps } from '../definition-extensions/cart-icon.ext.props.autogenerated';\n\n/**\n * ICartIconViewState: Interface for Cart Icon View State.\n */\ninterface ICartIconViewState {\n isModalOpen: boolean;\n}\n\n/**\n * Render Cart lines.\n * @param cartLines - Flyout cart line view props.\n * @param props - Cart icon view props.-\n * @returns JSX Element.\n */\nconst renderCartlines = (cartLines: IFlyoutCartLineItemViewProps[] | undefined, props: ICartIconViewProps): JSX.Element[] | null => {\n if (!cartLines) {\n props.context.telemetry.error('Cartlines content is empty, module wont render');\n return null;\n }\n\n return cartLines.map((cartLine, index) => {\n const cartLineIndex = index;\n return (\n <Node {...props.miniCartItemWrapper} key={cartLineIndex}>\n <Node className={classnames(cartLine.storeLocation ? 'msc-cart-line__set-net-price' : '')}>{cartLine.cartline}</Node>\n {cartLine.storeLocation}\n {cartLine.remove}\n </Node>\n );\n });\n};\n\n/**\n * Initiate total price.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\nconst renderTotalPrice = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\n const cart = props.data.cart.result ?? undefined;\n const price = cart && !cart.hasInvoiceLine && (cart.cart.TotalAmount || undefined);\n const totalPrice = price\n ? props.context.cultureFormatter.formatCurrency(price)\n : props.context.cultureFormatter.formatCurrency(props.resources.emptyPrice);\n return cart && !cart.hasInvoiceLine ? (\n <div className='ms-cart-icon__subTotalText'>\n <span className='ms-cart-icon__subTotalPriceText'>\n {props.resources.totalPriceFormatString}\n <span className='ms-cart-icon__subTotalPrice'>{totalPrice}</span>\n </span>\n </div>\n ) : (\n <></>\n );\n};\n\n/**\n * Initiate subtotal message.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\nconst renderSubtotalMessage = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\n const cart = props.data.cart.result ?? undefined;\n return cart && !cart.hasInvoiceLine ? <p className='ms-cart-icon__subtotal-message'>{props.resources.subTotalMessage}</p> : null;\n};\n\n/**\n *\n * CartIconView component.\n * @extends {React.PureComponent<ICartIconViewProps>}\n */\nexport class CartIconView extends React.PureComponent<\n ICartViewProps & ICartIconViewProps & ICartIconExtensionProps<{}>,\n ICartIconViewState\n> {\n private isAutoDisplayTriggered: boolean;\n\n private readonly cartIconRef: React.RefObject<HTMLButtonElement> = React.createRef();\n\n public constructor(props: ICartViewProps & ICartIconViewState & ICartIconViewProps & ICartIconExtensionProps<{}>) {\n super(props);\n this.isAutoDisplayTriggered = false;\n this.state = {\n isModalOpen: false\n };\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n window.addEventListener('keydown', this._escFunction, false);\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('keydown', this._escFunction, false);\n }\n }\n\n /**\n * Render Cart Item count.\n * @returns JSX Element.\n */\n public render(): JSX.Element | null {\n const cart = this.props.data.cart.result ?? undefined;\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 if (shouldShowMiniCart) {\n if (!this.isAutoDisplayTriggered) {\n // First time trigger auto mini cart.\n this.setState({ isModalOpen: true });\n this.isAutoDisplayTriggered = true;\n } else if (!this.state.isModalOpen) {\n // If modal is closed, reset the flag.\n this.isAutoDisplayTriggered = false;\n }\n }\n return (\n <Node {...this.props.miniCartWrapper} {...this.props.renderModuleAttributes(this.props)}>\n <button onClick={this._openModal} className='ms-cart-icon-wrapper msc-btn' ref={this.cartIconRef}>\n {this.props.cartIcon}\n </button>\n <Node {...this._modalContainer()}>\n <Node className='ms-cart-icon__header msc-modal__header'>\n {this.props.flyoutTitle}\n {this._renderCartItemCount(this.props)}\n {this._renderCartCloseIcon()}\n </Node>\n <Node className='ms-cart-icon__body msc-modal__body'>\n {this.props.data.cart.result?.isEmpty ? this.props.slots.emptyCart : null}\n {this.props.checkoutBlockedDueToUnavailableFunds}\n <Node {...this.props.CartlinesWrapper}>{renderCartlines(this.props.cartlines, this.props)}</Node>\n </Node>\n <Node className='ms-cart-icon__footer msc-modal__footer'>\n {this.props.slots.promoContentItem}\n {renderTotalPrice(this.props)}\n {renderSubtotalMessage(this.props)}\n {this.props.checkoutAsSignInUserButton}\n {this.props.checkoutAsGuestButton}\n {this.props.data.cart.result?.isEmpty ? null : this.props.goToCartButton}\n <Node className='ms-cart-icon__btn-section'>\n {this.props.data.cart.result?.isEmpty ? (\n <Button\n className='ms-cart-icon__btn-backtoshopping'\n href={getUrlSync('home', this.props.context.actionContext)}\n >\n {this.props.resources.continueShoppingButtonTitle}\n </Button>\n ) : null}\n </Node>\n </Node>\n </Node>\n </Node>\n );\n }\n\n /**\n * Initiate modal container.\n * @returns Inode props.\n */\n private readonly _modalContainer = (): INodeProps => {\n return {\n tag: Modal,\n placement: 'bottom-end',\n hideArrow: true,\n className: 'ms-cart-icon__minicartmodal-container',\n wrapClassName: 'ms-cart-icon__minicartmodal',\n isOpen: this.state.isModalOpen,\n toggle: this.closeModal\n };\n };\n\n /**\n * Initiate open modal.\n */\n private readonly _openModal = (): void => {\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'cart-icon', '');\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'cart-icon');\n this.setState({\n isModalOpen: true\n });\n };\n\n /**\n * Initiate close modal.\n */\n private readonly closeModal = (): void => {\n this.cartIconRef.current?.focus();\n this.setState({\n isModalOpen: false\n });\n };\n\n /**\n * Initiate cart close Icon.\n * @returns JSX Element.\n */\n private readonly _renderCartCloseIcon = (): JSX.Element | null => {\n return <Button className='ms-cart-icon__btn-close' aria-label='Close' onClick={this.closeModal} />;\n };\n\n /**\n * Render Cart Item count.\n * @param props - Cart icon view props.\n * @returns JSX Element.\n */\n private readonly _renderCartItemCount = (props: ICartIconViewProps & ICartIconExtensionProps<{}>): JSX.Element | null => {\n const defaultCartItemCount: number = 0;\n\n const cartItemlength = props.data.cart.result ? props.data.cart.result.totalItemsInCart : defaultCartItemCount;\n const cartItemCount = `${cartItemlength} ${props.resources.items}`;\n\n return <Node className='ms-cart-icon__count'>{cartItemCount}</Node>;\n };\n\n /**\n * Handle escape click to close modal.\n * @param event - On press of any key.\n */\n private readonly _escFunction = (event: KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Escape && this.state.isModalOpen) {\n this.closeModal();\n }\n };\n}\n\nexport default CartIconView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentV2SwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\n\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\n/**\n * AttributeSwatch entity interface.\n */\ninterface IAttributeSwatch {\n swatchValue?: string;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n isDefault?: boolean;\n productImageUrls?: string[];\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * CommerceProperty entity interface.\n */\ninterface ICommerceProperty {\n propertyKey?: string;\n value?: IExtensionPropertyValue;\n}\n\n/**\n * Extension property value entity interface.\n */\ninterface IExtensionPropertyValue {\n isBooleanValue?: boolean;\n byteValue?: number;\n dateTimeOffsetValue?: Date;\n decimalValue?: number;\n integerValue?: number;\n longValue?: number;\n stringValue?: string;\n}\n\n/**\n * ProductDimension entity interface.\n */\ninterface IProductDimension {\n dimensionTypeValue: number;\n dimensionValue?: IProductDimensionValue;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * ProductDimensionValue entity interface.\n */\ninterface IProductDimensionValue {\n recordId: number;\n value?: string;\n dimensionId?: string;\n colorHexCode?: string;\n imageUrl?: string;\n refinerGroup?: string;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * ProductSearchResult entity interface.\n */\nexport interface IProductSearchResult {\n itemId?: string;\n name?: string;\n price: number;\n primaryImageUrl?: string;\n recordId: number;\n trackingId?: string;\n averageRating?: number;\n totalRatings?: number;\n description?: string;\n basePrice?: number;\n minVariantPrice?: number;\n maxVariantPrice?: number;\n displayOrder?: number;\n attributeValues?: IAttributeValue[];\n defaultUnitOfMeasure?: string;\n masterProductId?: number;\n extensionProperties?: ICommerceProperty[];\n}\n\n/**\n * AttributeValue entity interface.\n */\ninterface IAttributeValue {\n name?: string;\n keyName?: string;\n unitOfMeasureSymbol?: string;\n dataTypeValue?: number;\n isBooleanValue?: boolean;\n dateTimeOffsetValue?: Date;\n floatValue?: number;\n integerValue?: number;\n textValue?: string;\n currencyValue?: number;\n currencyCode?: string;\n attributeValueId?: number;\n recordId?: number;\n swatches?: IAttributeSwatch[];\n extensionProperties?: ICommerceProperty[];\n}\n\nexport interface IProductComponentV2Props extends IComponentProps<{ product?: IProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponentV2 extends IComponent<IProductComponentV2Props> {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultColorSwatchSelected(productData?: IProductSearchResult): IAttributeSwatch | null {\n if (!productData || !productData.attributeValues) {\n return null;\n }\n\n const colorAttribute = productData.attributeValues.find(\n attributeValue => attributeValue.keyName?.toLocaleLowerCase() === DimensionTypes.color\n );\n if (!colorAttribute) {\n return null;\n }\n\n const defaultSwatch = colorAttribute.swatches?.find(item => item.isDefault === true) ?? colorAttribute.swatches?.[0];\n return defaultSwatch ?? null;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultColorSwatch(coreContext: ICoreContext, productData?: IProductSearchResult): string | undefined {\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productData?.primaryImageUrl;\n }\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n return defaultSwatch && ArrayExtensions.hasElements(defaultSwatch.productImageUrls)\n ? generateImageUrl(defaultSwatch.productImageUrls[0], coreContext.request.apiSettings)\n : productData?.primaryImageUrl;\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>{inventoryAvailabilityLabel}</span>\n </div>\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: IProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: IProductSearchResult\n): string | undefined {\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n if (dimensionToPreSelectInProductCard === DimensionTypes.none) {\n return productUrl;\n }\n\n const defaultSwatch = getDefaultColorSwatchSelected(productData);\n if (!defaultSwatch || !defaultSwatch.swatchValue) {\n return productUrl;\n }\n\n const queryString = `color=${defaultSwatch.swatchValue}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCardV2: React.FC<IProductComponentV2Props> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n\n let productUrl = getProductPageUrlSync(product?.name ?? '', product?.recordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultColorSwatch(context, product) ?? product?.primaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === DimensionTypes.color) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: IAttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {attributeValues.map((item: IAttributeValue) => {\n const dimensionTypeValue = item.keyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.recordId ?? ''}-${dimensionTypeValue}-${swatchItem.swatchValue ?? ''}`,\n value: swatchItem.swatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.swatchColorHexCode,\n imageUrl: swatchItem.swatchImageUrl,\n productImageUrls: swatchItem.productImageUrls,\n isDefault: swatchItem.isDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.swatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionToPreSelectInProductCard !== DimensionTypes.none &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault) &&\n dimensionType === DimensionTypes.color\n ) {\n swatches[0].isDefault = true;\n }\n return (\n <ProductComponentV2SwatchComponent\n context={context}\n swatches={swatches}\n onSelectDimension={updatePageAndImageUrl}\n key={item.recordId}\n />\n );\n })}\n </div>\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: IProductDimension[] = selectedSwatchItems.getValues().map<IProductDimension>(swatches => {\n return {\n dimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n dimensionValue: {\n recordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.recordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.name!)}\n aria-label={renderLabel(\n product.name,\n context.cultureFormatter.formatCurrency(product.price),\n product.averageRating,\n ratingAriaLabel,\n product.totalRatings,\n ratingCountAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image__description'>\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.primaryImageUrl,\n product.name,\n context\n )}\n </div>\n <div className='msc-product__title_description'>\n <h5 className='msc-product__title__text'>{product.name}</h5>\n {renderPrice(\n context,\n typeName,\n id,\n product.basePrice,\n product.price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.defaultUnitOfMeasure)}\n {renderDescription(product.description)}\n </div>\n </div>\n </a>\n ) : (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.name!)}\n aria-label={renderLabel(\n product.name,\n context.cultureFormatter.formatCurrency(product.price),\n product.averageRating,\n ratingAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.primaryImageUrl,\n product.name,\n context\n )}\n </div>\n <div className='msc-product__details'>\n <h5 className='msc-product__title'>{product.name}</h5>\n {renderPrice(\n context,\n typeName,\n id,\n product.basePrice,\n product.price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.defaultUnitOfMeasure)}\n </div>\n </a>\n )}\n {renderProductDimensions(product.attributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.averageRating, product.totalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.recordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n </>\n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-product__text'>{description}</p>;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources\n): JSX.Element | null {\n const price = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n />\n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext<IGeneric<IAny>>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n <Image\n requestContext={context?.actionContext.requestContext}\n {...img}\n {...imageProps}\n loadFailureBehavior='empty'\n bypassHideOnFailure\n />\n );\n}\n\nexport const ProductComponentV2: React.FunctionComponent<IProductComponentV2Props> = msdyn365Commerce.createComponentOverride<\n IProductComponentV2\n>('ProductV2', { component: ProductCardV2, ...PriceComponentActions });\n\nexport default ProductComponentV2;\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 {\n IPriceComponentResources,\n ISwatchItem,\n PriceComponent,\n ProductComponentSwatchComponent,\n RatingComponent\n} from '@msdyn365-commerce/components';\nimport {\n getCatalogId,\n IAny,\n IComponent,\n IComponentProps,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n msdyn365Commerce\n} from '@msdyn365-commerce/core';\nimport { AttributeSwatch, AttributeValue, ProductDimension, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n convertDimensionTypeToProductDimensionType,\n Dictionary,\n DimensionTypes,\n generateImageUrl,\n getProductPageUrlSync,\n IDimensionsApp,\n StringExtensions,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n format,\n getPayloadObject,\n getTelemetryAttributes,\n ITelemetryContent,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\n className?: string;\n imageSettings?: IImageSettings;\n savingsText?: string;\n freePriceText?: string;\n originalPriceText?: string;\n currentPriceText?: string;\n ratingAriaLabel?: string;\n ratingCountAriaLabel?: string;\n allowBack?: boolean;\n telemetryContent?: ITelemetryContent;\n quickViewButton?: React.ReactNode;\n productComparisonButton?: React.ReactNode;\n isEnabledProductDescription?: boolean;\n isPriceMinMaxEnabled?: boolean;\n priceResources?: IPriceComponentResources;\n inventoryLabel?: string;\n dimensionAvailabilities?: IProductsDimensionsAvailabilities[];\n swatchItemAriaLabel?: string;\n}\n\nexport interface IProductComponent extends IComponent<IProductComponentProps> {}\n\nconst PriceComponentActions = {};\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param productData - Product card to be rendered.\n * @returns The default color swatch selected if any.\n */\nfunction getDefaultSwatchSelected(coreContext: ICoreContext, productData?: ProductSearchResult): AttributeSwatch | null {\n if (!productData || !productData.AttributeValues) {\n return null;\n }\n\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const attributeSwatches = productData.AttributeValues.find(\n attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\n )?.Swatches;\n\n if (!ArrayExtensions.hasElements(attributeSwatches)) {\n return null;\n }\n\n const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[0];\n return defaultSwatch;\n}\n\n/**\n * Gets the product image from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\n if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\n return productData?.PrimaryImageUrl;\n }\n\n return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\n}\n\n/**\n * Updates the product url link to product details page.\n * @param productDetailsPageUrl - Product page url.\n * @param coreContext - Context of the module using the component.\n * @param queryString - Querystring to be added to the URL.\n * @returns The update product page url.\n */\nfunction updateProductUrl(productDetailsPageUrl: string, coreContext: ICoreContext, queryString: string): string {\n const sourceUrl = new URL(productDetailsPageUrl, coreContext.request.apiSettings.baseUrl);\n if (sourceUrl.search) {\n sourceUrl.search += `&${queryString}`;\n } else {\n sourceUrl.search += queryString;\n }\n\n const updatedUrl = new URL(sourceUrl.href);\n return updatedUrl.pathname + sourceUrl.search;\n}\n\n/**\n * Gets the react node for product unit of measure display.\n * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\n * @returns The node representing markup for unit of measure component.\n */\nfunction renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\n if (!unitOfMeasure) {\n return null;\n }\n return (\n <div className='msc-product__unit-of-measure'>\n <span>{unitOfMeasure}</span>\n </div>\n );\n}\n\n/**\n * Gets the react node for product availability.\n * @param inventoryAvailabilityLabel - The product information.\n * @returns The node representing markup for product availability.\n */\nfunction renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\n if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\n return null;\n }\n\n return (\n <div className='msc-product__availability'>\n <span>{inventoryAvailabilityLabel}</span>\n </div>\n );\n}\n\n/**\n * Renders product comparison button similar to the quick view button.\n * @param productComparisonButton - React element of the button.\n * @param product - Current product info.\n * @param catalogId - Current catalog.\n * @returns React element for the specific product.\n */\nfunction renderProductComparisonButton(\n productComparisonButton: React.ReactNode,\n product: ProductSearchResult,\n catalogId: number\n): JSX.Element | undefined {\n validateCatalogId(catalogId);\n return React.cloneElement(productComparisonButton as React.ReactElement, { product, catalogId });\n}\n\n/**\n * Gets the product page url from the default swatch selected.\n * @param coreContext - Context of the module using the component.\n * @param productUrl - Product page url for the product card.\n * @param productData - Product card to be rendered.\n * @returns The product card image url.\n */\nfunction getProductPageUrlFromDefaultSwatch(\n coreContext: ICoreContext,\n productUrl: string,\n productData?: ProductSearchResult\n): string | undefined {\n const defaultSwatch = getDefaultSwatchSelected(coreContext, productData);\n if (!defaultSwatch?.SwatchValue) {\n return productUrl;\n }\n\n const siteContext = coreContext as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\n const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\n return updateProductUrl(productUrl, coreContext, queryString);\n}\n\nconst ProductCard: React.FC<IProductComponentProps> = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n ratingAriaLabel,\n ratingCountAriaLabel,\n allowBack,\n typeName,\n id,\n telemetryContent,\n quickViewButton,\n productComparisonButton,\n isEnabledProductDescription,\n isPriceMinMaxEnabled,\n priceResources,\n inventoryLabel,\n dimensionAvailabilities,\n swatchItemAriaLabel\n}) => {\n const product = data.product;\n\n let productUrl = getProductPageUrlSync(product?.Name ?? '', product?.RecordId ?? Number.MIN_VALUE, context.actionContext, undefined);\n if (allowBack) {\n productUrl = updateProductUrl(productUrl, context, 'back=true');\n }\n const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\n const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\n const [productPageUrl, setProductPageUrl] = useState<string>(productPageUrlFromSwatch);\n const [productImageUrl, setProductImageUrl] = useState<string | undefined>(productImageUrlFromSwatch);\n React.useEffect(() => {\n setProductPageUrl(productPageUrlFromSwatch);\n setProductImageUrl(productImageUrlFromSwatch);\n }, [productUrl, productPageUrlFromSwatch, productImageUrlFromSwatch]);\n const [selectedSwatchItems] = useState(new Dictionary<DimensionTypes, ISwatchItem>());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access -- app context is generic\n const enableStockCheck = context.app.config.enableStockCheck;\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n\n /**\n * Updates the product page and Image url based on swatch selected.\n * @param coreContext - Context of the caller.\n * @param swatchItem - Dimension swatch selected.\n */\n const updatePageAndImageUrl = React.useCallback(\n (coreContext: ICoreContext, swatchItem: ISwatchItem) => {\n const dimensionType = swatchItem.dimensionType;\n selectedSwatchItems.setValue(dimensionType, swatchItem);\n if (StringExtensions.isNullOrWhitespace(swatchItem.value)) {\n return;\n }\n const queryString = `${dimensionType}=${swatchItem.value}`;\n let productPageUrlWithSwatch = '';\n if (productPageUrl.includes(dimensionType)) {\n const newUrl = new URL(productPageUrl, coreContext.request.apiSettings.baseUrl);\n newUrl.searchParams.delete(dimensionType);\n productPageUrlWithSwatch = updateProductUrl(newUrl.toString(), context, queryString);\n } else {\n productPageUrlWithSwatch = updateProductUrl(productPageUrl, context, queryString);\n }\n setProductPageUrl(productPageUrlWithSwatch);\n if (dimensionType === dimensionToPreSelectInProductCard) {\n const swatchProductImageUrl = ArrayExtensions.hasElements(swatchItem.productImageUrls)\n ? swatchItem.productImageUrls[0]\n : undefined;\n const newImageUrl = generateImageUrl(swatchProductImageUrl, coreContext.request.apiSettings);\n setProductImageUrl(newImageUrl);\n }\n },\n [selectedSwatchItems, context, productPageUrl]\n );\n\n if (!product) {\n return null;\n }\n\n /**\n * Checks if rendering the particular dimensions is allowed for product card.\n * @param dimensionType - Dimension to be displayed.\n * @returns Updates the state with new product page url.\n */\n function shouldDisplayDimension(dimensionType: string): boolean {\n const dimensionsContext = context as ICoreContext<IDimensionsApp>;\n const dimensionsToDisplayOnProductCard = dimensionsContext.app.config.dimensionsInProductCard;\n return (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n dimensionsToDisplayOnProductCard.includes(dimensionType.toLocaleLowerCase() as DimensionTypes)\n );\n }\n\n /**\n * Gets the react node for product dimension as swatch.\n * @param attributeValues - Attribute value property from product.\n * @returns The node representing markup for unit of measure component.\n */\n function renderProductDimensions(attributeValues?: AttributeValue[]): JSX.Element | null {\n if (!attributeValues) {\n return null;\n }\n\n return (\n <div className='msc-product__dimensions'>\n {attributeValues.map((item: AttributeValue) => {\n const dimensionTypeValue = item.KeyName?.toLocaleLowerCase() ?? '';\n if (!shouldDisplayDimension(dimensionTypeValue)) {\n return null;\n }\n\n const siteContext = context as ICoreContext<IDimensionsApp>;\n const dimensionToPreSelectInProductCard = siteContext.app.config.dimensionToPreSelectInProductCard;\n const dimensionType = dimensionTypeValue as DimensionTypes;\n const swatches =\n item.Swatches?.map<ISwatchItem>(swatchItem => {\n return {\n itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\n value: swatchItem.SwatchValue ?? '',\n dimensionType,\n colorHexCode: swatchItem.SwatchColorHexCode,\n imageUrl: swatchItem.SwatchImageUrl,\n productImageUrls: swatchItem.ProductImageUrls,\n isDefault: swatchItem.IsDefault,\n swatchItemAriaLabel: swatchItemAriaLabel ? format(swatchItemAriaLabel, dimensionType) : '',\n isDisabled:\n enableStockCheck &&\n dimensionAvailabilities?.find(\n dimensionAvailability => dimensionAvailability.value === (swatchItem.SwatchValue ?? '')\n )?.isDisabled\n };\n }) ?? [];\n if (\n dimensionType === dimensionToPreSelectInProductCard &&\n ArrayExtensions.hasElements(swatches) &&\n !swatches.some(swatch => swatch.isDefault)\n ) {\n swatches[0].isDefault = true;\n }\n return (\n <ProductComponentSwatchComponent\n context={context}\n swatches={swatches}\n onSelectDimension={updatePageAndImageUrl}\n key={item.RecordId}\n />\n );\n })}\n </div>\n );\n }\n\n function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\n if (quickview === null) {\n return undefined;\n }\n const selectedDimensions: ProductDimension[] = selectedSwatchItems.getValues().map<ProductDimension>(swatches => {\n return {\n DimensionTypeValue: convertDimensionTypeToProductDimensionType(swatches.dimensionType),\n DimensionValue: {\n RecordId: 0,\n Value: swatches.value\n }\n };\n });\n return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item, selectedDimensions });\n }\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, '', product.RecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\n const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\n\n return (\n <>\n {isEnabledProductDescription ? (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel,\n product.TotalRatings,\n ratingCountAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image__description'>\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n </div>\n <div className='msc-product__title_description'>\n <h5 className='msc-product__title__text'>{product.Name}</h5>\n {renderPrice(\n context,\n typeName,\n id,\n product.BasePrice,\n product.Price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText,\n isPriceMinMaxEnabled,\n priceResources\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n {renderDescription(product.Description)}\n </div>\n </div>\n </a>\n ) : (\n <a\n href={productPageUrl}\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\n aria-label={renderLabel(\n product.Name,\n context.cultureFormatter.formatCurrency(product.Price),\n product.AverageRating,\n ratingAriaLabel\n )}\n className='msc-product'\n {...attribute}\n >\n <div className='msc-product__image'>\n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n productImageUrl,\n product.PrimaryImageUrl,\n product.Name,\n context\n )}\n </div>\n <div className='msc-product__details'>\n <h5 className='msc-product__title'>{product.Name}</h5>\n {renderPrice(\n context,\n typeName,\n id,\n product.BasePrice,\n product.Price,\n savingsText,\n freePriceText,\n originalPriceText,\n currentPriceText\n )}\n {isUnitOfMeasureEnabled && renderProductUnitOfMeasure(product.DefaultUnitOfMeasure)}\n </div>\n </a>\n )}\n {renderProductDimensions(product.AttributeValues)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel, ratingCountAriaLabel)}\n {renderProductAvailability(inventoryLabel)}\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))}\n </>\n );\n};\n\nfunction renderLabel(\n name?: string,\n price?: string,\n rating?: number,\n ratingAriaLabelText?: string,\n reviewCount?: number,\n ratingCountAriaLabelText?: string\n): string {\n const reviewCountArialableText = getReviewAriaLabel(reviewCount, ratingCountAriaLabelText ?? '');\n return `${name ?? ''} ${price ?? ''} ${getRatingAriaLabel(rating, ratingAriaLabelText)}${\n reviewCountArialableText ? ` ${reviewCountArialableText}` : ''\n }`;\n}\n\nfunction renderDescription(description?: string): JSX.Element | null {\n return <p className='msc-product__text'>{description}</p>;\n}\n\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(2);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\nfunction getReviewAriaLabel(reviewCount?: number, ratingCountAriaLabelText?: string): string {\n if (reviewCount && ratingCountAriaLabelText) {\n return format(ratingCountAriaLabelText || '', reviewCount);\n }\n return '';\n}\n\nfunction renderRating(\n coreContext: ICoreContext,\n moduleTypeName: string,\n moduleId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string,\n ratingCountAriaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() || undefined;\n const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\n const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\n\n return (\n <RatingComponent\n context={coreContext}\n id={moduleId}\n typeName={moduleTypeName}\n avgRating={avgRating}\n ratingCount={numberRatings}\n readOnly\n ariaLabel={ratingAriaLabelText}\n ratingCountAriaLabel={ratingCountAriaLabelText}\n data={{}}\n />\n );\n}\n\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n id: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string,\n currentPriceText?: string,\n isPriceMinMaxEnabled?: boolean,\n priceResources?: IPriceComponentResources\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n <PriceComponent\n context={context}\n id={id}\n typeName={typeName}\n data={{ price }}\n savingsText={savingsText}\n freePriceText={freePriceText}\n originalPriceText={originalPriceText}\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\n priceResources={priceResources}\n />\n );\n}\n\nfunction renderProductPlacementImage(\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n fallbackImageUrl?: string,\n altText?: string,\n context?: ICoreContext<IGeneric<IAny>>\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Site level config can be of any type.\n const contextConfig = context?.app.config?.placeholderImageName;\n const emptyPlaceHolderImage = contextConfig as string;\n let fallbackImageSource = fallbackImageUrl;\n if (emptyPlaceHolderImage && fallbackImageUrl) {\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\n }\n const img: IImageData = {\n src: imageUrl,\n altText: altText ? altText : '',\n fallBackSrc: fallbackImageSource\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return (\n <Image\n requestContext={context?.actionContext.requestContext}\n {...img}\n {...imageProps}\n loadFailureBehavior='empty'\n bypassHideOnFailure\n />\n );\n}\n\nexport const ProductComponent: React.FunctionComponent<IProductComponentProps> = msdyn365Commerce.createComponentOverride<\n IProductComponent\n>('Product', { component: ProductCard, ...PriceComponentActions });\n\nexport default ProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { buildHydratedMockActionContext, buildMockRequest, ICoreContext, IRequestContext } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, Customer, Employee } from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\n\nimport { IHeaderData } from '../header.data';\nimport { IHeaderConfig, IHeaderResources } from '../header.props.autogenerated';\n\nconst mockRequest: IRequestContext = buildMockRequest();\nconst mockRequestURL = {\n requestUrl: new URL('https://wwww.example.com'),\n staticCdnUrl: 'https://wwww.example.com'\n};\nmockRequest.gridSettings = {\n xs: { w: 767, h: 0 },\n sm: { w: 991, h: 0 },\n md: { w: 1199, h: 0 },\n lg: { w: 1599, h: 0 },\n xl: { w: 1600, h: 0 }\n};\nmockRequest.user.isAuthenticated = true;\nmockRequest.user.signInUrl = '/signin';\nmockRequest.user.signOutUrl = '/signout';\nmockRequest.user.signUpUrl = '/signup';\n\nconst mockAnonRequest = buildMockRequest();\nmockAnonRequest.user.isAuthenticated = false;\nmockAnonRequest.user.signInUrl = '/signin';\nmockAnonRequest.user.signOutUrl = '/signout';\nmockAnonRequest.user.signUpUrl = '/signup';\nmockAnonRequest.url = mockRequestURL;\n\nconst mockSigninErrorRequest = buildMockRequest();\nmockSigninErrorRequest.user.isAuthenticated = false;\nmockSigninErrorRequest.user.retailServerErrorCode = 'Microsoft_Dynamics_Commerce_Runtime_CustomerNotFound_WhenAutoLinking';\nmockSigninErrorRequest.user.signInUrl = '/signin';\nmockSigninErrorRequest.user.signOutUrl = '/signout';\nmockSigninErrorRequest.user.signUpUrl = '/signup';\nmockSigninErrorRequest.url = mockRequestURL;\n\nconst mockActionContext = buildHydratedMockActionContext();\nmockActionContext.requestContext.url = mockRequestURL;\n\n/**\n * Method to mock auth context.\n */\n// @ts-expect-error\nexport const mockAuthContext: ICoreContext = {\n actionContext: mockActionContext,\n request: mockRequest,\n app: {\n config: {\n disableTooltip: true\n },\n routes: {\n wishlist: '/wishlist'\n }\n }\n};\n\n// @ts-expect-error\nexport const mockAnonContext: ICoreContext = {\n actionContext: mockActionContext,\n request: mockAnonRequest,\n app: {\n config: {\n disableTooltip: true\n },\n routes: {\n wishlist: '/wishlist'\n }\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment -- Due to partial mock.\n// @ts-expect-error\nexport const mockSigninContext: ICoreContext = {\n actionContext: mockActionContext,\n request: mockSigninErrorRequest,\n app: {\n config: {\n disableTooltip: true\n },\n routes: {\n wishlist: '/wishlist'\n }\n }\n};\n\nexport const mockHeaderConfig: IHeaderConfig = {\n logoLink: {\n linkUrl: {\n destinationUrl: 'https://ppe.fabrikam.com/fe'\n },\n ariaLabel: 'fabrikam'\n },\n logoImage: {\n src: 'https://img-prod-cms-mr-microsoft-com.akamaized.net/cms/api/fabrikam/imageFileData/MA1G3L'\n }\n};\n\nexport const mockResources: IHeaderResources = {\n mobileHamburgerAriaLabel: 'Mobile view hamburger aria label',\n wishlistTooltipText: 'My wishlist',\n cartLabel: 'Shopping bag, ({0}) items',\n cartQtyLabel: '({0})',\n signInLinkText: 'Sign In',\n signInLinkAriaText: 'Sign In',\n signOutLinkText: 'Sign Out',\n signOutLinkAriaText: 'Sign Out',\n shoppingAsText: 'Shopping as {0}',\n switchCustomerLinkText: 'Switch customer',\n switchCustomerLinkAriaText: 'Switch customer',\n headerPreferredStoreText: 'Select store',\n headerPreferredStoreAriaLabel: 'select preferred store',\n signInCustomerNotAuthorizedTitle: 'Error message if customer not authorized',\n signUpCustomerNotFoundTitle: 'Error message if cutsomer not found',\n signUpMultipleCustomerFoundTitle: 'Multiple customer found error msg',\n closeNotificationLabel: 'Close',\n wishlistCountLabel: '({0})',\n headerAriaLabel: 'Header'\n};\n\nexport const getMockData = (totalItemsInCart: number = 0, accountNumber: string = '2', firstName: string = ''): IHeaderData => {\n return {\n cart: <AsyncResult<ICartState>>{\n status: 'SUCCESS',\n result: {\n totalItemsInCart\n }\n },\n employee: <AsyncResult<Employee>>{\n status: 'SUCCESS',\n result: {\n Name: 'Worker'\n }\n },\n accountInformation: <AsyncResult<Customer>>{\n status: 'SUCCESS',\n result: {\n AccountNumber: accountNumber,\n FirstName: firstName\n }\n },\n storeSelectorStateManager: <AsyncResult<IStoreSelectorStateManager>>{\n status: 'SUCCESS',\n result: {}\n }\n };\n};\n\nexport const getMockErrorData = (): IHeaderData => {\n return {\n cart: <AsyncResult<ICartState>>{\n status: 'FAILED',\n result: undefined\n },\n employee: <AsyncResult<Employee>>{\n status: 'FAILED',\n result: undefined\n },\n accountInformation: <AsyncResult<Customer>>{\n status: 'FAILED',\n result: undefined\n },\n storeSelectorStateManager: <AsyncResult<IStoreSelectorStateManager>>{\n status: 'FAILED',\n result: undefined\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 MsDyn365 from '@msdyn365-commerce/core';\nimport { IHeaderViewProps, Logo } from '@msdyn365-commerce-modules/header';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IHeaderProps } from '../definition-extensions/header.ext.props.autogenerated';\n\n/**\n * GridSizes.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n *\n * HeaderView component.\n * @extends {React.PureComponent<IHeaderViewProps>}\n */\nexport class HeaderView extends React.PureComponent<IHeaderViewProps & IHeaderProps<{}>> {\n private readonly menuNode: React.RefObject<HTMLDivElement>;\n\n public constructor(props: IHeaderViewProps & IHeaderProps<{}>) {\n super(props);\n this.menuNode = React.createRef();\n }\n\n public componentDidMount(): void {\n if (this.props.config.useStickyHeader) {\n // Set header update methods to trigger on scroll\n if (MsDyn365.isBrowser) {\n window.addEventListener('scroll', () => {\n this._configureStickyHeader();\n });\n }\n this._configureStickyHeader();\n }\n }\n\n public render(): JSX.Element | null {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Cannot change the prop names as props are from business logic.\n const {\n HeaderTag,\n HeaderContainer,\n HeaderTopBarContainer,\n Divider,\n MobileMenuContainer,\n MobileMenuBodyContainer,\n MobileMenuLinksContainer\n } = this.props;\n\n return (\n <Module {...HeaderTag}>\n <Node {...HeaderContainer}>\n <Node {...HeaderTopBarContainer}>\n <div className='desktop-navicon-container' ref={this.menuNode}>\n {this._renderReactFragment(this.props.menuBar)}\n </div>\n <div className='mobile-navicon-container'>{this.props.navIcon}</div>\n {this.props.logo}\n {this._renderMobileLogo()}\n {this._renderReactFragment(this.props.search)}\n {this.props.preferredStore}\n {this.props.currentDistributor}\n {this._renderAccountBlock(this.props)}\n <Node {...Divider} />\n {this.props.cartIcon}\n {this._renderReactFragment(this.props.siteOptions)}\n </Node>\n <Node {...MobileMenuContainer}>\n <Node {...MobileMenuBodyContainer}>\n {this.props.MobileMenuHeader}\n {this._renderReactFragment(this.props.menuBar)}\n <Node {...MobileMenuLinksContainer}>\n {this.props.accountLinks ? this.props.accountLinks.map(link => link) : false}\n {this.props.siteOptions}\n {this.props.wishListIconMobile}\n {this.props.signInLink}\n {this.props.signOutLink}\n </Node>\n </Node>\n </Node>\n </Node>\n </Module>\n );\n }\n\n /**\n * Function to update header.\n */\n private readonly _configureStickyHeader = (): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const headerAlertsContainer: HTMLElement | null = document.querySelector('.ms-promo-banner');\n const bannerHeights = headerAlertsContainer ? headerAlertsContainer.offsetHeight : defaultValue;\n\n // Triggers opacity change of header\n const headerElement = document.querySelector('header .default-container');\n if (headerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > defaultValue) {\n headerElement.classList.add('lock-opaque');\n headerElement.classList.add('fixed');\n } else {\n headerElement.classList.remove('lock-opaque');\n headerElement.classList.remove('fixed');\n }\n }\n\n // Update sticky header position and opacity\n const stickyHeader: HTMLElement | null = document.querySelector('.desktop-navicon-container');\n const headerLogo: HTMLElement | null = document.querySelector('.ms-header__logo');\n\n if (stickyHeader && headerLogo) {\n // Fix center sticky header\n const navStickyPos = headerLogo.offsetHeight + bannerHeights;\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > navStickyPos) {\n stickyHeader.classList.add('fixed');\n } else {\n stickyHeader.classList.remove('fixed');\n }\n }\n };\n\n private _renderMobileLogo(): JSX.Element | null {\n const { config, context, typeName } = this.props;\n return (\n <Logo\n {...{\n link: config.logoLink,\n image: config.mobileLogoImage ?? {},\n className: 'ms-header__mobile-logo',\n gridSettings: context.request.gridSettings,\n requestContext: context.request,\n typeName\n }}\n />\n );\n }\n\n /**\n * Function to render account block.\n * @param props - IHeaderViewProps.\n * @returns Returns JSX.Element | null.\n */\n private readonly _renderAccountBlock = (props: IHeaderViewProps): JSX.Element | null => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Cannot change the prop names as props are from business logic.\n const {\n AccountInfoDropdownParentContainer,\n AccountInfoDropdownPopoverConentContainer,\n accountInfoDropdownButton,\n signInLink\n } = props;\n if (AccountInfoDropdownParentContainer) {\n const accountClassName = classnames(AccountInfoDropdownParentContainer.className, 'account-desktop');\n if (AccountInfoDropdownPopoverConentContainer) {\n return (\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\n {accountInfoDropdownButton}\n <Node {...AccountInfoDropdownPopoverConentContainer}>{this._renderAccountDropdownLinks(props)}</Node>\n </Node>\n );\n } else if (signInLink) {\n return (\n <Node {...AccountInfoDropdownParentContainer} className={accountClassName}>\n {signInLink}\n </Node>\n );\n }\n }\n return null;\n };\n\n private readonly _renderAccountDropdownLinks = (props: IHeaderViewProps): JSX.Element | null => {\n const { isOBORequest, switchCustomerLink, accountLinks, signOutLink } = props;\n if (isOBORequest) {\n return (\n <>\n {switchCustomerLink}\n {signOutLink}\n {accountLinks ? <Node className='ms-profile-button-splitter' /> : false}\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\n </>\n );\n } else {\n return (\n <>\n {accountLinks ? accountLinks.map((link: React.ReactNode) => link) : false}\n {signOutLink}\n </>\n );\n }\n };\n\n /**\n * Function to render react fragment.\n * @param items - React nodes.\n * @returns Returns JSX.Element | null.\n */\n private readonly _renderReactFragment = (items: React.ReactNode[]): JSX.Element | null => {\n return (\n <>\n {ArrayExtensions.hasElements(items)\n ? items.map((slot: React.ReactNode) => {\n return <>{slot}</>;\n })\n : null}\n </>\n );\n };\n}\n\nexport default HeaderView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* --------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n IRefineMenuViewProps,\n ISearchResultContainerV2ViewProps,\n ISortByViewProps,\n ITitleViewProps,\n ISearchResultV2ModalViewProps\n} from '@msdyn365-commerce-modules/search-result-container-v2';\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { MouseEventHandler } from 'react';\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport ProductComponentV2, { IProductSearchResult } from './components/product-v2.component';\nimport {\n ISearchResultContainerV2Props,\n ISearchResultContainerV2Resources\n} from '../definition-extensions/search-result-container-v2.ext.props.autogenerated';\n\n/**\n * DescriptionInterval.\n */\nenum DescriptionInterval {\n productDescriptionInterval = 14,\n productDescriptionIntervalRemainder0 = 0,\n productDescriptionIntervalRemainder9 = 9\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProductCards = (props: ISearchResultContainerV2ViewProps & ISearchResultContainerV2Props<{}>): JSX.Element | null => {\n return (\n <Node {...props.productsContainer}>\n {props.errorMessage}\n {props.products}\n </Node>\n );\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 */\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: IProductSearchResult): 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\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @param product - The product item data.\n * @param index - The index of each product item.\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\n * @returns The JSX Element.\n */\nconst renderProductCardsDescription = (\n props: ISearchResultContainerV2ViewProps & ISearchResultContainerV2Props<{}>,\n product: IProductSearchResult,\n index: number,\n isEnabledProductDescription?: boolean\n): JSX.Element | null => {\n const { config, context, resources, productsDimensionAvailabilities } = props;\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const breadCrumbType = props.context.app.config.breadcrumbType;\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n const classname = isEnabledProductDescription\n ? 'ms-product-search-result__item product__description'\n : 'ms-product-search-result__item';\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickView) ? props.slots.quickView[0] : undefined;\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\n ? props.slots.productComparisonButton[0]\n : null;\n\n return (\n <li className={classname} key={index}>\n <ProductComponentV2\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={config.imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={isAllowBack}\n id={props.id}\n key={product.recordId}\n typeName={props.typeName}\n data={{ product }}\n quickViewButton={quickviewslot}\n productComparisonButton={productComparisonButton}\n isEnabledProductDescription={isEnabledProductDescription}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n (dimensionAvailability: IProductsDimensionsAvailabilities[]) =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.masterProductId\n )}\n />\n </li>\n );\n};\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProducts = (props: ISearchResultContainerV2ViewProps & ISearchResultContainerV2Props<{}>): JSX.Element | null => {\n const { listPageState, data } = props;\n const activeProducts = listPageState!.activeProducts;\n const products =\n !MsDyn365.isBrowser && !ArrayExtensions.hasElements(activeProducts)\n ? (data.products.result?.products as IProductSearchResult[]) ?? []\n : activeProducts;\n if (!ArrayExtensions.hasElements(products)) {\n return null;\n }\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\n return (\n <Node {...props.productsContainer}>\n {props.errorMessage}\n <ul className='list-unstyled'>\n {products.map((product: IProductSearchResult, index: number) =>\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\n ? renderProductCardsDescription(props, product, index, true)\n : renderProductCardsDescription(props, product, index, false)\n )}\n </ul>\n </Node>\n );\n};\n\n/**\n * Render Title Count.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, titleContainer } = props;\n if (title) {\n return <Node {...titleContainer}>{title.titleCount}</Node>;\n }\n return null;\n};\n\n/**\n * Function to make filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const defaultOffset = 28;\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\n\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\n const containerHeight: number = headerHeight ?? defaultOffset;\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\n const headerElement = document.querySelector('header .lock-opaque');\n const defaultContainer = document.querySelector('header .default-container');\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\n if (refinerElement && headerElement && defaultContainer) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-Filter');\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\n } else {\n refinerElement.classList.remove('lock-Filter');\n }\n } else if (refinerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-top');\n } else {\n refinerElement.classList.remove('lock-top');\n refinerElement.classList.remove('lock-Filter');\n refinerElement.removeAttribute('style');\n }\n }\n};\n\n/**\n * Function to setup filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\n window.addEventListener('scroll', () => {\n configureStickyFilter(isMobile, isStickyHeader);\n });\n configureStickyFilter(isMobile, isStickyHeader);\n}\n\n/**\n * Function to make filter sticky.\n * @param refinerRefernce - Ref prop for filter.\n * @param toggle - Toggle function for filter menu.\n */\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\n React.useEffect(() => {\n /**\n * Function to make filter sticky.\n * @param event - Event prop for filter.\n */\n function handleClickOutside(event: Event) {\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\n toggle(event);\n }\n }\n if (MsDyn365.isBrowser) {\n document.addEventListener('click', handleClickOutside);\n }\n return () => {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n }, [refinerRefernce, toggle]);\n}\n\n/**\n * Render the category page items.\n * @param props - The view props.\n * @returns The search Result container module view.\n */\nconst SearchResultContainerView: React.FC<ISearchResultContainerV2ViewProps & ISearchResultContainerV2Props<{}>> = props => {\n const {\n searchResultContainer,\n pagination,\n productSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n titleViewProps,\n refineMenu,\n sortByOptions,\n categoryNavContainer,\n refineAndProductSectionContainer,\n featureSearchContainer,\n similarLookProduct,\n errorMessage,\n resources\n } = props;\n React.useEffect(() => {\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\n }\n }, [props]);\n const [isExpanded, setIsExpanded] = React.useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n const wrapperRefiner = React.useRef(null);\n useOutsideClick(wrapperRefiner, toggle);\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...searchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...categoryNavContainer}>\n {renderTitle(titleViewProps)}\n {renderTitleCount(titleViewProps)}\n </Node>\n )}\n {choiceSummary}\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...featureSearchContainer}>{similarLookProduct}</Node>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...searchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...categoryNavContainer}>\n {titleViewProps && renderTitle(titleViewProps)}\n {titleViewProps && renderTitleCount(titleViewProps)}\n </Node>\n )}\n <Node {...featureSearchContainer}>{similarLookProduct}</Node>\n <Node {...refineAndProductSectionContainer}>\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\n <Node className='ms-refiner-heading_title'>\n <Button\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\n aria-label='Filter'\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {resources.filterText}\n </Button>\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\n </Node>\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\n <Node className='ms-refine__footer'>\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\n </Node>\n </Node>\n\n <Node {...productSectionContainer}>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Render Search result Modal.\n * @param modalProps - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createSearchResultModal = (\n modalProps: ISearchResultV2ModalViewProps,\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\n/**\n * Render Refiner Mobile.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefinerMobile = (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\n/**\n * Render Search result Body.\n * @param props - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\n */\nconst createModalBody = (\n props: ISearchResultV2ModalViewProps,\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), renderRefinerMobile(refineMenu));\n }\n return null;\n};\n\n/**\n * Render Refiner.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\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\n/**\n * Render Refiner Footer.\n * @param props - The Refine Menu view props.\n * @param handler - The Refine menu toggle function.\n * @param resources - Resources to get the done text and aria label.\n * @returns The JSX Element.\n */\nconst renderRefinerFooter = (\n props: IRefineMenuViewProps,\n handler: MouseEventHandler,\n resources: ISearchResultContainerV2Resources\n): JSX.Element | null => {\n const { refiners } = props;\n if (refiners) {\n return (\n <Node className='ms-refine__footer__done'>\n <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\n {resources.doneText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render sort by drop down.\n * @param props - The sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\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\n/**\n * Render Title.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, titleContainer } = props;\n if (title) {\n return (\n <Node {...titleContainer}>\n <Node tag='h1' className=''>\n {title.titlePrefix}\n {title.titleText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISearchResultModalViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from '@msdyn365-commerce-modules/search-result-container';\nimport { Button, getTelemetryObject, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport React, { MouseEventHandler, useEffect, useState } from 'react';\n\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport {\n ISearchResultContainerProps,\n ISearchResultContainerResources\n} from '../definition-extensions/search-result-container.ext.props.autogenerated';\nimport { ProductComponent } from './components/product.component';\n\n/**\n * DescriptionInterval.\n */\nenum DescriptionInterval {\n productDescriptionInterval = 14,\n productDescriptionIntervalRemainder0 = 0,\n productDescriptionIntervalRemainder9 = 9\n}\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProductCards = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n return <Node {...props.ProductsContainer}>{props.products}</Node>;\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 */\nfunction 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\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @param product - The product item data.\n * @param index - The index of each product item.\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\n * @returns The JSX Element.\n */\nconst renderProductCardsDescription = (\n props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>,\n product: ProductSearchResult,\n index: number,\n isEnabledProductDescription?: boolean\n): JSX.Element | null => {\n const { config, context, resources, productsDimensionAvailabilities } = props;\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\n const breadCrumbType = props.context.app.config.breadcrumbType;\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n const classname = isEnabledProductDescription\n ? 'ms-product-search-result__item product__description'\n : 'ms-product-search-result__item';\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\n ? props.slots.productComparisonButton[0]\n : null;\n\n return (\n <li className={classname} key={index}>\n <ProductComponent\n context={context}\n telemetryContent={telemetryContent}\n imageSettings={config.imageSettings}\n freePriceText={resources.priceFree}\n originalPriceText={resources.originalPriceText}\n currentPriceText={resources.currentPriceText}\n ratingAriaLabel={resources.ratingAriaLabel}\n allowBack={isAllowBack}\n id={props.id}\n key={product.RecordId}\n typeName={props.typeName}\n data={{ product }}\n quickViewButton={quickviewslot}\n productComparisonButton={productComparisonButton}\n isEnabledProductDescription={isEnabledProductDescription}\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n priceResources={priceResources}\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\n (dimensionAvailability: IProductsDimensionsAvailabilities[]) =>\n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n </li>\n );\n};\n\n/**\n * Render Clear button for mobile viewport.\n * @param props - The view props.\n * @returns The JSX Element.\n */\nconst renderProducts = (props: ISearchResultContainerViewProps & ISearchResultContainerProps<{}>): JSX.Element | null => {\n const products = props.data.listPageState.result?.activeProducts;\n if (!products || !ArrayExtensions.hasElements(products)) {\n return null;\n }\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\n return (\n <Node {...props.ProductsContainer}>\n {props.errorMessage}\n <ul className='list-unstyled'>\n {products.map((product: ProductSearchResult, index: number) =>\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\n ? renderProductCardsDescription(props, product, index, true)\n : renderProductCardsDescription(props, product, index, false)\n )}\n </ul>\n </Node>\n );\n};\n\n/**\n * Render Title Count.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return <Node {...TitleContainer}>{title.titleCount}</Node>;\n }\n return null;\n};\n\n/**\n * Render Category Hierarchy.\n * @param props - The category hierarchy view props.\n * @returns The JSX Element.\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[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\n/**\n * Function to make filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\n // Get heights of cookie and promotion banners\n const defaultValue = 0;\n const defaultOffset = 28;\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\n\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\n const containerHeight: number = headerHeight ?? defaultOffset;\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\n const headerElement = document.querySelector('header .lock-opaque');\n const defaultContainer = document.querySelector('header .default-container');\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\n if (refinerElement && headerElement && defaultContainer) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-Filter');\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\n } else {\n refinerElement.classList.remove('lock-Filter');\n }\n } else if (refinerElement) {\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\n refinerElement.classList.add('lock-top');\n } else {\n refinerElement.classList.remove('lock-top');\n refinerElement.classList.remove('lock-Filter');\n refinerElement.removeAttribute('style');\n }\n }\n};\n\n/**\n * Function to setup filter sticky.\n * @param isMobile - The boolean prop.\n * @param isStickyHeader - The boolean prop.\n */\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\n window.addEventListener('scroll', () => {\n configureStickyFilter(isMobile, isStickyHeader);\n });\n configureStickyFilter(isMobile, isStickyHeader);\n}\n\n/**\n * Function to make filter sticky.\n * @param refinerRefernce - Ref prop for filter.\n * @param toggle - Toggle function for filter menu.\n */\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\n React.useEffect(() => {\n /**\n * Function to make filter sticky.\n * @param event - Event prop for filter.\n */\n function handleClickOutside(event: Event) {\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\n toggle(event);\n }\n }\n if (MsDyn365.isBrowser) {\n document.addEventListener('click', handleClickOutside);\n }\n return () => {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('click', handleClickOutside);\n }\n };\n }, [refinerRefernce, toggle]);\n}\n\n/**\n * Render the category page items.\n * @param props - The view props.\n * @returns The search Result container module view.\n */\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps & ISearchResultContainerProps<{}>> = props => {\n const {\n SearchResultContainer,\n pagination,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n FeatureSearchContainer,\n similarLookProduct,\n errorMessage,\n resources\n } = props;\n useEffect(() => {\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\n }\n }, [props]);\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\n const toggle = () => {\n setIsExpanded(!isExpanded);\n };\n const wrapperRefiner = React.useRef(null);\n useOutsideClick(wrapperRefiner, toggle);\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {renderTitleCount(TitleViewProps)}\n </Node>\n )}\n {choiceSummary}\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n {similarLookProduct ? null : (\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitle(TitleViewProps)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n )}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...RefineAndProductSectionContainer}>\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\n <Node className='ms-refiner-heading_title'>\n <Button\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\n aria-label='Filter'\n onClick={toggle}\n aria-expanded={isExpanded}\n tabIndex={0}\n >\n {resources.filterText}\n </Button>\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\n <div className='ms-search-result-wrapper-sort-by-category'>\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n </div>\n </Node>\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\n <Node className='ms-refine__footer'>\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\n </Node>\n </Node>\n\n <Node {...ProductSectionContainer}>\n {errorMessage}\n {props.config.enableProdutDescription ? renderProducts(props) : renderProductCards(props)}\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\n/**\n * Render Search result Modal.\n * @param modalProps - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\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\n/**\n * Render Refiner Mobile.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\n */\nconst renderRefinerMobile = (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\n/**\n * Render Search result Body.\n * @param props - The Search Result Modal view props.\n * @param refineMenu - The Refine Menu view props.\n * @param sortByDropDown - The Sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\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), renderRefinerMobile(refineMenu));\n }\n return null;\n};\n\n/**\n * Render Refiner.\n * @param props - The Refine Menu view props.\n * @returns The JSX Element.\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\n/**\n * Render Refiner Footer.\n * @param props - The Refine Menu view props.\n * @param handler - The Refine menu toggle function.\n * @param resources - Resources to get the done text and aria label.\n * @returns The JSX Element.\n */\nconst renderRefinerFooter = (\n props: IRefineMenuViewProps,\n handler: MouseEventHandler,\n resources: ISearchResultContainerResources\n): JSX.Element | null => {\n const { refiners } = props;\n if (refiners) {\n return (\n <Node className='ms-refine__footer__done'>\n <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\n {resources.doneText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\n/**\n * Render sort by drop down.\n * @param props - The sort by view props.\n * @param isRecoSearchPage - The recomandation search page flag.\n * @returns The JSX Element.\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\n/**\n * Render Title.\n * @param props - The title view props.\n * @returns The JSX Element.\n */\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <Node tag='h1' className=''>\n {title.titlePrefix}\n {title.titleText}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n"],"names":["cartLinesSortOrder","_renderDeliveryLocation","cartLine","props","deliverylocation","FulfillmentStoreId","_foundProductDelivery","orgUnitName","_getOrgUnitName","orgUnitLocations","foundProductDeliveryOption","productDeliveryOptions","length","find","deliveryOption","ProductId","delivery","DeliveryOptions","option","Code","DeliveryMode","location","Description","resources","shippingText","_renderStoreLocation","React","className","fulfillmentStoreId","foundLocation","orgUnitLocation","OrgUnitNumber","OrgUnitName","_assembleCartlines","cartlines","products","reactNodes","map","cartline","index","product","foundProductAvailability","_foundProductAvailabi","isQuantityLimitsFeatureEnabled","getProductByProductIdAndWarehouse","WarehouseId","cartState","getProductByProductId","productAvailabilites","productAvailability","_productAvailability$","ProductAvailableQuantity","push","_assembleNode","foundProductDeliveryOptions","_product$Behavior","imageSettings","gridSettings","id","typeName","context","removeButtonText","removeItemClickHandler","customerTaxPercentage","availableQuantityInStock","isStockCheckEnabled","outOfStockThreshold","AvailableQuantity","_getCartItemAvailableQuantity","maxQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","Behavior","MaximumQuantity","isServiceItem","ItemTypeValue","ReleasedProductType","Service","onRemoveClickHandler","onRemoveClickFunction","payLoad","getPayloadObject","telemetryContent","TelemetryConstant","RemoveCartItem","removeCartItemAttribute","getTelemetryAttributes","productUrl","getProductUrlSync","actionContext","undefined","MsDyn365","isBrowser","isChannelTypeB2B","requestContext","_cartline$CatalogId","fullUrl","URL","window","href","searchParams","set","CatalogId","data","hasError","Quantity","CartLineItemComponent","catalogs","currentQuantity","isOutOfStock","key","isQuantityEditable","primaryImageUrl","PrimaryImageUrl","displayMode","channelDeliveryOptionConfig","deliveryLocation","remove","Button","Object","assign","onClick","title","storeLocation","telemetry","error","async","getMiniCartData","ctx","miniCartData","cart","CartLines","hasInvoiceLine","getActiveCartProductsAction","ActiveCartProductsInput","then","catch","exception","Error","getAvailabilitiesForCartLineItems","ProductAvailabilitiesForCartLineItems","apiSettings","availableQuantity","getDeliveryOptionsForCartLineItems","ProductDeliveryOptionsForCartLineItems","deliveryOptions","CartIcon","constructor","super","retailMultiplePickUpOptionEnabled","getSortedCartLines","sortOrder","lines","descending","sort","item1","item2","_item2$LineNumber","_item1$LineNumber","LineNumber","_item1$LineNumber2","_item2$LineNumber2","_getImageSettings","viewports","xs","q","w","h","sm","lg","lazyload","_removeItemFromCartHandler","cartlineToRemove","this","result","input","cartLineIds","LineId","toString","removeCartLines","warning","debug","state","isCartValid","getTelemetryObject","request","telemetryPageName","friendlyName","payload","TelemetryEvent","CheckOut","Checkout","checkoutBySignInAttributes","contentAction","etext","GuestCheckout","checkoutByGuestAttributes","ViewShoppingBag","viewShoppingBagAttributes","_this$props$data$orgU","reaction","_this$props$data$cart","setState","_setQuantityLimitsFeatureFlag","_validateCart","componentDidUpdate","prevProps","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$r","_cart$cart$CartLines","_this$state$miniCartD","_this$state$miniCartD2","_this$props$data$chan","_this$props$data$feat","config","enableHoverCart","isAnonymousCheckout","user","isAuthenticated","signInUrl","guestCheckoutUrl","getUrlSync","cartUrl","checkoutURL","_getCheckoutURL","isCartEmpty","shouldShowMiniCart","isProductAddedToCart","app","addToCartBehavior","AddToCartBehavior","showMiniCart","emailDeliveryModeCode","channel","EmailDeliveryModeCode","cartLines","_getCartLines","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","some","includeFlyout","status","totalItemsInCart","goToCartButtonText","goToCartButtonTitle","replace","flyoutTitle","flyoutTooltip","tag","UncontrolledTooltip","placement","hideArrow","trigger","target","shouldShowCloseButton","cartPageUrl","hideAriaHidden","price","TotalAmount","priceString","totalPriceFormatString","cultureFormatter","formatCurrency","featureState","feature","Name","IsEnabled","viewProps","_objectSpread","cartIcon","CartIconComponent","cartLabel","cartQtyLabel","FlyoutContainer","CartlinesWrapper","miniCartWrapper","classnames","miniCartItemWrapper","checkoutAsSignInUserButton","disabled","checkoutButtonTitle","checkoutAsGuestButton","guestCheckoutButtonTitle","goToCartButton","checkoutBlockedDueToUnavailableFunds","totalPrice","renderView","_cart$result$cart$Ver","_cart$result","cartVersion","Version","lastValidatedCartVersion","validateCartAsync","ArrayExtensions","hasElements","ValidationResultsPairs","isAbsoluteUrl","urlCheck","returnURL","msdyn365Commerce","origin","includes","_this$props$data$cust","_this$props$data$cata","PickupDeliveryModeCode","taxPercentage","customerInformation","FlyoutCartLineItems","enableStockCheck","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","quantityDisplayString","quantityDisplayText","salesAgreementPricePrompt","inputQuantityAriaLabel","discountStringText","originalPriceText","currentPriceText","shippingChargesText","removeCartButtonText","outOfStockText","outOfRangeOneText","outOfRangeFormatText","pickupDeliveryModeCode","_featureStatuses$find","_this$props$context","featureStatuses","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","_featureStatuses$find2","customerInfo","IsB2b","__decorate","observer","_props$cartlines","cartItem","customGoToCartButton","children","Node","renderModuleAttributes","_renderCartlines","OrderTemplateActions","onRemoveOrderTemplate","handlers","itemKey","removeOrderTemplateActionHandler","onClickHandler","_renderOrderTemplateImages","orderTemplateLines","enableImageProductLink","defaultImageSettings","xl","count","slice","line","_line$productListLine","_line$fullProduct$Pro","_line$fullProduct","_line$fullProduct$Pro2","_line$fullProduct2","_line$fullProduct3","_line$fullProduct$Pro3","_line$fullProduct4","_getFallbackImageUrl","_line$fullProduct5","_context$request$app","fullProduct","_updateProductUrlCatalog","ProductDetails","productListLine","Image","alt","altText","src","fallBackSrc","getFallbackImageUrl","ItemId","OmniChannelMedia","loadFailureBehavior","productDetails","catalogId","StringExtensions","isNullOrWhitespace","_renderAriaLabel","name","modalCloseButtonReference","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","useState","onCreateButtonClick","color","ref","createOrderTemplateText","OrderTemplateNameDialog","modalOpen","isUpdateDialog","setModalOpen","dialogStrings","createOrderTemplateDialogResources","onCancel","onSuccess","onOrderTemplateCreated","parentElementRef","HeadingTag","OrderTemplateList","_updateViewport","viewport","_getViewport","isMobile","device","Type","innerWidth","md","_isChannelMultipleCatalogsFeatureEnabled","isMultipleCatalogFeatureEnabledInHq","_onDismiss","isOpen","_reloadPage","reload","_onRemoveFromOrderTemplateList","productListId","orderTemplates","token","orderTemplate","p","productList","Id","deleteAsync","callerContext","headerStatusMessage","deleteOrderTemplateFailedText","statusCssString","messageGlyph","userMessage","addEventListener","_heading$text","_heading$tag2","heading","createNewTemplateButtonText","orderTemplatesData","orderTemplateListHeading","text","orderTemplateListTitle","_heading$tag","errorProps","moduleProps","statusMessage","Waiting","Heading","h2","createOrderTemplateButton","CreateNewTemplateButtonComponent","_generateOrderTemplateNameDialogResources","templateHeaderStatusMessage","Alert","toggle","OrderTemplates","OrderTemplate","_renderOrderTemplateList","toShowItemNumber","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","removeFromOrderTemplateListText","orderTemplateState","onDismiss","orderTemplateImage","orderTemplateAriaLabel","orderTemplateName","_getOrderTemplatePageUrl","_getUrlSync","url","separator","totalLines","addToCartButton","AddOrderTemplateToCartComponent","moduleTypeName","addToCartText","addToBagText","removeButton","orderTemplateStatusMessage","OrderTemplateRender","addToBagButtonText","moduleId","closeWindowButtonText","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","orderTemplateErrorMessage","linesAddedToCartDialogResources","viewCartButtonText","orderTemplateCloseButtonText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderMessageText","TemplateList","_ref","toShowItemNumberProp","templates","setTemplates","isLoading","setIsLoading","isDisabled","setIsDisabled","counter","setCounter","quan","setQuan","Number","setToShowItemNumber","addAddresses","handleToShowItemNumer","arr","RenderOrderTemplateForMobile","viewMoreButton","productsInTemplate","actionsHeadingTemplate","RenderOrderTemplate","_ref2","showAlert","setShowAlert","toggleAlert","Modal","wrapClassName","autoFocus","fade","applicationNode","ModalHeader","deleteTemplateHeading","ModalBody","deleteSelectedOrderTemplate","cancelButton","_ref3","Module","toDisplayProdCollection","layout","ProductCollection","handleHeadingChange","event","value","_getProductsDimensionsAvailabilities","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","validValues","DimensionTypes","none","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","productCard","initProductState","productCollectionProducts","productCollection","equals","Msdyn365","_getProduct","_this$state$productsD","trace","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","quickviewSlot","slots","quickview","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","TotalRatings","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","isPriceMinMaxEnabled","priceResources","priceRangeSeparator","ProductContainer","role","productComponent","ProductComponent","freePriceText","priceFree","ratingAriaLabel","quickViewButton","dimensionAvailabilities","dimensionAvailability","_product$MasterProduc","masterProductId","MasterProductId","RecordId","isDisplayType","requestPrice","requestPriceForProductCollection","_getActivePrice","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","recommendation","headingLabel","getCatalogId","validateCatalogId","searchPageLink","seeAllButtonText","productPrices","enableAffiliationBasedPricing","shouldDisplaySeeAllButton","recommendationListId","isCarousel","carousel","headingComponent","editProps","onEdit","updatedProducts","item","getProductData","ObjectExtensions","isNullOrUndefined","productCollectionViewProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","flipperPrevLabel","flipperPrevious","flipperNextLabel","flipperNext","parentId","ProductCollectionContainer","GridComponentProps","filter","seeAllButton","_renderCarousel","carouselContainer","items","_renderProduct","_renderGrid","gridContainer","QuickOrderDrawer","_toggle","bind","isManuallyToggled","collapseProps","drawerGlyphClass","toggleGlyphClassName","animateGlyph","drawerOpenGlyph","openGlyph","closeGlyph","drawerCloseGlyph","drawerClass","toggleButtonProps","block","_generateDrawerButtonInnerMarkup","Collapse","collapseState","drawerButtonTextClass","toggleButtonClassName","moduleHeadingText","moduleDescriptionText","_generateGlyphMarkup","glyphClass","e","preventDefault","onToggle","QuickOrderFormComponent","productTextInput","quantityTextInput","quickOrderState","maxChars","disableAddtoCart","ariaLabelQuantity","ariaLabelProduct","ariaLabelAddtoCart","addQuantityPlaceholderText","handleQuantityChange","handleInputChange","handleAddToCartClick","onInputChange","onInputChangeFunction","onQuantityInputChange","onQuantityChangeFunction","productNode","type","onChange","quantityNode","pattern","maxLength","quantity","placeholder","addToCartBtn","stateMessage","messageText","QuickOrderProduct","simpleProduct","isSelected","observable","QuickOrderDesktopHeaderCellsComponent","columnWithNumberClassName","quickOrderProductNumberText","quickOrderProductText","quickOrderUnitPriceText","quickOrderUnitOfMeasureText","quickOrderQuantityText","quickOrderTotalText","quickOrderActionsText","QuickOrderMobileHeaderCellsComponent","QuickOrderTableHeaderComponent","rowClassName","headerCells","cropFocalRegion","QuickOrderTableRowProductImageComponent","_props$data$product$P","_props$imageSettings","fallbackImageUrl","containerClassName","QuickOrderExtraActionsPopupComponent","getProductPageUrlSync","QuickOrderDesktopTableRowCellComponent","_product$Dimensions","_cartLine$LineId","Dimensions","dimension","_dimension$DimensionV","DimensionValue","Value","dimensionValue","join","quickOrderProductDimensionsSeparator","Price","UnitOfMeasureSymbol","IncrementalQuantity","max","currentCount","quickOrderInputQuantityAriaLabel","decrementButtonAriaLabel","quickOrderDecrementButtonAriaLabel","incrementButtonAriaLabel","quickOrderIncrementButtonAriaLabel","isGiftCard","IsGiftCard","quickOrderRemoveItemButtonAriaLabel","QuickOrderMobileTableRowCellComponent","format","quickOrderQuantityMobileText","QuickOrderTableRowComponent","QuickOrderTableComponent","setIsMobile","isMobileView","quickOrderProducts","updateViewport","headerClassName","quickOrderProduct","QuickOrder","waitTime","dimensionUpdateQueue","FinitePromiseQueue","dimensions","cssClassNameConfigure","quickOrderCallbacks","dimensionSelectedAsync","selectedDimensionId","selectedDimensionValueId","enqueue","_updateDimensions","FinitePromiseQueueError","ProcessWasDiscardedFromTheQueue","getDropdownName","dimensionType","_getDropdownName","changeUpdatingDimension","isUpdatingDimension","_handleInputChange","query","productText","productResponse","productDimensions","inputQuantityText","quantityInput","current","HTMLInputElement","cancellableDebounce","cancel","isQuickOrderFormExpanded","_debounce","getScanResult","GetScanResultInput","channelId","_results$Product","activePrices","getActivePrices","results","Product","ProductDimensionFull","setTimeout","_addItemToCart","_this$state$productRe","_this$state$productRe3","quickOrderAddedToCartSuccessMessage","quickOrderAddedToCartFailureMessage","quickOrderPriceIsZeroMessage","_this$state$productRe2","MinimumQuantity","minimumQuantityPurchaseMessage","trafficLightsDataActionCall","atpErrorMessage","activePrice","val","_this$state$productRe4","isRequestPrice","LineDiscountGroup","_this$props$data$feat2","_this$props$context$a","isOrderQuantityLimitsFeatureEnabledInHq","isChannelQuantityLimitsFeatureEnabledInHq","isOrderQuantityLimitsFeatureEnabledInSiteSettings","getDeliveryOptionsAsync","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","defaultDeliveryOption","productAvailableQuantity","_updateAvailability","addProductToCartInput","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isAddEmailDeliveryItemToCart","deliveryMode","addProductToCart","_result$errorDetails2","inputProductText","isTwoZeroFourProd","substatus","maxQtyLimitReachedMessage","_getMaxQtyMessage","_result$errorDetails","errorDetails","LocalizedMessage","_result$errorDetails3","localizedMessage","split","trim","_getConcatenatedMaxQtyMessage","quickOrderMaxQuantityLimitText","quickOrderAlreadyItemQuantityText","_handleQuantityChange","currentValue","parseInt","inputElement","isNaN","setAttribute","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_this$state$productRe5","productDimensionTypeAmount","dimensionsToUpdate","productDimensionErrorState","otherError","clearOtherErrorState","keys","configureErrors","String","errorState","mappedDimensions","DimensionTypeValue","ExtensionProperties","selectedProduct","Promise","resolve","reject","newProduct","getSelectedVariant","SelectedVariantInput","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","variantProduct","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","ProductAvailabilitiesForSelectedVariantInput","productAvailable","_getDimensionErrorString","dimensionTypeValue","quickOrderproductDimensionTypeColorErrorMessage","quickOrderproductDimensionTypeConfigurationErrorMessage","quickOrderproductDimensionTypeSizeErrorMessage","quickOrderproductDimensionTypeAmountErrorMessage","quickOrderproductDimensionTypeStyleErrorMessage","_updateProductAvailablity","_productResponse$Dime","missingDimensions","_getConfigureErrors","quickOrderWrongQuantityErrorMsg","quickOrderOutofStockErrorMsg","RecordIds","_this$props$data$cust2","_this$props$data","getActivePricesAsync","ChannelId","Date","AccountNumber","cartLinesState","quickOrderFormClass","quickOrderFormProductContent","quickOrderFormMsgContent","quickOrderModuleHeading","quickOrderModuleDescription","quickOrderAddtobag","quickOrderProductQuantityInputLabel","quickOrderProductInputLabel","quickOrderProductDimensionTypeColor","quickOrderProductDimensionTypeConfiguration","quickOrderSelectDimensionFormatString","quickOrderProductDimensionTypeSize","quickOrderProductDimensionTypeStyle","quickOrderProductDimensionTypeAmount","quickAddQuantityPlaceholderText","productConfigureResources","selectDimensionFormatString","quickOrderProps","contentProps","isB2B","drawer","quickOrderForm","quickOrderList","_renderQuickOrderTable","form","configure","getProductConfigure","_await$this$props$dat","_initQuickOrderProducts","tableClassName","itemNumber","objectDate","day","getDate","month","getMonth","year","getFullYear","requestBody","itemId","requestedDate","ob","trafficLightsParams","TrafficLightsAtpInput","trafficLightsSlots","trafficLightsAtpaction","StatusCode","itemDiscontinuedMessage","productOfInterest","productOfInterestQuantity","enterValidQuantityMsg","console","productInventoryInfo","maxQuantityForLineItem","addedQuantity","_item$ItemId","_this$state$productRe6","minInventory","Math","min","computed","renderConfigure","containerProps","dropdowns","renderConfigureDropdown","dropdown","labelContainerProps","errors","select","renderForm","quickOrderProductContent","quickOrderMsgContent","createComponentOverride","component","_context$actionContex","_trafficLightATP$","_promotionBadge","_trafficLightATP$2","_context$request$chan","requestPriceBtn","atpData","imgURI","setImgURL","producerName","setProducerName","isBundle","setIsBundle","_imageUrl","imageUrl","generateImageUrl","isBundleProduct","_product$AttributeVal","findProducerName","AttributeValues","BooleanValue","productAttributes","filteredProductAttributeList","kcProductAttribute","identifier","_e$ExtensionPropertie","manufactuerValueforImage","eProperty","Key","StringValue","_renderProducerName","prod","_productAttributes$fi","attr","TextValue","_renderProducerKeyName","_productAttributes$fi2","urlPath","formatUrlPath","_prod$ExtensionProper","extension","pathName","requestUrl","pathname","isAddingPathWithUrl","addPathWithUrl","productDetailsPageUrl","coreContext","queryString","sourceUrl","baseUrl","search","updateProductUrl","attribute","trafficLightATP","atpMsgRes","JsonResponseObject","atpMsgResParsed","JSON","parse","extensionsProps","promotionBadge","_extensionsProps$find","attributevalues","onTelemetryClick","PromotionBadges","promotionalBadge","_renderCategoryImg","_renderProductPlacementImage","img","imageProps","itemNumberLabel","TrafficLights","lightColor","TrafficLight","isVisible","IsVisible","atpDiscontinuedMessageLabel","ATPMessage","locale","dateFormat","currency","Currency","requestPriceLabel","tabIndex","tooltipText","PriceComponent","isIncExPriceFormatEnabled","_calculateWpPrice","renderProductComparisonButton","selectedProductId","viewDetailsLabel","linkUrl","destinationUrl","linkText","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Decimal","Integer","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","forEach","selectedCriterion","isSelecting","next","rangeStart","RightValueBoundString","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","Values","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","closeButtonGlyph","_onClick","stopPropagation","currentTarget","clearAll","getAttribute","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","productListInventoryDisplay","ProductListInventoryFilteringOptions","HideOOS","choice","parent","hierarchy","_getKeyForRefinerValue","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","selectedRefinersMap","clearAllAttributes","urlBuilder","LeftValueBoundLocalizedString","choiceFormat","choiceRangeValueFormat","refinerValues","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","_formatPrice","UnitText","filterValue","refiner","amount","selected","ErrorMessage","FeatureSearchResultItem","productName","productRecordId","fallbackImage","featureSimilarDescriptionTitle","featureSimilarLooksTitle","renderProductPlacementImage","Link","ariaLabel","ModalToggle","innerRef","modalNode","returnFocusRef","returnRef","onModalToggle","zIndex","modalHeaderNode","modalTitle","modalFooterNode","ModalFooter","modalCloseButtonText","getInventoryLabel","inventoryAttribute","ProductSearchResultItems","moduleType","gridListView","inventoryLabel","swatchItemAriaLabel","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","minValue","maxValue","labels","sliderKeyString","sliderThumbs","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","minValueState","maxValueState","componentDidMount","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","currencySign","minLabel","onFocus","onBlur","maxLabel","placeholderTextMax","ariaAttributes","Slider","inForm","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","maxCheckValue","_getInputWithoutFormatting","selectedMinValue","minTouched","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","focus","touched","validationError","validationErrorRange","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","toolTipLabel","RefineItem","anchorType","_productRefinerValue$","_this$props$parentPro","_this$props$parentPro2","_this$props","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","stringify","isSingleSelect","itemTypeClassName","SourceValue","Rating","_renderRating","productCount","Count","refineMenuItemAriaLabel","toLocaleLowerCase","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","_getRefinerUrl","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","RatingComponent","avgRating","ratingCount","hideCount","readOnly","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","Separator","Title","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","_props$context$reques","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","urlTokens","pageType","_viewport","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","isLoadMore","_updateListPageState","listPageState","_this$props$config$it","_this$props$config$it2","_this$props$context$r2","querySorting","sorting","decodeURIComponent","loading","recordIds","currentPageNumber","skip","itemsPerPage","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","activeFilters","hydrateRefinersFromUrl","productId","featureProduct","_this$props$data$list","_this$props$data$list2","_this$props$data$list3","_this$props$data$list4","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","_this$props$context$r3","category","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","toLowerCase","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","skipCount","totalItems","previousText","nextText","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","_this$props$config","_validRefiners","_this$props$data$list5","_this$props$data$list6","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","refiners","_shouldHideFromRefiners","needToFilter","filteredRefiners","_refiner$Values","subRefiner","ntfRefiner","refinerCategory","activeRefiners","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","channelInventoryConfiguration","isInventorySortableAttribute","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_getChoiceSummary","_this$props$data$refi","selectedRefiners","rating","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","plpRequestPriceButton","breadCrumbType","shouldAllowBack","isPriceMinMaxFeatureState","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list7","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","_this$props$data$list8","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","_loadMoreProducts","pageNumber","info","information","_this$props$data$list9","scrollBy","gridView","listView","renderGridAndListView","listLabel","gridLabel","_this$props$data2","_renderCategoryDiscription","_category$ExtensionPr","categoryDisp","property","pending","validationErrorNotNumber","validationErrorNotRange","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","_listPageState$result","_listPageState$result2","_listPageState$result3","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r4","_this$props$context$r5","_this$props$context$r6","_newListPageState$act2","newListPageState","GetFullProductsByCollectionInput","Paging","Top","Skip","Sorting","recordId","Recommendation","includeAttributes","productResults","getCollectionProducts","Set","uniqueProducts","Array","from","_newListPageState$act3","atpDataPlpParams","GetAtpdataPlpInput","response","atpDataPlpaction","concat","ATPTrafficLights","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act4","_this$props$context$r7","_this$props$context$r8","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","componentWillUnmount","removeEventListener","_listPageState$result4","_listPageState$result5","_this$props$context$r9","_this$props$data$list10","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","loadMore","categoryDiscription","variant","VariantType","Browser","Viewport","createSearchResultModal","modalProps","isRecoSearchPage","filtersLabel","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","renderTitle","_renderTitleCount","productsLabel","_props$data$listPageS2","_props$data$listPageS3","_props$data$listPageS4","_props$context$action","krannichActiveProducts","selectedFilterCount","setSelectedFilterCount","isSelectedFilterCount","setIsSelectedFilterCount","_props$data","_props$data2","_props$data$listPageS","InfiniteScroll","threshold","pageStart","hasMore","propagateResult","onAdd","propagateError","onError","getAddToCartInputFromProps","_props$orderDetailsPr","orderDetailsProducts","salesLine","_props$catalogId","searchCriteriaInput","Context","IncludeAttributes","Ids","productSearchResultsWithImages","ProductsDataActions","productSearchResult","newProductSearchResult","newImageUrl","generateProductImageUrl","productData","_productData$BasePric","ProductTypeValue","ProductType","Variant","AdjustedPrice","BasePrice","_props$quantity","addItemsToCart","setDisabled","setItemsAddedToCartDialogOpen","setErrorMessage","addToCartInput","getCartState","addToCartResult","addProductsToCart","_validationResult$Val","_props$dialogStrings2","_props$dialogStrings3","_props$dialogStrings$2","_props$dialogStrings4","errorCount","CartsDataActions","bypassCache","ValidationFailuresByCartLines","oneErrorText","multiErrorsText","validationErrorMessage","showModal","showNotification","_props$dialogStrings$3","itemsAddedResource","goToCartText","closeButtonLabel","closeNotificationLabel","itemsAddedToCartHeaderText","headerMessageText","itemsAddedToCartFormatText","headerItemFormatText","linesAddedToCartFormatText","headerLinesFormatText","itemsAddedValidationErrorMessage","MultiItemsSuccessfullyAddedToCartNotification","navigationUrl","NotificationsManager","instance","addNotification","isNavigationToCartPageDisabled","goToCart","handleAddItemsToCartSuccess","_props$dialogStrings5","_props$dialogStrings$4","_addToCartResult$erro3","_addToCartResult$erro4","_props$dialogStrings$5","_props$dialogStrings6","buyAgainNotificationTitle","ErrorNotification","buyAgainNotificationCloseAriaLabel","failureReason","cartActionResult","AddToCartComponentActions","_event","openModal","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","shouldSkipSiteSettings","_props$productAvailab","validateQunatity","isOrderQuantityLimitsFeatureEnabled","isPriceKeyedIn","customPrice","customPriceAmount","ItemSuccessfullyAddedToCartNotification","isStatusTwoZeroFour","_addToCartResult$erro","_addToCartResult$erro2","_props$dialogStrings$","_props$dialogStrings","addOneItemToCart","AddToCartFunctionalComponent","_props$context","_props$data5","_props$dialogStrings7","_props$dialogStrings8","_props$dialogStrings9","_addToCartInput$","_props$data6","_addToCartInput$2","_addToCartInput$3","_props$dialogStrings$6","_props$dialogStrings10","_props$dialogStrings$7","_props$dialogStrings11","_props$dialogStrings$8","_props$dialogStrings12","_props$dialogStrings$9","_props$dialogStrings13","_props$dialogStrings$10","_props$dialogStrings14","_props$addToCartArial","_props$addToCartArial2","isItemsAddedToCartDialogOpen","setcustomerTaxPercentage","setAddToCartInput","disountedWpPrice","setDiscountedwpPrice","attributes","setAttributes","getAttributeValuesAsync","findAttributesValues","getCustomerTaxInfo","calculateWpPrice","_props$data3","_props$data4","tempBasePrice","tempDiscountedPrice","displayWpPrice","basePrice","CustomerContextualPrice","discountedPrice","IntegerValue","closeItemsAddedToCartDialog","customerInput","GetCustomerInput","customer","getCustomer","enabledIncExPrices","ppwPrice","oun","ounNumberForUsSite","priceComponent","wpPrice","incExcPriceFormat","popupProps","productQuantity","mode","renderModalPopup","Popup","getLinkText","AddToCart","tAttributes","buttonClassName","retrievedInput","retrieveAddToCartInput","addToCartArialLabel","isIntermediateState","shouldShowOutOfStock","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","defaultAvailableQuantity","stockLeft","includeCurrentQuantity","_props$hasAvailablePr","isProductQuantityLoading","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","_props$data7","AddToCartComponent","_getProductImageUrlFr","_getProductPageUrlFro","savingsText","getDefaultColorSwatchSelected","_colorAttribute$Swatc","colorAttribute","attributeValue","_attributeValue$KeyNa","Swatches","IsDefault","getManufacturerItemTypeName","productImageUrlFromSwatch","dimensionToPreSelectInProductCard","defaultSwatch","ProductImageUrls","getProductImageUrlFromDefaultColorSwatch","productPageUrlFromSwatch","SwatchValue","encodeURIComponent","getProductPageUrlFromDefaultSwatch","productPageUrl","setProductPageUrl","productImageUrl","setProductImageUrl","selectedSwatchItems","Dictionary","updatePageAndImageUrl","swatchItem","setValue","productPageUrlWithSwatch","newUrl","delete","swatchProductImageUrl","productImageUrls","_item$KeyName$toLocal","_item$KeyName","_item$Swatches$map","_item$Swatches","swatches","_item$RecordId","_swatchItem$SwatchVal","_swatchItem$SwatchVal2","_dimensionAvailabilit","isDefault","_swatchItem$SwatchVal3","swatch","isUnitOfMeasureEnabled","unitOfMeasureDisplayType","getRatingAriaLabel","ratingAriaLabelText","roundedRating","toFixed","getReviewAriaLabel","reviewCount","ratingCountAriaLabelText","renderLabel","availability","reviewCountArialableText","productCardimageSettings","emptyPlaceHolderImage","placeholderImageName","fallbackImageSource","image","bypassHideOnFailure","renderDescription","description","ProductComponentOOTB","AverageRating","ProductComponentSwatchComponent","onSelectDimension","savingsPriceResourceText","freePriceResourceText","originalPriceResourceText","currentPriceResourceText","IsMasterProduct","Master","Standalone","MaxVariantPrice","MinVariantPrice","log","renderPrice","unitOfMeasure","DefaultUnitOfMeasure","totalRatings","numberRatings","renderRating","inventoryAvailabilityLabel","selectedDimensions","getValues","convertDimensionTypeToProductDimensionType","renderQuickView","ProductComponentTopRated","_findProducer","producerGlobalName","globalProducerName","ProductComponentFocus","_requestPrice$linkUrl","_productAttributes$fi3","_productAttributes$fi4","toCheckValue","ootb","topRated","PurchaseLeadTimeDate","dateFormatByLocale","PODate","atpMessage","IsDiscontinuedProduct","Message","POQuantity","BulkPurchase","collapseRef","_dimensionDropDownChange","_this$collapseRef$cur","reEvaluateHeight","_toggleCollapse","hasDimensionsInProps","hasDimensionsInData","container","content","_renderCollapseContent","_renderCollapseButton","_renderCollapse","bulkPurchaseHeaderTitle","_renderMainContent","isMobileDevice","RichTextComponent","bulkPurchaseDescriptionText","_renderMatrix","_featureState$result","_this$props$data$orde","isMultipleCatalogsFeatureEnabled","ProductDimensionsMatrix","dimensionOnChange","BulkPurchaseViewComponent","CatalogLabelComponent","isB2b","catalog","CartLineItemFunctions","renderProductDimensions","DimensionStrings","productDimension","amountString","DiscountLines","discountLine","OfferId","OfferName","isSalesLine","PeriodicDiscount","EffectiveAmount","priceCurrency","EffectivePercentage","inventoryInformationLabel","inventoryCssName","inventoryLabelClassName","IsInvoiceLine","hasShippingMethod","_channelDeliveryOptio","PickupDeliveryModeCodes","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","reduce","chargeTotal","CalculatedAmount","_cartline$ChargeLines","otherCharges","chargeline","otherCharge","SalesAgreementLineRecordId","_props$context$reques2","_props$primaryImageUr","destructDimensionStrings","renderDisountLines","renderInventoryLabel","renderUnitOfMeasure","renderShippingLabel","renderOtherCharges","renderSalesAgreementPrompt","productAttribute","imgeClassName","newValue","quantityOnChange","lineIndex","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","NetPrice","salesAgreementLineId","showShippingChargesForLineItems","_generateQuantityandPrice","nodes","isCartStateReady","DiscountAmount","priceEditorResources","CartLinePriceEditor","HeaderPreferredStore","modalCloseButtonRef","handleClick","_findPreferredStoreOnClick","storeSelectorStateManager","storeSelector","storeName","preferredStore","StoreName","headerPreferredStoreText","headerPreferredStoreAriaLabel","modules","storeSelectorId","openDialog","showMapViewLink","onLocationSelected","message","Logo","_renderLogo","link","openInNewTab","rel","_renderImage","imagePropertyName","shouldSkipToMainImage","NavIcon","toggleNavBar","mobileHamburgerAriaLabel","targetId","Header","isB2BSite","handleLinkTextChange","linkIndex","_this$props$config$my","myAccountLinks","popOverRef","_toggleNavbar","_togglePopover","_keydown","mobileMenuCollapsed","signinPopoverOpen","hasSigninerror","workerName","customerName","_this$props$data$empl","worker","employee","_this$props$data$acco","accountInformation","FirstName","signUpCustomerNotFoundTitle","signUpMultipleCustomerFoundTitle","signInCustomerNotAuthorizedTitle","signinNotificationError","_getSigninNotification","wishlists","logoLink","logoImage","shouldShowWishlistCount","disableTooltip","headerToggleClass","navbarKey","cartIconSlot","_getSlot","menuBarSlot","searchSlot","wishlistCount","siteOptionsSlot","preferredStoreSlot","currentDistributorSlot","CommerceListLines","logo","wishListIconDesktop","WishListIconComponent","showButtonTooltip","wishlistTooltipText","wishlistCountLabel","isDispayWishlistCount","wishListIconMobile","navIcon","menuBar","siteOptions","HeaderTag","headerAriaLabel","HeaderContainer","HeaderTopBarContainer","Divider","MobileMenuContainer","MobileMenuHeader","MobileMenuBodyContainer","MobileMenuLinksContainer","AccountInfoDropdownParentContainer","AccountInfoDropdownPopoverConentContainer","displayName","Popover","signInLink","_getSigninButton","signOutLink","_getSignOutButton","isOBORequest","switchCustomerLink","_getSwitchCustomerButton","accountInfoDropdownButton","_getAccountInfoDropdownButton","accountLinks","_getAccountLinks","currentDistributor","slotName","SignIn","signInLinkText","signInLinkAriaText","_user$signOutUrl","SignOut","signOutLinkText","signOutUrl","signOutLinkAriaText","SwitchCustomer","isOBOAccountSelected","cookies","getAccountSelectionCookie","switchCustomerLinkAriaText","switchCustomerLinkText","getBusinessPartnerSelectionUrl","removeAccountSelectionCookie","shoppingAsText","route","param","retailServerErrorCode","signUpCustomerNotFound","signUpMultipleCustomerFound","signInCustomerNotAuthorized","retailServerErrorMessage","MyProfile","cta","editableLink","onTextChange","keyCode","KeyCodes","Escape","_renderReactFragment","slot","_renderDesktopAccountBlock","ProductComparisonPreview","_renderGreyPlaceHolders","counts","greyPlaceHoldersCount","displayGreyPlaceHolders","elements","_removeProductFromList","ProductComparisonState","removeItemById","previousState","_previousState$produc","productsData","_handleCollapseClick","_previousState$isExpa","_hasUserInteractedWithComparison","_clearAllProductsFromTheComparison","_this$props$data$acco2","_instanceId","Random","Guid","generateGuid","_displayedInstanceId","_this$props$data$acco3","_loadProducts","listModifiedEvent","subscribe","instanceId","handler","_this$props$data$acco4","unsubscribe","collapseButton","isMainContentReady","hasUserInteractedWithComparison","_getProdutComparisonDataByCatalogId","productsLimit","_getProductsLimit","subheaderText","productComparisonPreviewHeaderTextWithLimit","handleCollapseClick","productsMainInfo","_getProductsMainInfo","previewGreyPlaceHolders","productComparisonLink","clearAllProductsFromTheComparison","removeProductFromList","goToComparisonButton","_renderGoToComparisonButton","clearAllButton","_renderClearAllButton","_productData$filter","_this$props$data$acco5","GetProductsInPreviewProductComparisonInput","getProductsInPreviewProductComparisonAction","productDataByCatalogId","_getGreyPlaceHoldersCount","limit","placeHolder","productImageContainerClassName","tableRowClassName","productImageClassName","productNameClassName","productNameLink","dimensionName","convertProductDimensionTypeToDimensionTypes","removeFromComparisonButton","RemoveFromComparisonButtonComponent","productImage","_renderProductImage","productLink","productComparisonMobileProductsLimit","productComparisonDesktopProductsLimit","_product$PrimaryImage","defaultImageSettingQ","_this$state$isExpande","shouldBeExpanded","headerContainerClassName","mainContainerClassName","collapseClassName","collapseButtonClassName","footerClassName","productComparisonCompareProductsButtonText","productComparisonClearAllProductsButtonText","headerLabelClassName","ProductComparisonPreviewViewFunctionalComponent","_props$isExpanded","_props$productsMainIn","_props$productsMainIn2","productComparisonPreviewHeaderText","SpecificationDataTypeValues","ProductSpecification","CurrencyValue","CurrencyCode","_product$DateTimeOffs","isFunction","DateTimeOffsetValue","toUTCString","FloatValue","dangerouslySetInnerHTML","getRichTextHtml","_specification$DataTy","specification","_renderCurrencyCell","dateTime","_renderDateTimeCell","decimal","_renderDecimalCell","integer","_renderIntegerCell","_renderTextCell","boolean","_renderTrueFalseCell","video","productComparisonProductItemSpecificationTrue","productComparisonProductItemSpecificationFalse","RemoveFromComparisonButtonFunctionalComponent","useCallback","productComparisonRemoveProductFromListAriaLabel","SelectionType","ProductClickerDirections","ProductComparison","_clearAllProductsFromComparison","_configureBoxShadowOnScroll","_this$_tableReference","_tableReference","comparisonProductCardHeader","getElementsByClassName","tableHeaderClassName","documentElement","scrollTop","classList","add","tableHeaderLockedClassName","_handleScroll","_this$_tableHeaderRef","_tableHeaderReference","scrollTo","top","left","scrollLeft","_checkClickersState","_handleScrollClick","direction","_this$_tableBodyRefer","_this$_tableCellRefer","_document$body$parent","tableBody","_tableBodyReference","newLeftPosition","cellWidth","_tableCellReference","clientWidth","_getCellWidth","scrollPosition","ceil","minLeftPosition","maxScroll","scrollWidth","body","parentElement","currentClickerPosition","change","hoverStateLastUpdate","now","hoveringCellItemId","_handlePreviousClick","_document$body$parent2","right","_handleNextClick","_document$body$parent3","_this$_tableBodyRefer2","floor","_this$_tableBodyRefer3","_document$body$parent4","_shouldShowNextClicker","forceUpdate","_shouldShowPreviousClicker","newClickerPosition","_handleHoverIn","_hoveringCellItemId","_handleHoverOut","_goBack","backToShoppingUrl","referrer","back","specifications","_product$specificatio","specificationsList","allSpecifications","flatten","specificationNames","AttributeValueId","uniqueSpecificationNames","unique","productInfo","allDimensions","dimensionIds","actionBarClassName","clearAllProductsFromComparison","isEmptyContent","_renderHeading","_renderLoading","actionBarContainerProps","_getActionBarContainerProps","previousClicker","_renderPreviousClicker","nextClicker","_renderNextClicker","backToShopping","_renderBackToShoppingButton","emptyComparison","emptyComparisonContentSlots","_getProductComparisonDataByCatalogId","isConsentGiven","productComparisonCountText","productsMainInfoData","allUniqueDimensionIds","getProductsDimensionsIds","updatedDimensionProps","getUpdatedDimensionsProps","tableReference","tableHeaderReference","tableBodyReference","tableCellReference","shouldShowPreviousClicker","shouldShowNextClicker","handlePreviousClick","handleNextClick","handleScroll","handleHoverIn","handleHoverOut","uniqueDimensionIds","_getProductsDimensions","dimensionsProps","uniqueSpecifications","_getProductsSpecifications","specificationsProps","_getSpecificationProps","GetProductsInProductComparisonInput","getProductsInProductComparisonAction","_renderQuickView","_product$productInfo$","quickViewSlot","quickViews","defaultImageSettingsQ","_getTableHeaderProps","isHoverModeEnabled","tableHeaderCellClassName","onMouseEnter","onMouseLeave","_getTableCellProps","cellClassName","tableCellClassName","_renderProductRating","_ratingValue$reviewsC","averageRating","ratingValue","productComparisonProductItemRatingAriaLabel","reviewsCount","shouldShowFullRatingDescription","backToShoppingLabel","_getDimensionName","dimensionId","ProductDimensionType","Color","productComparisonProductItemColorDimension","Size","productComparisonProductItemSizeDimension","Style","productComparisonProductItemStyleDimension","dimensionClassName","dimensionsRowClassName","dimensionDescription","dimensionSelectionType","dimensionsAsSwatchConfiguration","productDimensionValues","productMainInfo","renderSwatch","textValue","productsDimension","_productsDimension$di","_productsDimension$di2","dimensionItems","dimensionItem","_dimensionItem$map","currentDimensionId","_productMainInfo$prod","_swatchItem$Dimension2","_swatchItem$Dimension3","_swatchItem$Dimension4","_swatchItem$Dimension5","_swatchItem$Dimension6","_swatchItem$Dimension7","_swatchItem$Dimension8","_swatchItem$Dimension9","isDefaultDimension","selectedDimension","_swatchItem$Dimension","DimensionId","ColorHexCode","ImageUrl","_dimensionItem$Dimens","_dimensionItem$Dimens2","productDimensionSeperatorValue","productDimensionSeparator","dimensionProps","node","specificationClassName","specificationsRowClassName","specificationValues","_productMainInfo$prod2","productSpecification","productSpecifications","productComparisonTitle","productComparisonLoadingText","productComparisonClearAllButtonAriaLabel","productComparisonClearAllButtonText","tableClickerClassName","onKeyUp","productComparisonPreviousProduct","productComparisonNextProduct","_renderRemoveFromComparisonButton","productRowClassName","currentCatalogId","productUrlLink","_product$productInfo$2","_dimension$DimensionV2","isFromCurrentCatalog","productPriceClassName","cellNewWidth","style","width","minWidth","maxWidth","cellContainerProps","productPrice","productComparisonProductItemFreePrice","productComparisonProductItemOriginalPrice","productComparisonProductItemCurrentPrice","quickView","goToProductDetailsButton","productComparisonGoToProductDetailsButtonText","tableCellProps","tableHeaderProps","productRating","productDescription","_renderProductDescription","tableBodyClassName","tableRowContentClassName","tableRowContentInformationClassName","renderDynamicHeaderCells","values","headerName","tabindex","renderDynamicCells","ProductComparisonViewFunctionalComponent","_props$productsMainIn5","_props$dimensionsProp","_props$specifications","_props$productsMainIn8","_props$productsMainIn9","actionsClassName","onScroll","_props$productsMainIn3","_props$productsMainIn4","productComparisonProductItemRating","_props$productsMainIn6","_props$productsMainIn7","productComparisonProductItemDescription","specificationProps","isNullOrEmpty","productComparisonProductItemSku","PromoBannerCloseButton","closeButtonAriaLabel","PromoBannerClose","PromoBannerLinks","links","editableLinks","_mapEditableLinks","linkdata","PromoBannerText","PromoBanner","animating","activeIndex","handleTextChange","bannerMessages","_next","nextIndex","_isLastItem","_goToIndex","_previous","_isFirstItem","dismissEnabled","interval","hideFlipper","autoplay","bannerText","bannerAriaLabel","handleLinks","handleText","promoBannerProps","promoBannerTextProps","promoBannerLinksProps","promoBannerText","carouselProps","Carousel","previous","onIndicatorsClickHandler","hideIndicator","closeButton","slides","AddToCartProductListComponent","_quickOrderTemplate$q","_quickOrderTemplate$q2","quickOrderTemplate","quickOrderTemplateLines","buttonLabel","quickOrderGridBuySelectedButtonText","buttonAriaLabel","quickOrderGridBuySelectedButtonAriaLabel","_props$resources$quic","_props$resources$quic2","_props$resources$quic3","_props$resources$quic4","_props$resources$quic5","_props$resources$quic6","_props$resources$quic7","_props$resources$free","_props$resources$orig","_props$resources$curr","_props$resources$adde","_props$resources$quic8","_props$resources$quic9","quickOrderGridGoToCartText","continueShoppingText","quickOrderGridDialogCloseText","quickOrderGridBuySelectedAddingToCartErrorNotificationCloseAriaLabel","headerItemOneText","quickOrderGridSingleItemText","quickOrderGridMultiLineItemFormatText","quickOrderGridMultiLinesFormatText","quickOrderGridHeaderMessageText","addedQuantityText","quickOrderGridBuySelectedAddingToCartErrorNotificationTitle","getDialogStrings","orderDetailProducts","quickOrder","orderDetails","quickLine","_quickLine$fullProduc","OrderDetailsProduct","getOrderDetails","getQuickOrderGridAddToCartDialog","moduleClassName","removeActionHandler","removeProductList","removeQuickOrderList","QuickOrderGridDrawer","_props$collapseProps$","_props$collapseProps","_isManuallyToggled","_drawerGlyphClass","isAnimateGlyph","_drawerOpenGlyph","_drawerCloseGlyph","drawerButtonClassName","isCollapseState","headingDrawerClass","descriptionDrawerClass","QuickOrderGridFormComponent","quickOrderGridState","isAddtoListDisabled","handleAddProductListClick","addToListBtn","QuickOrderGridProduct","productLine","QuickOrderGridDesktopHeaderCellsComponent","quickOrderGridProductNumberText","quickOrderGridProductText","quickOrderGridUnitPriceText","quickOrderGridUnitOfMeasureText","quickOrderGridQuantityText","quickOrderGridActionsText","QuickOrderGridMobileHeaderCellsComponent","QuickOrderGridTableHeaderComponent","QuickOrderGridTableRowProductImageComponent","_props$data$product$p","setShowPreviousActions","onChangeHandler","onChangeQuantity","onRemoveHandler","onRemoveItem","quickOrderGridProductKey","QuickOrderGridExtraActionsPopupComponent","_props$data$product$p2","quickOrderGridViewDetailsButtonAriaLabel","quickOrderGridViewDetailsButtonText","shouldShowActions","setShowActions","onClickViewDetails","shouldShowActionsNewValue","actionsContainerClassName","quickOrderGridRemoveItemButtonAriaLabel","QuickOrderGridDesktopTableRowCellComponent","_props$data$product$p3","_productListLine$Line","quickOrderGridProductDimensionsSeparator","renderProductPrice","UnitOfMeasure","quickOrderGridInputQuantityAriaLabel","quickOrderGridDecrementButtonAriaLabel","quickOrderGridIncrementButtonAriaLabel","callbacks","QuickOrderGridMobileTableRowCellComponent","_props$data$product$p4","_productListLine$Line2","QuickOrderGridTableRowComponent","QuickOrderGridTableComponent","quickOrderGridProducts","_quickOrderProduct$pr","_quickOrderProduct$pr2","ProductPrice","callBacks","QuickOrderGrid","_waitTime","_dimensionUpdateQueueMaxLength","_errorCssClass","_errorCssGlyphClass","_dimensionUpdateQueue","_dimensions","_cssClassNameConfigure","_className","_quickOrderGridCallbacks","_quickOrderGridRowCallbacks","_removeItemRowFromTable","productListLineId","_changeRowQuantity","_removeProductList","ProductListsDataActions","_updateStatusState","quickOrderGridDeleteProductListFailedText","_cancellabelDebounce","isQuickOrderGridFormExpanded","_quantityInput","Configuration","hasProductDimensions","dimensionKey","_this$_updateDimensio","amountErrorMessage","quickOrderGridproductDimensionTypeAmountErrorMessage","quickOrderGridproductDimensionTypeColorErrorMessage","quickOrderGridproductDimensionTypeConfigurationErrorMessage","quickOrderGridproductDimensionTypeSizeErrorMessage","quickOrderGridproductDimensionTypeStyleErrorMessage","quickOrderGridWrongQuantityErrorMsg","quickOrderTemplateLinesData","orderLineIndex","newProductListLine","previousQuantity","newLine","updatedLines","updatedProductList","ProductListLines","update","ActiveProductListInput","ProductListId","_addItemToProductListLine","quickOrderGridAddedToGridSuccessMessage","quickOrderGridAddedToGridFailureMessage","quickOrderGridAddedToGridDuplicateError","_productResponse$Defa","_createProductList","AddItemToProductListInput","addItemToProductListAction","CreateProductListInput","ProductListType","createProductList","_productTextInput","_telemetryContent","_quickOrderGridFormClass","_quickOrderGridFormProductContent","_quickOrderGridFormMsgContent","quickOrderGridModuleHeading","quickOrderGridModuleDescription","quickOrderGridAddtogrid","quickOrderGridProductQuantityInputLabel","quickOrderGridProductInputLabel","quickOrderGridProductDimensionTypeColor","quickOrderGridProductDimensionTypeConfiguration","quickOrderGridSelectDimensionFormatString","quickOrderGridProductDimensionTypeSize","quickOrderGridProductDimensionTypeStyle","quickOrderGridProductDimensionTypeAmount","quickOrderGridModulePageHeading","header","quickOrderGridProps","isB2bCustomer","actions","bulkPurchase","_renderBulkPurchase","quickOrderGridForm","quickOrderGridFormProductContent","quickOrderGridFormMsgContent","_renderListContainer","orderActions","_renderQuickOrderGridActions","quickOrderGridDeleteButtonText","addProductListToBag","QuickOrderGridActionsView","isBulkPurchaseEnabled","bulkPurchaseSlots","containerClass","_initQuickOrderGridProducts","quickOrderGridProduct","quickOrderMessageContent","HistogramItems","ratingsSummary","totalRatingsCount","renderItem","star5Count","star4Count","star3Count","star2Count","star1Count","stars","totalCount","percentage","formattedPercent","Intl","NumberFormat","barItemAriaLabel","starLabel","bar","Progress","buttonProps","AverageRatingNumber","summary","TotalReviews","RatingsHistogram","selectFilterBy","completeClass","classname","histogramItems","averageRatingAriaLabel","averageNumber","totalReviews","ratingsSummaryProps","histogramProps","filterKey","createRatingsReviewsStateInput","histogramItem","WishlistItemDimension","WishListItemActions","onAddToCart","formattedPrice","renderProductLink","renderInventoryInformationLabel","WishlistItemAddToCartButtonComponent","isInStock","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","WishlistItem","wishlistState","_props$product$Dimens","_getFullProductLink","_renderProductDimensions","_renderPrice","productUnitOfMeasure","entireProductLink","productAriaLabel","inventoryInformation","productStatusMessage","WishlistItemsStatusMessage","errorType","WishlistItems","addedToCartSuccessMessage","addedToCartFailureMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","_product$Behavior$Min","validateQuantity","isQuantityValidationRequired","respectQuantityLimits","_await$cart$cart","curQuantity","_getInventoryValueMessage","_this$props$data$cart2","validateLimitsPerLine","cartConfiguration","ValidateDefaultOrderSettingsPerLine","_removeItemFromWishlist","noLongerLineExist","userToken","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","commerceList","castCommerceList","_getProductsNoLongerExists","_removeNoLongerExistsLines","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","isError","_inventoryLabel","StockLevelLabel","_inventoryClassName","StockLevelCode","_isProductInStock","productResult","IsProductAvailable","foundWishlistItem","commerceListLine","_castCommerceList$Com","noLongerExist","emptyWishlistText","wishlistErrorGettingWishlist","noLongerExitsWishlistItemText","emptyViewProps","Products","ProductDimensions","_renderProductList","statusNotExistsMessage","_getProductNotExists","emptytext","noLongerExisttext","addToCartButtonText","currentProductProps","maxQuantityLimitText","productInventoryCollection","_renderItem","CartIconView","cartIconRef","_modalContainer","closeModal","_openModal","_this$cartIconRef$cur","_renderCartCloseIcon","_renderCartItemCount","cartItemCount","_escFunction","isAutoDisplayTriggered","_this$props$data$cart3","_this$props$data$cart4","isEmpty","emptyCart","cartLineIndex","promoContentItem","_props$data$cart$resu","emptyPrice","renderTotalPrice","_props$data$cart$resu2","subTotalMessage","renderSubtotalMessage","continueShoppingButtonTitle","renderCartlines","_colorAttribute$swatc","_colorAttribute$swatc2","_colorAttribute$swatc3","attributeValues","_attributeValue$keyNa","keyName","renderProductUnitOfMeasure","adjustedPrice","_context$app$config","contextConfig","ProductComponentV2","_product$name","_product$recordId","isEnabledProductDescription","MIN_VALUE","swatchValue","defaultUnitOfMeasure","_item$keyName$toLocal","_item$keyName","_item$swatches$map","_item$swatches","shouldDisplayDimension","_item$recordId","_swatchItem$swatchVal","_swatchItem$swatchVal2","swatchColorHexCode","swatchImageUrl","_swatchItem$swatchVal3","ProductComponentV2SwatchComponent","getDefaultSwatchSelected","_productData$Attribut","_attributeSwatches$fi","attributeSwatches","_product$Name","_product$RecordId","swatchProductImageUrls","getProductImageUrlFromDefaultSwatch","mockRequest","buildMockRequest","mockRequestURL","staticCdnUrl","signUpUrl","mockAnonRequest","mockSigninErrorRequest","mockActionContext","buildHydratedMockActionContext","HeaderView","_configureStickyHeader","headerAlertsContainer","querySelector","bannerHeights","offsetHeight","headerElement","stickyHeader","headerLogo","navStickyPos","_renderAccountBlock","accountClassName","_renderAccountDropdownLinks","menuNode","useStickyHeader","_renderMobileLogo","_config$mobileLogoIma","mobileLogoImage","DescriptionInterval","renderProductCards","productsContainer","renderProductCardsDescription","_props$data$products$","_props$data$featureSt","isAllowBack","quickviewslot","renderProducts","_data$products$result","_data$products$result2","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","renderTitleCount","titleContainer","configureStickyFilter","isStickyHeader","headerContainer","headerHeight","defaultContainer","refinerElement","clientHeight","removeAttribute","refineMenuContainer","refinerSectionContainer","renderRefinerMobile","renderRefinerFooter","doneAriaLabel","doneText","sortingContainer","searchResultContainer","productSectionContainer","titleViewProps","categoryNavContainer","refineAndProductSectionContainer","featureSearchContainer","useStickyFilter","stickyFilterSetup","enableStickyHeader","setIsExpanded","wrapperRefiner","refinerRefernce","handleClickOutside","contains","useOutsideClick","enableProdutDescription","filterText","useEffect"],"sourceRoot":""}