{"version":3,"file":"static/js/15.2538e8e14ed414602790.chunk.js","mappings":"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","sources":["webpack://venchi-ecommerce-msdyn365/./src/themes/venchi/utilities/popup/Popup.tsx?8e42","webpack://venchi-ecommerce-msdyn365/./src/themes/venchi/views/components/product.component.tsx?a3c6","webpack://venchi-ecommerce-msdyn365/./src/modules/media-gallery/media-gallery.tsx?24d7","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/order-template.view.tsx?a45e","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template-list/components/create-order-template.tsx?ea38","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template-list/order-template-list.tsx?18d0","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template-list/order-template-list.view.tsx?103b","webpack://venchi-ecommerce-msdyn365/./src/modules/gift-with-purchase/gift-with-purchase.tsx?4361","webpack://venchi-ecommerce-msdyn365/./src/modules/media-gallery/media-gallery.view.tsx?5061","webpack://venchi-ecommerce-msdyn365/./src/modules/active-image-utilities/active-product.tsx?69b2","webpack://venchi-ecommerce-msdyn365/./src/modules/active-image-utilities/additional-content.tsx?6946","webpack://venchi-ecommerce-msdyn365/./src/modules/active-image-utilities/image-mapper.tsx?dd86","webpack://venchi-ecommerce-msdyn365/./src/modules/active-image/active-image.tsx?00d3","webpack://venchi-ecommerce-msdyn365/./src/modules/carousel/carousel.tsx?80d4","webpack://venchi-ecommerce-msdyn365/./src/modules/cart/actions/get-pickup-options-for-cartlines.ts?acad","webpack://venchi-ecommerce-msdyn365/./src/modules/cart/components/cart-pick-up-in-store.tsx?dca8","webpack://venchi-ecommerce-msdyn365/./src/modules/cart/components/cart-line-items.tsx?f6b2","webpack://venchi-ecommerce-msdyn365/./src/modules/cart/components/cart-line-groups.tsx?f076","webpack://venchi-ecommerce-msdyn365/./src/modules/cart/utils/get-promotion-in-cart.ts?4195","webpack://venchi-ecommerce-msdyn365/./src/modules/cart/cart.tsx?d4e4","webpack://venchi-ecommerce-msdyn365/./src/modules/cart/components/cart-line-items-promotion.tsx?80d9","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/add-line/add-line.tsx?5f8a","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/add-line/dropdown.tsx?1cba","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/add-line/not-found.tsx?392d","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/common/order-template-quantity.tsx?99a1","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/add-line/product-configuration.tsx?b256","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/add-line/product-list.tsx?4284","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/bulk-actions.tsx?dbe8","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/order-template-actions.tsx?8136","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/order-template-lines.tsx?3703","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/order-template-lines-status-message.tsx?2986","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/order-template-table-heading.tsx?665c","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/order-template.tsx?4ecb","webpack://venchi-ecommerce-msdyn365/./src/modules/product-collection/product-collection.tsx?4008","webpack://venchi-ecommerce-msdyn365/./src/search-state.ts?dd10","webpack://venchi-ecommerce-msdyn365/./src/modules/search/actions/get-auto-suggest-suggestions.ts?4735","webpack://venchi-ecommerce-msdyn365/./src/modules/search/components/search.categorysuggest.tsx?c65d","webpack://venchi-ecommerce-msdyn365/./src/modules/search/components/search.form.tsx?25a5","webpack://venchi-ecommerce-msdyn365/./src/modules/search/components/search.keywordsuggest.tsx?297c","webpack://venchi-ecommerce-msdyn365/./src/modules/search/components/search.label.tsx?0c17","webpack://venchi-ecommerce-msdyn365/./src/modules/search/components/search.productsuggest.tsx?2af9","webpack://venchi-ecommerce-msdyn365/./src/modules/search/search.tsx?72fb","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/utilities.ts?8569","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/choice-summary.tsx?3f71","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/error-message.tsx?6302","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/feature-search-result-item.tsx?71fa","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/link.tsx?52c2","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/modal.tsx?d78e","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/product-search-result-items.tsx?5174","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/range-refine-item.tsx?6288","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/refine-item.tsx?a594","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/range-refine-item-input.tsx?09aa","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/refine-submenu.tsx?1292","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/separator.tsx?4ea6","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/components/title.tsx?c269","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/search-result-container.tsx?7500","webpack://venchi-ecommerce-msdyn365/./src/modules/video-player/components/additional-content.tsx?b368","webpack://venchi-ecommerce-msdyn365/./src/modules/video-player/video-player.tsx?53e5","webpack://venchi-ecommerce-msdyn365/./src/modules/wishlist-items/components/wishlist-items-dimensions.tsx?15c5","webpack://venchi-ecommerce-msdyn365/./src/modules/wishlist-items/components/wishlist-item.tsx?d2da","webpack://venchi-ecommerce-msdyn365/./src/modules/wishlist-items/components/wishlist-items-status-message.tsx?cdb3","webpack://venchi-ecommerce-msdyn365/./src/modules/wishlist-items/wishlist-items.tsx?df8b","webpack://venchi-ecommerce-msdyn365/./src/modules/gift-with-purchase/gift-with-purchase.view.tsx?55d6","webpack://venchi-ecommerce-msdyn365/./src/themes/venchi/views/product-collection.view.tsx?495a","webpack://venchi-ecommerce-msdyn365/./src/themes/venchi/views/search-result-container.view.tsx?5f49","webpack://venchi-ecommerce-msdyn365/./src/modules/active-image/active-image.view.tsx?a935","webpack://venchi-ecommerce-msdyn365/./src/modules/carousel/carousel.view.tsx?d82f","webpack://venchi-ecommerce-msdyn365/./src/modules/cart/cart.view.tsx?d8c2","webpack://venchi-ecommerce-msdyn365/./src/modules/product-collection/product-collection.view.tsx?5d36","webpack://venchi-ecommerce-msdyn365/./src/modules/search-result-container/search-result-container.view.tsx?b779","webpack://venchi-ecommerce-msdyn365/./src/modules/search/search.view.tsx?1505","webpack://venchi-ecommerce-msdyn365/./src/modules/video-player/video-player.view.tsx?fedb","webpack://venchi-ecommerce-msdyn365/./src/modules/wishlist-items/wishlist-items.view.tsx?4d80","webpack://venchi-ecommerce-msdyn365/./src/modules/adventureworks/views/media-gallery.view.tsx?7624","webpack://venchi-ecommerce-msdyn365/./src/themes/venchi/views/components/cartlineitem.component.tsx?e58f","webpack://venchi-ecommerce-msdyn365/./src/modules/fabrikam/views/components/cartlineitem.component.tsx?eb8c","webpack://venchi-ecommerce-msdyn365/./src/modules/fabrikam/views/components/promocode.component.tsx?d9d6","webpack://venchi-ecommerce-msdyn365/./src/modules/media-gallery/utils/helper.ts?b895","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template/components/add-line/spinner.tsx?b423","webpack://venchi-ecommerce-msdyn365/./src/validate-cart.ts?cd50","webpack://venchi-ecommerce-msdyn365/./src/invoice-summary-lineitem.tsx?5f61","webpack://venchi-ecommerce-msdyn365/./src/order-summary-lineitem.tsx?8a98","webpack://venchi-ecommerce-msdyn365/./src/Common/get-product.ts?0a21","webpack://venchi-ecommerce-msdyn365/./src/modules/media-gallery/utils/get-valid-product-images.ts?a364","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template-list/components/order-template-list.tsx?86c4","webpack://venchi-ecommerce-msdyn365/./src/modules/order-template-list/components/orderTemplateList-status-message.tsx?183c"],"sourcesContent":["import { getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Modal, ModalBody, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport { Image } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\nimport { IPopupProps } from './Popup.props';\r\n\r\nexport const Popup = (popupProps: IPopupProps) => {\r\n const {\r\n dialogStrings,\r\n className,\r\n imageSettings,\r\n gridSettings,\r\n data: { product },\r\n productQuantity,\r\n modalOpen,\r\n setModalOpen,\r\n context\r\n } = popupProps;\r\n\r\n if (!dialogStrings || !product) {\r\n return null;\r\n }\r\n const closeModal = () => {\r\n setModalOpen(false);\r\n };\r\n const fallbackImageUrl = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const quantity = productQuantity !== undefined ? productQuantity : 1;\r\n const itemsString =\r\n quantity === 1 ? dialogStrings.headerItemOneText : dialogStrings.headerItemFormatText.replace('{0}', quantity.toString());\r\n\r\n // console.log(product.AttributeValues?.slice());\r\n const tags = ['20Glutenfree', '18Vegan', '22Noaddedsugar'];\r\n const tagFriendlyNames = ['Gluten free', 'Vegan friendly', 'Light'];\r\n const specificationsList = ['25Productdescription(webs', '17Nutritionalvalues', '15Ingredients'];\r\n const specificationsListFiendly = ['Description', 'Nutritional values', 'Ingredients'];\r\n return (\r\n \r\n \r\n {itemsString}\r\n {dialogStrings.headerMessageText}\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n

{product.Name}

\r\n
\r\n {context.cultureFormatter.formatCurrency(product.Price)}{' '}\r\n
\r\n
\r\n {// @ts-ignore\r\n product.AttributeValues?.slice()?.map((item, i) => {\r\n if (item.KeyName && tags.includes(item.KeyName) && item.TextValue !== 'No') {\r\n const tagFriendlyName = tagFriendlyNames[tags.indexOf(item.KeyName)];\r\n const tagId = tagFriendlyName.replace(/\\s+/g, '');\r\n return (\r\n <>\r\n {tagFriendlyName}\r\n \r\n );\r\n }\r\n })}\r\n
\r\n\r\n
\r\n {// @ts-ignore\r\n product.AttributeValues?.slice()?.map((item, i) => {\r\n if (item.KeyName && specificationsList.includes(item.KeyName) && item.TextValue !== 'No') {\r\n const specificationFriendlyName = specificationsListFiendly[specificationsList.indexOf(item.KeyName)];\r\n const specificationId = specificationFriendlyName.replace(/\\s+/g, '');\r\n return (\r\n
\r\n

{specificationFriendlyName}

\r\n
{item.TextValue}
\r\n
\r\n );\r\n }\r\n })}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Popup;\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 MsDyn365, {\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 getUrlSync\r\n} from '@msdyn365-commerce/core';\r\nimport {\r\n // AttributeSwatch,\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} from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n// import {useState} from 'react';\r\n\r\nimport { getCartState } from '@msdyn365-commerce/global-state';\r\n\r\nimport {\r\n IPriceComponentResources,\r\n PriceComponent,\r\n AddToCartBehavior\r\n // ISwatchItem,\r\n // RatingComponent,\r\n // ProductComponentSwatchComponent\r\n} from '@msdyn365-commerce/components';\r\nimport { IPopupProps, Popup } from '../../utilities/popup';\r\nimport { getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { trackAddToCartFromListing, trackProductTileClick } from '../../utilities/datalayer/index';\r\nimport { GIFTCARD_ITEMID } from '../../utils/constants';\r\n\r\ninterface ProductComponentResources {\r\n addToCartText: string;\r\n omnibusRecentLowestPrice: string;\r\n outOfStockString: string;\r\n}\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 productCategoryUserPath?: string;\r\n productListName?: string;\r\n resources?: ProductComponentResources;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent {}\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\n// function 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 = ({\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 productCategoryUserPath,\r\n productListName,\r\n resources\r\n}) => {\r\n const product = data.product;\r\n // const dimensionContext = context as ICoreContext;\r\n // const dimensionToPreSelectInProductCard = dimensionContext.app.config.dimensionToPreSelectInProductCard;\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n //P&M DETAILS AND MODAL\r\n\r\n const valuemin = 0;\r\n const valuemax = 1000;\r\n\r\n // MODAL\r\n const [modalOpen, setModalOpen] = React.useState(false);\r\n\r\n const popupProps: IPopupProps = {\r\n context: context,\r\n className: 'msc-add-to-pmcart',\r\n id: id,\r\n typeName: typeName,\r\n data: { product: product, price: product.Price },\r\n // @ts-ignore\r\n dialogStrings: {},\r\n imageSettings: imageSettings,\r\n gridSettings: context.request.gridSettings,\r\n productQuantity: 1,\r\n navigationUrl: '',\r\n modalOpen: modalOpen,\r\n setModalOpen: setModalOpen\r\n };\r\n\r\n const renderModalPopup = ;\r\n\r\n const catPage = context.request.urlTokens.categories !== undefined ? context.request.urlTokens.categories[0] : '';\r\n\r\n //FINISHP&M\r\n\r\n //AVAILABILITY\r\n const [available, setAvailable] = React.useState(true);\r\n const [loading, setLoading] = React.useState(true);\r\n const [availableLabel, setAvailableLabel] = React.useState('Available');\r\n const _isAvailable = React.useCallback(async () => {\r\n try {\r\n const productAvailabilites = await getEstimatedAvailabilityAsync(\r\n { callerContext: context.actionContext },\r\n { ProductIds: [product.RecordId], DefaultWarehouseOnly: true, QuantityUnitTypeValue: 2 }\r\n );\r\n\r\n if (!productAvailabilites?.ProductWarehouseInventoryAvailabilities?.length) {\r\n setAvailable(false);\r\n setAvailableLabel(resources?.outOfStockString || '');\r\n return;\r\n }\r\n\r\n // Skip availability check for gift cards\r\n if (product.ItemId === GIFTCARD_ITEMID) {\r\n return;\r\n }\r\n\r\n const inventory = productAvailabilites.ProductWarehouseInventoryAvailabilities[0];\r\n const maxQuantity = inventory.MaximumPurchasablePhysicalAvailableQuantity || 0;\r\n\r\n if (maxQuantity >= 1) {\r\n setAvailable(true);\r\n } else {\r\n setAvailable(false);\r\n setAvailableLabel(inventory.PhysicalAvailableInventoryLevelLabel || resources?.outOfStockString || '');\r\n }\r\n setLoading(false);\r\n } catch (err) {\r\n console.error('Error checking product availability:', err);\r\n setAvailable(false);\r\n setLoading(false);\r\n }\r\n }, [context.actionContext, product.RecordId, product.ItemId, resources?.outOfStockString]);\r\n\r\n React.useEffect(() => {\r\n void _isAvailable();\r\n }, [_isAvailable]);\r\n\r\n const _ontoProductPDP = () => {\r\n trackProductTileClick(context, product as SimpleProduct, productCategoryUserPath ?? '', productListName ?? '');\r\n };\r\n\r\n // ADD TO CART\r\n const _onAddSelectionToBag = async (event: React.MouseEvent): Promise => {\r\n event?.stopPropagation();\r\n event?.preventDefault();\r\n\r\n // Also manage the removal from cart?\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = context.app.config.addToCartBehavior;\r\n const navigationUrl: string | undefined = getUrlSync('cart', context.actionContext);\r\n\r\n const catalogId = getCatalogId(context.actionContext.requestContext);\r\n\r\n const quantity: number = 1;\r\n\r\n trackAddToCartFromListing(context, product as SimpleProduct, productCategoryUserPath ?? '', productListName ?? '');\r\n\r\n const cartState = await getCartState(context.actionContext);\r\n const addToCartResult = await cartState.addProductToCart({\r\n product: data.product as SimpleProduct,\r\n count: quantity,\r\n availableQuantity: undefined,\r\n additionalProperties: undefined,\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: context.app.config.enableStockCheck,\r\n isPriceKeyedIn: undefined,\r\n customPrice: undefined,\r\n isAddEmailDeliveryItemToCart: undefined,\r\n shouldSkipSiteSettings: undefined,\r\n catalogId: catalogId\r\n });\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n if (addToCartBehavior === AddToCartBehavior.showModal) {\r\n // setDisabled(false);\r\n } else if (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 // undefined,\r\n // product,\r\n // data?.product?.Price,\r\n // quantity,\r\n // props.navigationUrl,\r\n // undefined,\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 navigationUrl &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(navigationUrl);\r\n } else {\r\n // setDisabled(false);\r\n }\r\n // propagateResult(props, addToCartResult);\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 // propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n // setDisabled(false);\r\n }\r\n };\r\n\r\n //FINISHADDTOCART\r\n\r\n //OMNIBUS //TODO move in price component\r\n\r\n let percent_discount = '';\r\n let discount_string = '';\r\n\r\n if (product.Price && product.BasePrice && product.BasePrice !== product.Price) {\r\n percent_discount = (100 - (product.Price / product.BasePrice) * 100).toFixed(0);\r\n discount_string = `-${percent_discount}%`;\r\n }\r\n\r\n const custom_basePrice = context.cultureFormatter.formatCurrency(product.BasePrice!.toFixed(2));\r\n const custom_adjustedPrice = context.cultureFormatter.formatCurrency(product.Price.toFixed(2));\r\n const omnibus_price = data.product?.AttributeValues?.filter(attribute => attribute.Name?.includes('Minimum Price Last 30 Days'));\r\n let omnibus_price_currency = '';\r\n if (omnibus_price !== undefined && omnibus_price?.length !== 0 && omnibus_price[0] !== undefined) {\r\n omnibus_price_currency = context.cultureFormatter.formatCurrency(omnibus_price[0].CurrencyValue!, omnibus_price[0].CurrencyCode);\r\n }\r\n\r\n //FINISHOMNIBUS\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 /**\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 let productUrl = product ? getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined) : '';\r\n if (allowBack && productUrl) {\r\n productUrl = updateProductUrl(productUrl, context, 'back=true');\r\n }\r\n\r\n //MICROSOFT FUNCTIONS NOT USED FOR NOW\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 swatch selected if any.\r\n // */\r\n // function getDefaultSwatchSelected(productData?: ProductSearchResult): AttributeSwatch | null {\r\n // if (!productData || !productData.AttributeValues) {\r\n // return null;\r\n // }\r\n\r\n // const attributeSwatches = productData.AttributeValues.find(\r\n // attributeValue => attributeValue.KeyName?.toLocaleLowerCase() === dimensionToPreSelectInProductCard\r\n // )?.Swatches;\r\n\r\n // if (!ArrayExtensions.hasElements(attributeSwatches)) {\r\n // return null;\r\n // }\r\n\r\n // const defaultSwatch = attributeSwatches.find(item => item.IsDefault === true) ?? attributeSwatches[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 getProductImageUrlFromDefaultSwatch(coreContext: ICoreContext, productData?: ProductSearchResult): string | undefined {\r\n // const defaultSwatch = getDefaultSwatchSelected(productData);\r\n // const swatchProductImageUrls = defaultSwatch?.ProductImageUrls;\r\n // if (!ArrayExtensions.hasElements(swatchProductImageUrls)) {\r\n // return productData?.PrimaryImageUrl;\r\n // }\r\n\r\n // return generateImageUrl(swatchProductImageUrls[0], coreContext.request.apiSettings);\r\n // }\r\n\r\n // /**\r\n // * Gets the product page url from the default swatch selected.\r\n // * @param coreContext - Context of the module using the component.\r\n // * @param productUrl - Product page url for the product card.\r\n // * @param productData - Product card to be rendered.\r\n // * @returns The product card image url.\r\n // */\r\n // function getProductPageUrlFromDefaultSwatch(\r\n // coreContext: ICoreContext,\r\n // productUrl: string,\r\n // productData?: ProductSearchResult\r\n // ): string | undefined {\r\n // const defaultSwatch = getDefaultSwatchSelected(productData);\r\n // if (!defaultSwatch?.SwatchValue) {\r\n // return productUrl;\r\n // }\r\n\r\n // const queryStringEncoded = encodeURIComponent(defaultSwatch.SwatchValue);\r\n // const queryString = `${dimensionToPreSelectInProductCard}=${queryStringEncoded}`;\r\n // return updateProductUrl(productUrl, coreContext, queryString);\r\n // }\r\n\r\n // const productImageUrlFromSwatch = getProductImageUrlFromDefaultSwatch(context, product) ?? product?.PrimaryImageUrl;\r\n // const productPageUrlFromSwatch = getProductPageUrlFromDefaultSwatch(context, productUrl, product) ?? productUrl;\r\n\r\n // const [productPageUrl, setProductPageUrl] = useState(productPageUrlFromSwatch);\r\n // const [productImageUrl, setProductImageUrl] = useState(productImageUrlFromSwatch);\r\n // const [selectedSwatchItems] = useState(new Dictionary());\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\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 === dimensionToPreSelectInProductCard) {\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 // 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,\r\n // DimensionSwatchDisplayTypes.productCard\r\n // );\r\n // if (!shouldDisplayAsSwatch) {\r\n // return null;\r\n // }\r\n\r\n // const dimensionType = dimensionTypeValue as DimensionTypes;\r\n // const swatches =\r\n // item.Swatches?.map(swatchItem => {\r\n // return {\r\n // itemId: `${item.RecordId ?? ''}-${dimensionTypeValue}-${swatchItem.SwatchValue ?? ''}`,\r\n // value: swatchItem.SwatchValue ?? '',\r\n // dimensionType,\r\n // colorHexCode: swatchItem.SwatchColorHexCode,\r\n // imageUrl: swatchItem.SwatchImageUrl,\r\n // productImageUrls: swatchItem.ProductImageUrls,\r\n // isDefault: swatchItem.IsDefault,\r\n // 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 // dimensionType === dimensionToPreSelectInProductCard &&\r\n // ArrayExtensions.hasElements(swatches) &&\r\n // !swatches.some(swatch => swatch.isDefault)\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 //ORIGINAL MICROSOFT FUNCTIONS NOT USED FOR NOW\r\n\r\n // // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- -- Do not need type check for appsettings\r\n // const isUnitOfMeasureEnabled = context.app.config && context.app.config.unitOfMeasureDisplayType === 'buyboxAndBrowse';\r\n\r\n // /**\r\n // * Gets the react node for product unit of measure display.\r\n // * @param unitOfMeasure - DefaultUnitOfMeasure property from product.\r\n // * @returns The node representing markup for unit of measure component.\r\n // */\r\n // function renderProductUnitOfMeasure(unitOfMeasure?: string): JSX.Element | null {\r\n // if (!unitOfMeasure) {\r\n // return null;\r\n // }\r\n // return (\r\n //
\r\n // {unitOfMeasure}\r\n //
\r\n // );\r\n // }\r\n\r\n // /**\r\n // * Gets the react node for product availability.\r\n // * @param inventoryAvailabilityLabel - The product information.\r\n // * @returns The node representing markup for product availability.\r\n // */\r\n // function renderProductAvailability(inventoryAvailabilityLabel: string | undefined): JSX.Element | null {\r\n // if (!inventoryAvailabilityLabel || inventoryAvailabilityLabel === '') {\r\n // return null;\r\n // }\r\n\r\n // return (\r\n //
\r\n // {inventoryAvailabilityLabel}\r\n //
\r\n // );\r\n // }\r\n\r\n // /**\r\n // * 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 //
\r\n // {swatchItems.map(item => {\r\n // return (\r\n // \r\n // );\r\n // })}\r\n //
\r\n // );\r\n // }\r\n\r\n // /**\r\n // * Gets the react node for product description.\r\n // * @param quickview - Quick view node.\r\n // * @param item - Product id to de displayed in quickview.\r\n // * @returns The product quickview component.\r\n // */\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(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 ;\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 ): 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\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\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n // /**\r\n // * Gets the react node for product description.\r\n // * @param description - Product description.\r\n // * @returns The product description component.\r\n // */\r\n // function renderDescription(description?: string): JSX.Element | null {\r\n // return

{description}

;\r\n // }\r\n\r\n // /**\r\n // * Gets the react component for product rating.\r\n // * @param coreContext - Context of the module using the component.\r\n // * @param moduleTypeName - Module type name.\r\n // * @param moduleId - Module id using the component.\r\n // * @param avgRating - Average rating.\r\n // * @param totalRatings - Total rating.\r\n // * @param ariaLabel - Aria label for rating.\r\n // * @returns React component for Product rating.\r\n // */\r\n // function renderRating(\r\n // coreContext: ICoreContext,\r\n // moduleTypeName: string,\r\n // moduleId: string,\r\n // avgRating?: number,\r\n // totalRatings?: number,\r\n // ariaLabel?: string\r\n // ): JSX.Element | null {\r\n // if (!avgRating) {\r\n // return null;\r\n // }\r\n\r\n // const numberRatings = totalRatings?.toString() || undefined;\r\n // const ratingAriaLabelText = getRatingAriaLabel(avgRating, ariaLabel);\r\n // const ratingCountAriaLabelText = getReviewAriaLabel(Number(numberRatings), ratingCountAriaLabel);\r\n\r\n // return (\r\n // \r\n // );\r\n // }\r\n\r\n //PICK&MIX\r\n\r\n if (catPage === 'pick-mix') {\r\n // @ts-ignore\r\n const searchContainerResaurces = context?.actionContext?.requestCache?.internalCache?.__MR['SEARCH-RESULT-CONTAINER']?.item;\r\n // @ts-ignore\r\n const pmProducts = context.pmProducts;\r\n const RecordId = product.RecordId;\r\n const initialQuntity = pmProducts && pmProducts[RecordId] && pmProducts[RecordId].Qty;\r\n const [add, setAdd] = React.useState(initialQuntity > 0 && initialQuntity !== undefined ? false : true);\r\n\r\n const [quantity, setQuantity] = React.useState(initialQuntity > 0 && initialQuntity !== undefined ? initialQuntity : 0);\r\n\r\n const removedFromCart = () => {\r\n const localPm = localStorage && localStorage.getItem('pm_products');\r\n const localPmProds = localPm && localPm !== null ? localPm : JSON.stringify({});\r\n const pmProductsList = JSON.parse(localPmProds);\r\n if (pmProductsList[product.RecordId] === undefined) {\r\n setQuantity(0);\r\n setAdd(true);\r\n }\r\n };\r\n const cookiePMset = typeof window !== 'undefined' ? localStorage.setItem('pm_products', JSON.stringify(pmProducts)) : undefined;\r\n React.useEffect(() => {\r\n const wrapper = document.getElementsByClassName('pm-cart--ctn')[0];\r\n\r\n // tslint:disable-next-line:typedef no-any\r\n function handleButtonClick(event: any) {\r\n const isButton = event.target.nodeName === 'BUTTON';\r\n\r\n if (!isButton) {\r\n return;\r\n }\r\n const timer = setTimeout(() => {\r\n removedFromCart();\r\n }, 100);\r\n return () => {\r\n clearTimeout(timer);\r\n };\r\n }\r\n\r\n wrapper.addEventListener('click', handleButtonClick);\r\n return () => wrapper.removeEventListener('click', handleButtonClick);\r\n });\r\n\r\n function plusOneProductToPmCart(pRecordId: number): void {\r\n // @ts-ignore\r\n const pmProductsList = context.pmProducts;\r\n const productQuantity = Number(pmProductsList[pRecordId]?.Qty) + 1;\r\n if (pmProductsList[pRecordId] !== undefined) {\r\n pmProductsList[pRecordId].Qty = productQuantity;\r\n cookiePMset;\r\n setQuantity(productQuantity);\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n function removeOneProductFromPmCart(pRecordId: number): void {\r\n // @ts-ignore\r\n const pmProductsList = context.pmProducts;\r\n const productQuantity = Number(pmProductsList[pRecordId]?.Qty) - 1;\r\n\r\n if (productQuantity >= 0) {\r\n pmProductsList[pRecordId].Qty = productQuantity;\r\n cookiePMset;\r\n setQuantity(productQuantity);\r\n }\r\n if (productQuantity === 0) {\r\n delete pmProductsList[pRecordId];\r\n cookiePMset;\r\n setAdd(true);\r\n }\r\n }\r\n\r\n function addProductToPmCart(\r\n pRecordId: number,\r\n Name: string | undefined,\r\n Description: string | undefined,\r\n PrimaryImageUrl: string | undefined,\r\n pQuantity: number,\r\n Price: number\r\n ): void {\r\n // @ts-ignore\r\n const pmProductsList = context.pmProducts;\r\n setAdd(false);\r\n pmProductsList[pRecordId] = {\r\n Id: pRecordId,\r\n Item: Name,\r\n Qty: pQuantity,\r\n UOM: '',\r\n Price: Price,\r\n Description: Description,\r\n DataAreaId: '',\r\n PrimaryImageUrl: PrimaryImageUrl\r\n };\r\n // @ts-ignore\r\n context.pmProducts = pmProductsList;\r\n cookiePMset;\r\n setQuantity(1);\r\n }\r\n\r\n // @ts-ignore\r\n const AddToCartButtons = ({ showadd }) => {\r\n if (showadd) {\r\n return (\r\n <>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n \r\n addProductToPmCart(\r\n product.RecordId,\r\n product.Name,\r\n product.ItemId,\r\n product.PrimaryImageUrl,\r\n 1,\r\n product.Price\r\n )\r\n }\r\n >\r\n {searchContainerResaurces.addText}\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n removeOneProductFromPmCart(product.RecordId)}\r\n title='Press to decrease the quantity by 1'\r\n className='decrement quantity__controls'\r\n aria-hidden='true'\r\n aria-label='Press to decrease the quantity by 1'\r\n color='secondary'\r\n />\r\n {/* tslint:disable-next-line:max-line-length */}\r\n \r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue max-line-length */}\r\n plusOneProductToPmCart(product.RecordId)}\r\n title='Press to increment quantity by 1'\r\n className='increment quantity__controls '\r\n aria-hidden='true'\r\n aria-label='Press to increment quantity by 1'\r\n color='secondary'\r\n />\r\n \r\n );\r\n };\r\n // @ts-ignore\r\n return (\r\n
\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n
\r\n

{product.Name}

\r\n {renderModalPopup}\r\n {/* tslint:disable-next-line:max-line-length jsx-no-lambda react-this-binding-issue react-a11y-event-has-role */}\r\n {\r\n setModalOpen(true)}\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 )}\r\n className='hyperlink view_details '\r\n {...attribute}\r\n >\r\n {searchContainerResaurces.viewDetailsText}\r\n \r\n }\r\n

{product.Description}

\r\n {renderPrice(context, typeName, id, product, savingsText, freePriceText, originalPriceText, currentPriceText)}\r\n
\r\n {available ? (\r\n \r\n ) : (\r\n {availableLabel}\r\n )}\r\n
\r\n
\r\n {product.RecordId}\r\n {product.ItemId}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n //FINISHPICKMIX\r\n\r\n // console.log(\"category\");\r\n // console.log(productCategoryUserPath);\r\n //STDPRODUCT\r\n return (\r\n <>\r\n {\r\n _ontoProductPDP();\r\n onTelemetryClick(telemetryContent!, payLoad, product.Name!);\r\n }}\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 status_${available ? 'AVAL' : 'OOS'}`}\r\n {...attribute}\r\n >\r\n
\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n
\r\n
\r\n

{product.Name}

\r\n
\r\n
\r\n

{product.Description}

\r\n
\r\n
\r\n {/*\r\n //TODO restore way of saving list attribute\r\n {card_guid}\r\n */}\r\n {product.RecordId}\r\n {product.ItemId}\r\n
\r\n {/* {!context.app.config.hideRating && (\r\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)\r\n )} */}\r\n {product.BasePrice !== product.Price && (\r\n \r\n \r\n {custom_basePrice}\r\n {discount_string}\r\n \r\n \r\n )}\r\n
\r\n
\r\n {product.BasePrice !== 0 ? (\r\n
\r\n {product.BasePrice === product.Price ? (\r\n <>\r\n \r\n {custom_basePrice}\r\n \r\n\r\n {/* THE FOLLOWING IS SHOWN FOR SPACING REASONS */}\r\n  \r\n {/* DO NOT REMOVE THIS */}\r\n \r\n ) : (\r\n <>\r\n \r\n {custom_adjustedPrice}\r\n \r\n \r\n {omnibus_price_currency ? (\r\n <>\r\n {resources?.omnibusRecentLowestPrice} \r\n {omnibus_price_currency}\r\n \r\n ) : (\r\n <> \r\n )}\r\n \r\n \r\n )}\r\n {/*
*/}\r\n
\r\n {available ? (\r\n \r\n {/* \r\n ) : (\r\n {availableLabel}\r\n )}\r\n
\r\n {/*
*/}\r\n
\r\n ) : null}\r\n \r\n\r\n {/*MICROSOFTCODE\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n productImageUrl,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n

{product.Name}

\r\n \r\n {renderProductDimensions()}\r\n
\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
\r\n {quickViewButton && renderQuickView(quickViewButton, product.RecordId)}\r\n {productComparisonButton && renderProductComparisonButton(productComparisonButton, product, getCatalogId(context.request))} */}\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","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel, ICarouselProps, Player, IPlayerData, IPlayerOptions, IVideoMetadata } from '@msdyn365-commerce/components';\nimport { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport { MediaLocation, MediaType, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getFallbackImageUrl, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n defaultDataScale,\n IComponentNodeProps,\n ImagefullView,\n IModalViewProps,\n IModuleProps,\n inlineZoomImageOnHover,\n inlineZoomImageOnMouseMove,\n inlineZoomImageOnMouseOut,\n inlineZoomInitClick,\n INodeProps,\n ISingleSlideCarouselProps,\n isMobile,\n KeyCodes,\n NodeTag,\n onContainerZoomInit,\n onMouseMoveLensContainer,\n onMouseOutLensContainer,\n onMouseOverImageContainer,\n removeContainerZoomStyle,\n removeInlineZoomStyle,\n SingleSlideCarousel,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport * as React from 'react';\n\nimport { IMediaGalleryData } from './media-gallery.data';\nimport { imageSource, imageZoom, IMediaGalleryProps, thumbnailsOrientation } from './media-gallery.props.autogenerated';\nimport { getProductImages, getValidProductImages, getVideoMetadataFromApi, validateProductImages } from './utils';\nimport { getAltText, IMediaData } from './utils/helper';\n\n/**\n * IMediaGalleryState Interface.\n */\nexport interface IMediaGalleryState {\n animating: boolean;\n activeIndex: number;\n isImageZoomed: boolean;\n modalIsOpen: boolean;\n lastUpdate?: number;\n isMobileImageZoomed?: boolean;\n mediaGalleryItems?: IMediaData[];\n isInitialLoad?: boolean;\n shouldUseOptimizedImage?: boolean;\n}\n\n/**\n * IMediaGalleryThumbnailsViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailsViewProps {\n ThumbnailsContainerProps: INodeProps;\n SingleSlideCarouselComponentProps: INodeProps;\n items?: IMediaGalleryThumbnailItemViewProps[];\n}\n\n/**\n * IMediaGalleryThumbnailItemViewProps Interface.\n */\nexport interface IMediaGalleryThumbnailItemViewProps {\n ThumbnailItemContainerProps: INodeProps;\n Picture: React.ReactElement;\n}\n\n/**\n * IMediaGalleryViewProps Interface.\n */\nexport interface IMediaGalleryViewProps extends IMediaGalleryProps {\n state: IMediaGalleryState;\n MediaGallery: IModuleProps;\n CarouselProps: INodeProps;\n Thumbnails: IMediaGalleryThumbnailsViewProps;\n Modal?: React.ReactElement | null;\n callbackToggle?(): void;\n callbackThumbnailClick?(index: number): void;\n callbackThumbnailKeyDown?(index: number): void;\n}\n\n/**\n * Props for carousel.\n */\ninterface IMediaGalleryCarouselItems {\n items: ItemType[];\n keys: (string | undefined)[];\n}\n\n/**\n * Media gallery component.\n */\nclass MediaGallery extends React.Component, IMediaGalleryState> {\n private readonly _inlineZoomDivRef: Map = new Map();\n\n private readonly fullScreenOverlayButtonRef: React.RefObject = React.createRef();\n private readonly player: React.RefObject = React.createRef();\n private fallbackImage?: string;\n\n private readonly defaultGalleryImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=767&h=767&m=8', w: 0, h: 0 },\n sm: { q: 'w=600&h=600&m=8', w: 0, h: 0 },\n md: { q: 'w=600&h=772&m=8', w: 0, h: 0 },\n lg: { q: 'h=772&m=8', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=100&m=8', w: 100, h: 0 },\n lg: { q: 'w=100&m=8', w: 100, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n private readonly _zoomedImageSettings: IImageSettings;\n\n public constructor(props: IMediaGalleryProps) {\n super(props);\n this._toggleModal = this._toggleModal.bind(this);\n const mediaGalleryImages = this.getImagesData();\n this.state = {\n activeIndex: 0,\n animating: false,\n isImageZoomed: false,\n modalIsOpen: false,\n isInitialLoad: true,\n shouldUseOptimizedImage: !!this.props.config.skipImageValidation,\n mediaGalleryItems: mediaGalleryImages\n };\n\n this._zoomedImageSettings =\n props.config.zoomedImageSettings ?? props.config.galleryImageSettings ?? this.defaultGalleryImageSettings;\n\n this._onImageMouseOut = this._onImageMouseOut.bind(this);\n this._inlineZoomImageOnHover = this._inlineZoomImageOnHover.bind(this);\n this._onInlineImageClick = this._onInlineImageClick.bind(this);\n this._onContainerZoomImageClick = this._onContainerZoomImageClick.bind(this);\n this._onMouseOutLensContainer = this._onMouseOutLensContainer.bind(this);\n }\n\n public isMobile(): boolean {\n const size = isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n return size === 'xs';\n }\n\n public async componentDidMount(): Promise {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n const shouldUpdateOnPartialDimensionSelection = this.props.config.shouldUpdateOnPartialDimensionSelection;\n this._setRenderType();\n if (!this.props.context.request.app?.config?.OmniChannelMedia) {\n if (source === imageSource.pageContext) {\n if (this.state.mediaGalleryItems === undefined && this.props.data.mediaLocationsForSelectedVariant.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocationsForSelectedVariant.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n } else if (this.state.mediaGalleryItems === undefined && this.props.data.product.result) {\n const product = this.props.data.product.result;\n const images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n product.productVariant\n );\n\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n }\n }\n\n reaction(\n () => {\n const product = this.props.data.product.result;\n if (!product) {\n return null;\n }\n\n if (!shouldUpdateOnPartialDimensionSelection || !product.productVariant?.RecordId) {\n return `${product.RecordId}`;\n }\n\n return `${product.RecordId}-${product.productVariant.RecordId}`;\n },\n async () => {\n const product = this.props.data.product.result;\n let images: IImageData[] = [];\n if (product) {\n if (this.props.context.app?.config?.OmniChannelMedia) {\n images = await getProductImages(\n product.RecordId,\n this.shouldUseCmsAltText(),\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n product.Name,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n } else {\n images = await getValidProductImages(\n product.RecordId,\n +this.props.context.request.apiSettings.channelId,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n shouldUpdateOnPartialDimensionSelection ? product.productVariant : undefined\n );\n }\n await this._setImages(images);\n } else {\n await this._setImages([]);\n }\n },\n { fireImmediately: true }\n );\n\n if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n const images = await validateProductImages(\n this.props.data.mediaLocations.result,\n this.props.context.actionContext,\n this.props.config.thumbnailImageSettings ?? this.defaultThumbnailImageSettings\n );\n await this._setImages(images);\n }\n }\n\n public shouldComponentUpdate(nextProps: IMediaGalleryProps, nextState: IMediaGalleryState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n const { id, config, resources } = this.props;\n\n const { className, showPaginationTooltip } = config;\n\n const isVertical: boolean = config.thumbnailsOrientation === thumbnailsOrientation.vertical;\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- || is required.\n const isFullscreenAllowed: boolean = this.isMobile() || config.allowFullScreen || false;\n const zoomViewMode: string =\n config.imageZoom === imageZoom.inline ? imageZoom.inline : config.imageZoom === imageZoom.container ? imageZoom.container : '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = this.props.context.app.config?.placeholderImageName as string;\n if (this.props.data.product.result) {\n this.fallbackImage = getFallbackImageUrl(\n this.props.data.product.result.ItemId,\n this.props.context.request.apiSettings,\n this.props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && this.fallbackImage) {\n this.fallbackImage = `${this.fallbackImage}&fallback=${emptyPlaceHolderImage}`;\n }\n\n const mediaGalleryCarouselItems = this._getMediaGalleryItems(isFullscreenAllowed, zoomViewMode);\n const mediaGalleryThumbnailCarouselItems = this._getMediaGalleryThumbnailItems();\n const viewProps: IMediaGalleryViewProps = {\n ...(this.props as IMediaGalleryProps),\n state: this.state,\n MediaGallery: {\n moduleProps: this.props,\n className: classnames(`ms-media-gallery ${isVertical ? 'vertical' : ''}`, className)\n },\n Modal: isFullscreenAllowed ? this.imageModalSlider(zoomViewMode) : null,\n callbackToggle: this.openModalDialog,\n callbackThumbnailClick: this._generateOnThumbnailClick,\n callbackThumbnailKeyDown: this._generateOnThumbnailKeyDown,\n CarouselProps: {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items: mediaGalleryCarouselItems.items,\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: showPaginationTooltip === true,\n indicatorAriaText: resources.ariaLabelForSlide,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n key: mediaGalleryCarouselItems.keys\n } as IComponentNodeProps,\n Thumbnails: {\n ThumbnailsContainerProps: { className: 'ms-media-gallery__thumbnails-container' },\n SingleSlideCarouselComponentProps: {\n tag: SingleSlideCarousel,\n className: 'ms-media-gallery__thumbnails',\n vertical: isVertical,\n flipperPrevLabel: resources.previousScreenshotFlipperText,\n flipperNextLabel: resources.nextScreenshotFlipperText,\n parentId: id,\n useTabList: true,\n key: JSON.stringify(mediaGalleryThumbnailCarouselItems.keys)\n } as IComponentNodeProps,\n items: mediaGalleryThumbnailCarouselItems.items\n }\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Zoomed out image on previous/next click.\n */\n public updateZoomedInImage(): void {\n this.setState({ isImageZoomed: false });\n }\n\n private readonly onExiting = () => {\n this.setState({ animating: true });\n };\n\n private readonly onExited = () => {\n this.setState({ animating: false });\n };\n\n /**\n * On click next in carousel.\n */\n private readonly next = (): void => {\n removeInlineZoomStyle();\n if (this.isLastItem() === undefined) {\n return;\n }\n\n const nextIndex = this.isLastItem() ? 0 : this.state.activeIndex + 1;\n this.goToIndex(nextIndex);\n\n this.updateZoomedInImage();\n };\n\n /**\n * On click previous in carousel.\n */\n private readonly previous = (): void => {\n removeInlineZoomStyle();\n const images = this.state.mediaGalleryItems;\n const nextIndex = this.isFirstItem() ? (images ? images.length - 1 : 0) : this.state.activeIndex - 1;\n this.goToIndex(nextIndex);\n this.updateZoomedInImage();\n };\n\n private readonly goToIndex = (index: number): void => {\n const { autoplay } = this.props.config;\n const currentIndex = this.state.activeIndex;\n const mediaItems = this.state.mediaGalleryItems;\n if (autoplay && mediaItems) {\n if (mediaItems[`${index}`]?.mediaTypeValue === MediaType.Video) {\n this.player.current?.play();\n } else if (mediaItems[`${currentIndex}`].mediaTypeValue === MediaType.Video) {\n this.player.current?.pause();\n }\n }\n this.setState({ activeIndex: index });\n };\n\n private _getMediaGalleryThumbnailItems(): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const thumbnailImageSettings = this.props.config.thumbnailImageSettings;\n if (thumbnailImageSettings) {\n thumbnailImageSettings.cropFocalRegion = true;\n }\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n const defaultKey = 0;\n return {\n items: [this._getEmptyThumbnailItem(thumbnailImageSettings, defaultKey, this.state.activeIndex)],\n keys: ['empty']\n };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n return this.getVideoThumbNailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n } else {\n return this._getThumbnailItem(\n item,\n thumbnailImageSettings ?? this.defaultThumbnailImageSettings,\n index,\n this.state.activeIndex\n );\n }\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private getImagesData = (): IImageData[] => {\n if (this.props.config.skipImageValidation || this.props.context.request.app?.config?.OmniChannelMedia) {\n const source = this.props.config.imageSource ?? imageSource.pageContext;\n let images: IImageData[] = [];\n let mediaLocations: MediaLocation[] = [];\n if (source === imageSource.pageContext && this.props.data.mediaLocationsForSelectedVariant.result) {\n mediaLocations = this.props.data.mediaLocationsForSelectedVariant.result;\n } else if (source === imageSource.productId && this.props.data.mediaLocations.result) {\n mediaLocations = this.props.data.mediaLocations.result;\n }\n images = mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(\n this.props.context.actionContext.requestContext,\n this.shouldUseCmsAltText(),\n this.props.data.product.result?.Name,\n mediaLocation.AltText\n ),\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n const curatedImages = this.props.config.images ?? [];\n\n return [...this._filterMasterImageFromVariant(images), ...curatedImages];\n }\n return [];\n };\n\n private _getMediaGalleryItems(isFullscreenAllowed: boolean, zoomViewMode: string): IMediaGalleryCarouselItems {\n const mediaGalleryItems = this.state.mediaGalleryItems;\n const galleryImageSettings = this.props.config.galleryImageSettings;\n if (galleryImageSettings) {\n galleryImageSettings.cropFocalRegion = true;\n }\n\n const zoomView = isFullscreenAllowed ? 'fullscreen' : zoomViewMode;\n\n const hasMediaGalleryItems = ArrayExtensions.hasElements(mediaGalleryItems);\n\n if (!hasMediaGalleryItems) {\n if (this.state.lastUpdate) {\n return { items: [this._renderEmptyImage(galleryImageSettings)], keys: ['empty'] };\n }\n return { items: [], keys: [] };\n }\n\n return {\n items: [\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n ...mediaGalleryItems!.map((item: IMediaData, index: number) => {\n return this._renderCarouselItemImageView(\n zoomView,\n item,\n galleryImageSettings ?? this.defaultGalleryImageSettings,\n index\n );\n })\n ],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n keys: [...mediaGalleryItems!.map(item => item.src)]\n };\n }\n\n private async _setImages(images?: IMediaData[]): Promise {\n const curatedImage = this.props.config.images || [];\n const mediaToSet: IMediaData[] = this._filterMasterImageFromVariant(images);\n\n void Promise.all(\n mediaToSet.map(async mediaData => {\n if (mediaData.mediaTypeValue === MediaType.Video && mediaData.src) {\n try {\n const url = new URL(mediaData.src);\n const videoId = url.searchParams.get('CVID');\n if (videoId) {\n mediaData.videoData = await getVideoMetadataFromApi(videoId, this.props.context.actionContext);\n }\n } catch (error) {\n if (this.props.telemetry) {\n this.props.telemetry.debug('Error while fetching videoId');\n }\n }\n }\n return mediaData;\n })\n ).then(mediaData => {\n const mediaItems = mediaData.filter(element => {\n return (\n element.mediaTypeValue !== MediaType.Video ||\n (element.mediaTypeValue === MediaType.Video && element.videoData !== undefined)\n );\n });\n\n this.setState({\n mediaGalleryItems: [...mediaItems, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n });\n\n this.setState({\n mediaGalleryItems: [...mediaToSet, ...curatedImage],\n activeIndex: 0,\n lastUpdate: Date.now(),\n shouldUseOptimizedImage: false\n });\n }\n\n private _setRenderType(): void {\n this.setState({\n isInitialLoad: false\n });\n }\n\n private _renderCarouselItemImageView(\n zoomView: string,\n media: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode {\n if (media.mediaTypeValue === MediaType.Video) {\n if (isInPopup || zoomView !== 'fullscreen') {\n return <>{this._renderCarouselItemVideo(media, index, imageSettings)};\n }\n return <>{this._renderVideoThumbnail(media, index, imageSettings)};\n } else {\n if (this.isMobile()) {\n if (isInPopup) {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n switch (zoomView) {\n case 'container': {\n return this._renderImageInContainerOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'inline': {\n return this._renderImageInlineOnZoom(media, this._zoomedImageSettings, index);\n }\n case 'fullscreen': {\n return this._renderImageFullScreenOnZoom(media, imageSettings, index);\n }\n\n // No default\n }\n return <>{this._getCarouselItem(media, imageSettings, index, isInPopup)};\n }\n }\n\n private _filterMasterImageFromVariant(images?: IImageData[]): IImageData[] {\n const shouldHidePrimaryImages = this.props.config.shouldHideMasterProductImagesForVariant ?? true;\n let variantImages = images ?? [];\n const isVariantProduct =\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.MasterProductId) ||\n !ObjectExtensions.isNullOrUndefined(this.props.data.product.result?.productVariant);\n const itemId = this.props.data.product.result?.ItemId;\n if (shouldHidePrimaryImages && isVariantProduct && itemId) {\n variantImages = variantImages.filter(item => {\n const isApplicableForChildEntities = item.additionalProperties?.isApplicableForChildEntities;\n return !isApplicableForChildEntities;\n });\n if (!ArrayExtensions.hasElements(variantImages)) {\n variantImages = images ?? [];\n }\n }\n return variantImages;\n }\n\n private readonly _renderCarouselItemVideo = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = this.props.config as IPlayerOptions;\n const playerResources = this.props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n const attributes = {\n id: `${this.props.id}__carousel-item__${index}`\n };\n return (\n \n );\n }\n return this._renderEmptyImage(imageSettings);\n };\n\n private readonly _getCarouselItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n isInPopup: boolean = false\n ): React.ReactNode => (\n \n );\n\n private readonly _getThumbnailItem = (\n image: IImageData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Gets the video thumbnail item to display media gallery.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render video.\n */\n private readonly getVideoThumbNailItem = (\n mediaData: IMediaData,\n imageSettings: IImageSettings,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps => {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: index,\n 'aria-label': image.altText,\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n };\n\n /**\n * Ref Handler.\n * @param index -Remove item click function.\n * @returns Set inline zoom.\n */\n private readonly _refHandler = (index: number) => (divRef: HTMLDivElement) => {\n this._inlineZoomDivRef.set(index, divRef);\n };\n\n private readonly _generateOnThumbnailKeyDown = (index: number) => {\n return (event: React.KeyboardEvent) => {\n if (event.which === KeyCodes.Enter || event.which === KeyCodes.Space) {\n event.preventDefault();\n\n this.goToIndex(index);\n }\n };\n };\n\n private readonly _generateOnThumbnailClick = (index: number) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n\n this.goToIndex(index);\n };\n };\n\n private _renderImageInlineOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n \n \n \n \n );\n }\n\n private _inlineZoomImageOnHover(event: React.MouseEvent): void {\n inlineZoomImageOnHover(event, this.props.config.dataScale ?? String(defaultDataScale));\n }\n\n private _handleMobileViewZoomedImageClick(event: React.MouseEvent) {\n const target = this.state.shouldUseOptimizedImage ? (event.target as HTMLImageElement) : event.currentTarget;\n const mobileZoomedInImageClassName = 'msc-mobile-zoomed-in';\n if (!this.state.isMobileImageZoomed) {\n const bounds = target.getBoundingClientRect();\n const dataScale = Number(this.props.config.dataScale ?? defaultDataScale);\n\n const positionX = event.clientX - bounds.left;\n const positionY = event.clientY - bounds.top;\n const scaledPositionX = positionX * dataScale;\n const scaledPositionY = positionY * dataScale;\n\n target.style.transform = `scale(${dataScale})`;\n target.classList.add(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = 'auto';\n target.parentElement!.scrollTo(scaledPositionX - positionX, scaledPositionY - positionY);\n this.setState({\n isMobileImageZoomed: true\n });\n } else {\n target.style.transform = '';\n target.classList.remove(mobileZoomedInImageClassName);\n target.parentElement!.style.overflow = '';\n this.setState({\n isMobileImageZoomed: false\n });\n }\n }\n\n private _onInlineImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n inlineZoomInitClick(event, this.props.config.dataScale ?? String(defaultDataScale));\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onImageMouseOut(event: React.MouseEvent): void {\n inlineZoomImageOnMouseOut(event);\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _onContainerZoomImageClick(event: React.MouseEvent): void {\n if (window.innerWidth <= 768) {\n // $msv-breakpoint-m\n this._handleMobileViewZoomedImageClick(event);\n return;\n }\n\n onContainerZoomInit(event);\n\n this.setState({\n isImageZoomed: true\n });\n }\n\n private _onMouseOutLensContainer(event: React.MouseEvent): void {\n onMouseOutLensContainer(event);\n\n this.setState({\n isImageZoomed: false\n });\n }\n\n private _renderImageInContainerOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n \n
\n );\n }\n\n private _renderImageFullScreenOnZoom(image: IImageData, imageSettings: IImageSettings, index: number): React.ReactNode {\n return (\n
\n \n
\n {}\n \n
\n
\n );\n }\n\n /**\n * Render the video thumbnail in full screen.\n * @param mediaData - Media Data.\n * @param index - Index\n * @param imageSettings - Image settings.\n * @returns - JSX.Element\n */\n private readonly _renderVideoThumbnail = (mediaData: IMediaData, index: number, imageSettings: IImageSettings): React.ReactNode => {\n const videoData = mediaData.videoData;\n let image: IImageData;\n if (videoData?.thumbnail) {\n image = videoData.thumbnail;\n } else {\n image = {\n src: 'empty'\n };\n }\n\n return (\n
\n \n
\n {}\n \n
\n
\n );\n };\n\n private _mapProductToImageData(product: SimpleProduct): IImageData {\n return {\n src: product.PrimaryImageUrl ?? ''\n };\n }\n\n private _renderEmptyImage(imageSettings: IImageSettings | undefined): React.ReactNode {\n return (\n
\n \n
\n );\n }\n\n private _getEmptyThumbnailItem(\n imageSettings: IImageSettings | undefined,\n index: number,\n modifiedActiveIndex: number\n ): IMediaGalleryThumbnailItemViewProps {\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === index ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'tab',\n tabIndex: 0,\n key: 'empty',\n 'aria-label': '',\n 'aria-selected': modifiedActiveIndex === index,\n onClick: this._generateOnThumbnailClick(index),\n onKeyDown: this._generateOnThumbnailKeyDown(index)\n },\n Picture: (\n \n )\n };\n }\n\n private readonly isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly isLastItem = () => {\n const images = this.state.mediaGalleryItems;\n return images && this.state.activeIndex === images.length - 1;\n };\n\n private readonly openModalDialog = (): void => {\n this._toggleModal();\n };\n\n private _toggleModal(): void {\n if (this.state.modalIsOpen) {\n this.fullScreenOverlayButtonRef.current?.focus();\n const parentDiv = this._inlineZoomDivRef.get(this.state.activeIndex);\n if (parentDiv && parentDiv.children && parentDiv.children.length >= 2) {\n const image = parentDiv.children[1].querySelector('img');\n if (image) {\n image.removeAttribute('style');\n }\n }\n this.setState({\n isImageZoomed: false\n });\n }\n this.setState({\n isImageZoomed: false,\n modalIsOpen: !this.state.modalIsOpen\n });\n removeInlineZoomStyle();\n removeContainerZoomStyle();\n }\n\n private readonly imageModalSlider = (ZoomView: string): React.ReactElement => {\n const {\n data: {\n product: { result: product }\n },\n resources\n } = this.props;\n let mediaGalleryItems = this.state.mediaGalleryItems;\n\n if (!mediaGalleryItems && product) {\n mediaGalleryItems = [this._mapProductToImageData(product)];\n }\n const carouselprops = {\n tag: Carousel,\n className: 'ms-media-gallery__carousel',\n items:\n mediaGalleryItems &&\n mediaGalleryItems.map((item: IImageData, index: number) =>\n this._renderCarouselItemImageView(ZoomView, item, this._zoomedImageSettings, index, true)\n ),\n activeIndex: this.state.activeIndex,\n next: this.next,\n previous: this.previous,\n interval: false,\n directionTextPrev: resources.previousScreenshotFlipperText,\n directionTextNext: resources.nextScreenshotFlipperText,\n onIndicatorsClickHandler: this.goToIndex,\n showPaginationTooltip: true,\n hideIndicator: false,\n keyboard: false,\n handleOnExited: this.onExited,\n handleOnExiting: this.onExiting,\n isDisabledFunctionality: this.state.isMobileImageZoomed\n } as IComponentNodeProps;\n const carousel = ;\n\n const imageModalSliderProps: IModalViewProps = {\n modalIsOpen: this.state.modalIsOpen,\n ontoggle: this._toggleModal,\n galleryCarousel: carousel,\n classNames: classnames('ms-media-gallery__modal', 'msc-modal-input-required')\n };\n return ImagefullView(imageModalSliderProps) as React.ReactElement;\n };\n\n private shouldUseCmsAltText = (): boolean => {\n if (this.props.config.altTextSource === 'product') {\n return false;\n } else {\n return true;\n }\n };\n}\n\nexport default MediaGallery;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button, INodeProps, Modal, ModalBody, ModalFooter, ModalHeader, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewProps } from './components';\nimport { IOrderTemplateViewProps } from './order-template';\n\nconst OrderTemplateLinesView: React.FC = (props: IOrderTemplateViewProps) => {\n const {\n OrderTemplateLines,\n status,\n statusMessage,\n heading,\n ProductsTable,\n ProductsTableHeading,\n orderLines,\n ProductsTableRow,\n productsStatusMessage,\n OrderTemplateActions,\n orderActions,\n pagination,\n itemAddedToCartDialog,\n bulkOrderLineActions,\n isDetailsDisplayed,\n detailedProductView,\n toggleDetailsDisplayed,\n resources: {\n cancelBtnLabel,\n productNumberText,\n productText,\n productUnitPriceText,\n productUOMText,\n productQuantityText,\n productLineCatalogName\n }\n } = props;\n\n const toggleDetails = React.useCallback(() => {\n toggleDetailsDisplayed && toggleDetailsDisplayed(undefined);\n }, [toggleDetailsDisplayed]);\n\n return (\n \n {heading}\n {OrderTemplateActions && (\n \n {orderActions?.addTemplateToBag}\n {orderActions?.renameTemplate}\n {orderActions?.removeTemplate}\n {orderActions?.actionsSplitButton}\n {!isDetailsDisplayed && productsStatusMessage}\n \n )}\n {bulkOrderLineActions}\n {status !== 'SUCCESS' && statusMessage}\n {ProductsTable && orderLines && orderLines.length > 0 && (\n \n \n {ProductsTableHeading}\n \n {orderLines &&\n orderLines.map(product => {\n return _renderItem(product, productQuantityText, ProductsTableRow);\n })}\n \n \n {pagination}\n \n )}\n {itemAddedToCartDialog}\n \n Product Details\n \n
    \n
  • {detailedProductView?.productImage}
  • \n
  • \n {productText}:\n {detailedProductView?.productInfo}\n
  • \n
  • \n {productLineCatalogName}:\n {detailedProductView?.productLineCatalog}\n
  • \n
  • \n {productNumberText}:\n {detailedProductView?.productNumber}\n
  • \n
  • \n {productUnitPriceText}:\n {` `}\n {detailedProductView?.productPrice}\n
  • \n
  • \n {productUOMText}:\n {` `}\n {detailedProductView?.productUnitOfMeasure}\n
  • \n
  • \n {productQuantityText}:\n {detailedProductView?.productQuantityView}\n
  • \n {productsStatusMessage &&
  • {productsStatusMessage}
  • }\n
\n
\n \n \n \n \n
\n );\n};\n\nconst _renderItem = (product: IOrderTemplateLineViewProps, quantityLabel: string, ProductsTableRow?: INodeProps): JSX.Element | null => {\n if (!product) {\n return null;\n }\n\n const {\n key,\n selectLine,\n productLineCatalog,\n productImage,\n productPrice,\n productNumber,\n addToBagButton,\n removeButton,\n productInfo,\n productUnitOfMeasure,\n productQuantityView,\n productQuantity,\n popUp,\n isMobile,\n extraActionsPopup,\n isMultipleCatalogFeatureEnabledInHq,\n disabled\n } = product;\n\n const lineVisibility = disabled\n ? {\n pointerEvents: 'none',\n opacity: 0.5\n }\n : {\n pointerEvents: 'auto',\n opacity: 1\n };\n\n const disableElement: React.CSSProperties = lineVisibility as React.CSSProperties;\n\n return (\n \n {selectLine}\n {!isMobile && isMultipleCatalogFeatureEnabledInHq && {productLineCatalog}}\n {productImage}\n {isMobile ? (\n \n
{productNumber}
\n
\n {quantityLabel}:{` `}\n {productQuantity}\n
\n \n ) : (\n {productNumber}\n )}\n {!isMobile && {productInfo}}\n {!isMobile && {productPrice}}\n {!isMobile && {productUnitOfMeasure}}\n {!isMobile && {productQuantityView}}\n {isMobile && {popUp}}\n {!isMobile && !isMultipleCatalogFeatureEnabledInHq && (\n \n {addToBagButton}\n {removeButton}\n \n )}\n {extraActionsPopup}\n
\n );\n};\n\nexport default OrderTemplateLinesView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IOrderTemplateNameDialogResources, OrderTemplateNameDialog } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport React, { useState } from 'react';\n\nconst modalCloseButtonReference: React.RefObject = React.createRef();\n\n/**\n * The Create Order Template Button Props.\n */\nexport interface ICreateOrderTemplateButtonProps extends IComponentProps {\n /**\n * The label for create order template.\n */\n createOrderTemplateText: string;\n\n /**\n * The create order template dialog resources.\n */\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n\n /**\n * The delegate to fire when dialog captured any user entry.\n */\n onOrderTemplateCreated(): Promise;\n}\n\nconst CreateOrderTemplateButton: React.FC = props => {\n const onCancelHandler = React.useCallback(() => {\n return;\n }, []);\n const [isCreateOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = useState(false);\n const onCreateButtonClick = React.useCallback(() => {\n setOrderTemplateNameDialogOpen(true);\n }, []);\n\n return (\n <>\n \n {props.createOrderTemplateText}\n \n \n \n );\n};\n\nexport default CreateOrderTemplateButton;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IOrderTemplateNameDialogResources } from '@msdyn365-commerce/components';\nimport { deleteAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { OrderTemplate } from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Heading, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport Spinner from '../order-template/components/add-line/spinner';\nimport {\n ISingleOrderTemplateProps,\n ISingleOrderTemplateViewProps,\n OrderTemplateListStatusMessage,\n OrderTemplateRender\n} from './components';\nimport CreateNewTemplateButtonComponent from './components/create-order-template';\nimport { IOrderTemplateListData } from './order-template-list.data';\nimport { HeadingTag, IOrderTemplateListProps, IOrderTemplateListResources } from './order-template-list.props.autogenerated';\n\nexport interface IOrderTemplateActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n headerStatusMessage: string;\n}\n\nexport type orderTemplateListStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\n\nexport interface IOrderTemplateListViewProps extends IOrderTemplateListProps {\n OrderTemplateList: IModuleProps;\n status?: orderTemplateListStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplates?: INodeProps;\n OrderTemplate?: INodeProps;\n orderTemplates?: ISingleOrderTemplateViewProps[];\n createOrderTemplateButton?: React.ReactNode;\n templateHeaderStatusMessage?: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateList component.\n * @extends {React.PureComponent, IOrderTemplateListActionMessageState>}\n */\n@observer\nclass OrderTemplateList extends React.Component, IOrderTemplateActionMessageState> {\n constructor(props: IOrderTemplateListProps) {\n super(props);\n this.state = {\n itemKey: '',\n userMessage: '',\n headerStatusMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false\n };\n }\n\n public async componentDidMount(): Promise {\n this.setState({});\n }\n\n public shouldComponentUpdate(\n nextProps: IOrderTemplateListProps,\n nextState: IOrderTemplateActionMessageState\n ): 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 { className, heading } = this.props.config;\n const { emptyOrderTemplateText, createNewTemplateButtonText } = this.props.resources;\n const { orderTemplates } = this.props.data;\n const orderTemplatesData = orderTemplates && orderTemplates.result;\n const orderTemplateListHeading = heading?.text ?? this.props.resources.orderTemplateListTitle;\n\n if (orderTemplates.status === 'LOADING') {\n const errorProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'LOADING',\n statusMessage: ,\n heading: (\n \n )\n };\n return this.props.renderView(errorProps);\n }\n\n if (orderTemplatesData && orderTemplatesData.length === 0) {\n // When no order templates are found for customer\n const emptyViewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'EMPTY',\n statusMessage: ,\n createOrderTemplateButton: (\n \n ),\n heading: (\n \n )\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateListViewProps = {\n ...(this.props as IOrderTemplateListProps),\n OrderTemplateList: {\n moduleProps: this.props,\n className: classnames('ms-order-template', className)\n },\n status: 'SUCCESS',\n heading: ,\n createOrderTemplateButton: (\n \n ),\n templateHeaderStatusMessage: this.state.isOpen && this.state.headerStatusMessage && (\n
\n \n {this.state.headerStatusMessage}\n \n
\n ),\n OrderTemplates: {\n className: 'ms-order-template__list-item',\n tag: 'ul'\n },\n OrderTemplate: {\n className: 'ms-order-template__tile',\n tag: 'li'\n },\n orderTemplates: orderTemplatesData && this._renderOrderTemplateList(orderTemplatesData)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateListResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (this.props.data.featureState) {\n isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n return isMultipleCatalogFeatureEnabledInHq;\n };\n\n private _renderOrderTemplateList(orderTemplates: OrderTemplate[]): ISingleOrderTemplateViewProps[] {\n const { context, telemetry } = this.props;\n const { imageSettings, enableImageProductLink } = this.props.config;\n return orderTemplates.map((orderTemplate: OrderTemplate, index) => {\n const currentTemplateProps: ISingleOrderTemplateProps = {\n orderTemplateState: this.state,\n Id: orderTemplate.productList.Id,\n name: orderTemplate.productList.Name,\n orderTemplate,\n context,\n imageSettings,\n enableImageProductLink,\n removeFromOrderTemplateListText: 'remove',\n addToBagText: this.props.resources.addToBagButtonText,\n index,\n itemKey: orderTemplate.productList.Id,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n handlers: {\n onRemoveOrderTemplate: this._onRemoveFromOrderTemplateList,\n onDismiss: this._onDismiss\n },\n resources: {\n closeWindowButtonText: this.props.resources.closeWindowButtonText,\n addToCartFailureMessage: this.props.resources.addToCartFailureMessage,\n addToCartSuccessMessage: this.props.resources.addToCartSuccessMessage,\n addToCartProcessMessage: this.props.resources.addToCartProcessMessage,\n orderTemplateErrorMessage: this.props.resources.orderTemplateErrorMessage,\n linesAddedToCartDialogResources: {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n }\n },\n isMultipleCatalogFeatureEnabledInHq: this._isChannelMultipleCatalogsFeatureEnabled()\n };\n\n return OrderTemplateRender(currentTemplateProps)!;\n });\n }\n\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _reloadPage = async () => {\n window.location.reload();\n };\n\n private readonly _onRemoveFromOrderTemplateList = (productListId: string): void | undefined => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplates } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplates.result && orderTemplates.result[0] && productListId) {\n const orderTemplate = orderTemplates.result.find(p => p.productList.Id === productListId);\n if (orderTemplate) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template-list] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: productListId,\n headerStatusMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n })\n .then(this._reloadPage)\n .catch((error: string) => {\n telemetry.warning('[order-template-list] Unable to delete order template.');\n telemetry.error(error);\n });\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template-list] Failed to delete order template.');\n }\n }\n };\n}\n\nexport default OrderTemplateList;\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 { ISingleOrderTemplateViewProps } from './components';\nimport { IOrderTemplateListViewProps } from './order-template-list';\n\nexport const OrderTemplateListView: React.FC = props => {\n const {\n OrderTemplateList,\n status,\n statusMessage,\n heading,\n OrderTemplates,\n orderTemplates,\n OrderTemplate,\n createOrderTemplateButton,\n templateHeaderStatusMessage\n } = props;\n\n return (\n \n {heading}\n {status !== 'SUCCESS' && statusMessage}\n \n {createOrderTemplateButton}\n {templateHeaderStatusMessage}\n \n {OrderTemplates && orderTemplates && orderTemplates.length > 0 && (\n \n {orderTemplates &&\n orderTemplates.map(orderTemplate => {\n return _renderOrderTemplate(orderTemplate, OrderTemplate);\n })}\n \n )}\n \n );\n};\n\nconst _renderOrderTemplate = (orderTemplate: ISingleOrderTemplateViewProps, OrderTemplate?: INodeProps): JSX.Element | null => {\n const { key, addToCartButton, orderTemplateImage, orderTemplateStatusMessage, removeButton, orderTemplateName } = orderTemplate;\n return (\n \n {orderTemplateName}\n {orderTemplateImage}\n {addToCartButton}\n {removeButton}\n {orderTemplateStatusMessage}\n \n );\n};\n\nexport default OrderTemplateListView;\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { reaction } from 'mobx';\r\nimport { IGiftWithPurchaseProps } from './gift-with-purchase.props.autogenerated';\r\nimport { IGiftWithPurchaseData } from './gift-with-purchase.data';\r\nimport { availableGiftsWithPurchase_DLXAsync } from '../../actions/DataActionExtension.g';\r\nimport { IGiftWithPurchaseApiResponse_DLX } from '../../actions/DataServiceEntities.g';\r\nimport { getCartState } from '@msdyn365-commerce/global-state';\r\nimport { addCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { trackAddToCartFromGWP } from '../../themes/venchi/utilities/datalayer';\r\n\r\nexport interface IGiftWithPurchaseViewProps extends IGiftWithPurchaseProps {\r\n modalVisible: boolean;\r\n promotionProps: IGiftWithPurchasePromotionProps;\r\n closePopupCallback(): void;\r\n}\r\n\r\nexport interface IGiftWithPurchasePromotionProps {\r\n gwpType: GiftWithPurchaseType;\r\n numberProductsOfGift: number;\r\n productSelection: ProductSearchResult[];\r\n}\r\n\r\nexport enum GiftWithPurchaseType {\r\n AUTO = 0,\r\n MANUALADD = 1\r\n}\r\n\r\nconst GiftWithPurchase: React.FC> = props => {\r\n const [modalVisible, setModalVisible] = useState(false); // State to manage modal visibility\r\n const [gwpData, setGwpData] = useState(null);\r\n const productAddedAttempt = useRef(false); // Create ref to track if product is added\r\n\r\n if (typeof window === 'undefined') {\r\n return null;\r\n }\r\n //@ts-ignore\r\n const isOrderConfirmPage = window.___initialData___.requestContext.telemetryPageName.toLowerCase() === 'order confirmation';\r\n if (isOrderConfirmPage) {\r\n return null;\r\n }\r\n\r\n const closePopup = () => {\r\n if (modalVisible) {\r\n setModalVisible(false);\r\n setGwpData(null);\r\n }\r\n };\r\n const baseImageUrl: string = props.context.request.apiSettings.baseImageUrl;\r\n useEffect(() => {\r\n // Add reaction to listen for changes in cart lines\r\n const disposeReaction = reaction(\r\n () => props.data.cart.result?.cart.TotalItems!,\r\n async (totalItems: number) => {\r\n const currentURLPathName = props.context.request.url.requestUrl.pathname.replace(/\\/$/, '');\r\n const defaultRoutes = props.context.request.app?.routes;\r\n const isOrderConfirmPage_temp = defaultRoutes.orderConfirmation?.destinationUrl?.replace(/\\/$/, '') === currentURLPathName;\r\n if (\r\n totalItems &&\r\n !isOrderConfirmPage_temp &&\r\n !productAddedAttempt.current &&\r\n !(gwpData && gwpData.gwpType === GiftWithPurchaseType.AUTO) &&\r\n document.visibilityState === 'visible'\r\n ) {\r\n try {\r\n const response: IGiftWithPurchaseApiResponse_DLX = await availableGiftsWithPurchase_DLXAsync(\r\n { callerContext: props.context.actionContext },\r\n props.data.cart.result?.cart.Id!\r\n );\r\n if (\r\n // in questo caso considero che c'è almeno un prodotto da aggiungere\r\n response &&\r\n response.GWPItems &&\r\n response.GWPItems.length > 0 &&\r\n response.GWPItems[0].Items &&\r\n response.GWPItems[0].Items.length > 0 &&\r\n response.GWPItems[0].Qty &&\r\n response.GWPItems[0].Qty > 0\r\n ) {\r\n const firstGWPItem = response.GWPItems[0];\r\n const gwpTypeTemp =\r\n (firstGWPItem.Items?.length ?? 0) > 1 ? GiftWithPurchaseType.MANUALADD : GiftWithPurchaseType.AUTO;\r\n if (gwpTypeTemp === GiftWithPurchaseType.AUTO && firstGWPItem.Items?.length === 1) {\r\n // let productIds: number[] = [];\r\n // productIds = firstGWPItem!.Items!\r\n // // Map to array of ProductId, also filtering out any undefined or null values\r\n // .map(item => item.ProductId)\r\n // .filter(productId => productId !== undefined && productId !== null) as number[];\r\n // const productAvailabilityInfo = availabilityResult.AggregatedProductInventoryAvailabilities.find(aggregatedData => aggregatedData.ProductId === firstGWPItem.Items![0].ProductId!)\r\n //TODO fix this call and remove harcode\r\n const availabilityResult = await getEstimatedAvailabilityAsync(\r\n { callerContext: props.context.actionContext },\r\n {\r\n ProductIds: [firstGWPItem.Items[0].ProductId!],\r\n DefaultWarehouseOnly: true,\r\n QuantityUnitTypeValue: 2\r\n }\r\n );\r\n if (\r\n availabilityResult &&\r\n availabilityResult.AggregatedProductInventoryAvailabilities &&\r\n availabilityResult.AggregatedProductInventoryAvailabilities?.length > 0 &&\r\n availabilityResult.AggregatedProductInventoryAvailabilities[0]\r\n .MaximumPurchasablePhysicalAvailableQuantity &&\r\n availabilityResult.AggregatedProductInventoryAvailabilities[0]\r\n .MaximumPurchasablePhysicalAvailableQuantity >\r\n 2 * firstGWPItem.Qty!\r\n ) {\r\n productAddedAttempt.current = true;\r\n\r\n const cartLinesToAdd = [\r\n {\r\n ItemId: firstGWPItem.Items[0].ItemId,\r\n ProductId: firstGWPItem.Items[0].ProductId,\r\n Quantity: firstGWPItem.Qty,\r\n TrackingId: '',\r\n ExtensionProperties: [\r\n {\r\n Key: 'GWPItem',\r\n Value: { BooleanValue: true }\r\n },\r\n {\r\n Key: 'GWPType',\r\n Value: { StringValue: 'AUTO' }\r\n },\r\n {\r\n Key: 'venchiProductListName',\r\n Value: { StringValue: 'GWP' }\r\n },\r\n {\r\n Key: 'venchiProductCategoryHierarchy',\r\n Value: { StringValue: 'GWP||||' }\r\n }\r\n ]\r\n }\r\n ];\r\n const cartState = await getCartState(props.context.actionContext);\r\n addCartLinesAsync(\r\n { callerContext: props.context.actionContext },\r\n cartState.cart.Id,\r\n cartLinesToAdd,\r\n cartState.cart.Version\r\n )\r\n .then(async () => {\r\n // Code here will only run if addCartLinesAsync was successful\r\n await cartState.refreshCart({});\r\n if (firstGWPItem.Items?.[0]) {\r\n trackAddToCartFromGWP(\r\n props.context,\r\n {\r\n RecordId: firstGWPItem.Items[0].ProductId || 0,\r\n ItemId: firstGWPItem.Items[0].ItemId,\r\n Name: firstGWPItem.Items[0].Description,\r\n BasePrice: 0,\r\n Price: 0,\r\n AdjustedPrice: 0,\r\n ProductTypeValue: 0\r\n },\r\n firstGWPItem.Qty || 0\r\n );\r\n }\r\n const gwpProps: IGiftWithPurchasePromotionProps = {\r\n gwpType: gwpTypeTemp,\r\n numberProductsOfGift: firstGWPItem.Qty || 0,\r\n productSelection: firstGWPItem.Items!.map(\r\n product =>\r\n ({\r\n ItemId: product.ItemId,\r\n Name: product.Description,\r\n Price: 0,\r\n RecordId: product.ProductId,\r\n ProductNumber: product.ProductId,\r\n Description: product.Description,\r\n BasePrice: 0,\r\n PrimaryImageUrl: `${baseImageUrl}Products/${product.ItemId!}_000_001.jpg`\r\n } as ProductSearchResult)\r\n )\r\n };\r\n productAddedAttempt.current = false;\r\n if (!modalVisible) {\r\n setModalVisible(true);\r\n }\r\n setGwpData(gwpProps);\r\n\r\n // Add any other actions that should only occur if addCartLinesAsync was successful\r\n // ...\r\n })\r\n .catch(error => {\r\n productAddedAttempt.current = false;\r\n // Handle error. Error handling logic here.\r\n console.error('Error adding gwp cart lines: ', error);\r\n // Optional: Provide user feedback about the error via UI\r\n });\r\n }\r\n } else {\r\n //TODO gestire caso alternativo con più prodotti\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error fetching GWP data:', error);\r\n }\r\n }\r\n }\r\n );\r\n\r\n return () => {\r\n // Clean up the reaction when the component unmounts\r\n disposeReaction(); // Dispose of the reaction to avoid memory leaks\r\n };\r\n }, []);\r\n\r\n return props.renderView({\r\n ...props,\r\n modalVisible: modalVisible,\r\n promotionProps: gwpData,\r\n closePopupCallback: closePopup\r\n }) as React.ReactElement;\r\n};\r\n\r\nexport default GiftWithPurchase;\r\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 { IMediaGalleryThumbnailItemViewProps, IMediaGalleryThumbnailsViewProps, IMediaGalleryViewProps } from '../..';\n\nconst MediaGalleryView: React.FC = props => {\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n return (\n \n \n {Modal}\n {_renderThumbnails(Thumbnails)}\n \n );\n};\n\nconst _renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps): JSX.Element => {\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps, items } = thumbnails;\n\n return (\n \n {items && items.map(_renderThumbnailItem)}\n \n );\n};\n\nconst _renderThumbnailItem = (thumbnail: IMediaGalleryThumbnailItemViewProps): JSX.Element => {\n const { ThumbnailItemContainerProps, Picture } = thumbnail;\n\n return {Picture};\n};\n\nexport default MediaGalleryView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent, RatingComponent } from '@msdyn365-commerce/components';\nimport {\n IComponent,\n IComponentProps,\n ICoreContext,\n IGridSettings,\n IImageData,\n IImageSettings,\n Image,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\n/**\n * IActiveProductProps interface.\n */\nexport interface IActiveProductProps 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}\n\n/**\n * IActiveProduct interface.\n */\nexport interface IActiveProduct extends IComponent {}\n\n/**\n * RenderDescription function.\n * @param description - Product description string.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderDescription(description?: string): JSX.Element | null {\n return

{description}

;\n}\n\n/**\n * GetRatingAriaLabel function.\n * @param rating - Product rating number.\n * @param ratingAriaLabel - Product rating aria label.\n * @returns - Returns string.\n */\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\n const numberTwo: number = 2;\n if (rating && ratingAriaLabel) {\n const roundedRating = rating.toFixed(numberTwo);\n return format(ratingAriaLabel || '', roundedRating, '5');\n }\n return '';\n}\n\n/**\n * RenderRating function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param ratingId - The rating id.\n * @param avgRating - The average rating.\n * @param totalRatings - The total ratings.\n * @param ariaLabel - The rating aria label.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderRating(\n context: ICoreContext,\n typeName: string,\n ratingId: string,\n avgRating?: number,\n totalRatings?: number,\n ariaLabel?: string\n): JSX.Element | null {\n if (!avgRating) {\n return null;\n }\n\n const numberRatings = totalRatings?.toString() ?? undefined;\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\n\n return (\n \n );\n}\n\n/**\n * RenderPrice function.\n * @param context - The core context.\n * @param typeName - The type name of the module.\n * @param productId - The product id.\n * @param basePrice - The base price of the product.\n * @param adjustedPrice - The adjusted price of the product.\n * @param savingsText - The savings text of the product.\n * @param freePriceText - The free price text.\n * @param originalPriceText - The original price text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderPrice(\n context: ICoreContext,\n typeName: string,\n productId: string,\n basePrice?: number,\n adjustedPrice?: number,\n savingsText?: string,\n freePriceText?: string,\n originalPriceText?: string\n): JSX.Element | null {\n const price: ProductPrice = {\n BasePrice: basePrice,\n AdjustedPrice: adjustedPrice,\n CustomerContextualPrice: adjustedPrice\n };\n\n return (\n \n );\n}\n\n/**\n * RenderProductPlacementImage function.\n * @param requestContext - RequestContext.\n * @param imageSettings - The product image settings.\n * @param gridSettings - The viewport gird settings.\n * @param imageUrl - The product image url.\n * @param altText - The product image alt text.\n * @returns - Returns JSX.Element | null.\n */\nfunction renderProductPlacementImage(\n requestContext: IRequestContext,\n imageSettings?: IImageSettings,\n gridSettings?: IGridSettings,\n imageUrl?: string,\n altText?: string\n): JSX.Element | null {\n if (!imageUrl || !gridSettings || !imageSettings) {\n return null;\n }\n const imgData: IImageData = {\n src: imageUrl,\n altText: altText ? altText : ''\n };\n const imageProps = {\n gridSettings,\n imageSettings\n };\n imageProps.imageSettings.cropFocalRegion = true;\n return ;\n}\n\n/**\n * ActiveProduct constant.\n * @param props - The active product props.\n * @param props.data - The product search result data.\n * @param props.context - The core context.\n * @param props.imageSettings - The prodcut image settings.\n * @param props.savingsText - The product savings text.\n * @param props.freePriceText - The free price text.\n * @param props.originalPriceText - The original price text.\n * @param props.ratingAriaLabel - The product rating aria label.\n * @param props.typeName - The type name of the module.\n * @param props.id - The id of the product.\n * @returns - Returns JSX.Element | null.\n */\nexport const ActiveProductComponent: React.FC = ({\n data,\n context,\n imageSettings,\n savingsText,\n freePriceText,\n originalPriceText,\n ratingAriaLabel,\n typeName,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Do not need naming convention check for library prameters\n id\n}) => {\n const product = data.product;\n if (!product) {\n return null;\n }\n\n return (\n <>\n
\n
\n {renderProductPlacementImage(\n context.actionContext.requestContext,\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name\n )}\n
\n
\n

{product.Name}

\n {renderPrice(context, typeName, id, product.BasePrice, product.Price, savingsText, freePriceText, originalPriceText)}\n {renderDescription(product.Description)}\n {!context.app.config.hideRating &&\n renderRating(context, typeName, id, product.AverageRating, product.TotalRatings, ratingAriaLabel)}\n
\n
\n \n );\n};\n\nexport default ActiveProductComponent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\n/**\n * ILinksData: Interface for\n * Additional content.\n */\ninterface ILinksData {\n linkText?: string;\n linkUrl: Msdyn365.ILinkData;\n ariaLabel?: string;\n isOpenInNewTab?: boolean;\n}\n\n/**\n * IAdditionalContentData: Interface for\n * Active content.\n */\ninterface IAdditionalContentData {\n heading?: string;\n subtext?: string;\n links?: ILinksData[];\n}\n\n/**\n * IActiveImageAdditionalContentProps: Interface for\n * Active Image Additional Content Component props.\n */\nexport interface IActiveImageAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IActiveImageAdditionalContentViewProps: Interface for\n * Active Image Additional Content view props.\n */\nexport interface IActiveImageAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Active Image Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Active Image Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IActiveImageAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Active Image Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IActiveImageAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'msc-active-image__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.isOpenInNewTab,\n role: 'button'\n };\n const requestContext = props.requestContext;\n return (\n {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Active Image additonal content item props.\n * @param props - Active Image Additional content component props.\n * @returns IActiveImageAdditionalContentItemViewProps.\n */\nconst assembleNode = (item: IAdditionalContentData, props: IActiveImageAdditionalContentProps): IActiveImageAdditionalContentViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n additionalContentNode: { className: 'msc-active-image__details__additional-content' },\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentContainer: { className: 'msc-active-image__details__additional-content__container' },\n additionalContentItemLinks: { className: 'msc-active-image__details__additional__content__cta' }\n };\n};\n\n/**\n * ActiveImageAdditionalContent component.\n * @param props - Active Image Additional content component props.\n * @returns Active Image Additional content view props.\n */\nexport const activeImageAdditionalContent = (\n props: IActiveImageAdditionalContentProps\n): IActiveImageAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n return assembleNode(additionalContent, props);\n};\n\nexport default activeImageAdditionalContent;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport React from 'react';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\n\n/**\n * @interface IRgbColor\n * @description - The IRgbColor interface contract.\n */\nexport interface IRgbColor {\n rValue: number;\n gValue: number;\n bValue: number;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IArea {\n areaId: string;\n coords: number[];\n href?: string;\n center?: number[];\n primaryImageUrl?: string;\n productUrl: string;\n productSearchResult?: ProductSearchResult;\n}\n\n/**\n * @interface IArea\n * @description - The IArea interface contract.\n */\nexport interface IAreaMap {\n name: string;\n areas: IArea[];\n}\n\n/**\n * @enum CanvasCalculations\n * @description - The canvas calculations enum.\n */\nexport enum CanvasCalculations {\n defaultWidth = 0,\n defaultHeight = 0,\n defaultPositionX = 0,\n defaultPositionY = 0,\n defaultScale = 1,\n halfDivisor = 2,\n doubleMultiplier = 2,\n buttonHeight = 30,\n buttonPadding = 30,\n paddingAdjustment = 3,\n expandAnimationStartWidth = 10,\n expandAnimationEndWidth = 40,\n collapseAnimationStartWidth = 40,\n collapseAnimationEndWidth = 8,\n expandRadius = 12,\n collapseRadius = 8,\n rotation = 1.57,\n startAngle = 0,\n endAngle = 7,\n clearMargin = 50,\n clearHeight = 100,\n clearWidth = 100,\n textFadeInStartValue = 0,\n textFadeOutStartValue = 0.5,\n textFadeInterval = 0.01\n}\n\n/**\n * @enum CanvasStyles\n * @description - The canvas styles enum.\n */\nexport enum CanvasStyles {\n color = '#FFFFFF',\n buttonTextClor = '#000000'\n}\n\n/**\n * @enum\n * @description - The canvas styles enum.\n */\nexport interface IImageMapperResources {\n buttonText?: string;\n altText?: string;\n}\n\n/**\n * @interface IImageMapperProps\n * @description - The IImageMapperProps interface contract.\n */\nexport interface IImageMapperProps {\n imageData: IImageData;\n areaMap: IAreaMap;\n viewPort: string;\n requestContext: IRequestContext;\n color?: string;\n buttonTextClor?: string;\n width?: number;\n imgWidth?: number;\n activeImageRefs: React.RefObject;\n imageMapperResources?: IImageMapperResources;\n onLoad?(): void;\n onClick?(area: IArea, index: number, event: AreaEvent): void;\n onFocus?(area: IArea, index: number, event: AreaEvent): void;\n onMouseEnter?(area: IArea, index: number, event: AreaEvent): void;\n onMouseLeave?(area: IArea, index: number, event: AreaEvent): void;\n}\n\n/**\n * ImageMapper.\n */\nexport class ImageMapper extends React.Component {\n private readonly _backgroundImage: React.RefObject;\n\n private readonly _container: React.RefObject;\n\n private readonly _canvas: React.RefObject;\n\n private _isDesktopViewPort: boolean = false;\n\n private _context: CanvasRenderingContext2D | null | undefined = null;\n\n public constructor(props: IImageMapperProps) {\n super(props);\n this._backgroundImage = React.createRef();\n this._container = React.createRef();\n this._canvas = React.createRef();\n }\n\n /**\n * ComponentDidMount method.\n */\n public componentDidMount(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n this.renderAreas();\n this._context = null;\n }\n\n /**\n * ComponentDidUpdate method.\n */\n public componentDidUpdate(): void {\n const { viewPort } = this.props;\n this.initCanvas();\n this._isDesktopViewPort = viewPort === 'lg' || viewPort === 'xl';\n }\n\n /**\n * ShouldComponentUpdate method.\n * @param nextProps - Next props.\n * @returns Returns boolean.\n */\n public shouldComponentUpdate(nextProps: IImageMapperProps): boolean {\n let shouldRender = false;\n if (nextProps !== this.props) {\n shouldRender = true;\n }\n return shouldRender;\n }\n\n /**\n * GetActiveImageWidth method - Gets the active image width.\n * @returns Returns number | undefined.\n */\n public getActiveImageWidth = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return undefined;\n };\n\n /**\n * GetActiveImageHeight method - Gets the active image height.\n * @returns Returns number | undefined.\n */\n public getActiveImageHeight = (): number | undefined => {\n if (MsDyn365.isBrowser) {\n const activeImageReferenceValue = this.props.activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return undefined;\n };\n\n /**\n * ConvertHexToRgb method - This method takes color in HEX format and returns IRgbColor color object.\n * @param hexColor -The color hex value.\n * @returns -Returns IRgbColor object.\n */\n public convertHexToRgb = (hexColor: string): IRgbColor => {\n // RegEx used to execute the conversion of the hex color to rgb value.\n const regEx = new RegExp('^#?([a-f\\\\d]{2})([a-f\\\\d]{2})([a-f\\\\d]{2})$', 'u');\n\n // RegEx.exec method executes a search for a match in a specified string. Returns a result array, or null.\n const result = regEx.exec(hexColor);\n const defaultValue = 0;\n return result\n ? {\n rValue: Number.parseInt(result[1], 16),\n gValue: Number.parseInt(result[2], 16),\n bValue: Number.parseInt(result[3], 16)\n }\n : {\n rValue: defaultValue,\n gValue: defaultValue,\n bValue: defaultValue\n };\n };\n\n /**\n * ApplyFadingTransition method - Applys fading transition to button text.\n * @param text -The button text.\n * @param coords -The coordinates.\n * @param rgbColor -The RGB color object.\n * @param alpha -The alpha value of the button text.\n */\n public applyFadingTransition = (text: string, coords: number[], rgbColor: IRgbColor, alpha: number): void => {\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n context.fillStyle = `rgba(${rgbColor.rValue}, ${rgbColor.gValue}, ${rgbColor.bValue}, ${alpha} )`;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * Draw button method - Draws button and contains fixed hight, padding values.\n * @param text -The button text.\n * @param coords -The coordinates.\n */\n public drawButton = (text: string, coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const halfDivisor: number = CanvasCalculations.halfDivisor;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (context && this._isDesktopViewPort) {\n const buttonHeight = CanvasCalculations.buttonHeight;\n const buttonPadding = CanvasCalculations.buttonPadding;\n const paddingAdjustment = CanvasCalculations.paddingAdjustment;\n const buttonWidth = context.measureText(text).width + buttonPadding;\n const buttonPositionX = coords[0] - buttonWidth / halfDivisor;\n const buttonPositionY = coords[1] - buttonHeight / halfDivisor;\n const arcsize = buttonHeight / halfDivisor;\n\n context.beginPath();\n context.moveTo(buttonPositionX + arcsize, buttonPositionY);\n context.lineTo(buttonPositionX + buttonWidth - arcsize, buttonPositionY);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY,\n buttonPositionX + buttonWidth,\n buttonPositionY + arcsize,\n arcsize\n );\n context.lineTo(buttonPositionX + buttonWidth, buttonPositionY + buttonHeight - arcsize);\n context.arcTo(\n buttonPositionX + buttonWidth,\n buttonPositionY + buttonHeight,\n buttonPositionX + buttonWidth - arcsize,\n buttonPositionY + buttonHeight,\n arcsize\n );\n context.lineTo(buttonPositionX + arcsize, buttonPositionY + buttonHeight);\n context.arcTo(buttonPositionX, buttonPositionY + buttonHeight, buttonPositionX, buttonPositionY - arcsize, arcsize);\n context.lineTo(buttonPositionX, buttonPositionY + arcsize);\n context.arcTo(buttonPositionX, buttonPositionY, buttonPositionX + arcsize, buttonPositionY, arcsize);\n context.lineTo(buttonPositionX + arcsize, buttonPositionY);\n context.stroke();\n context.closePath();\n context.fillStyle = color;\n context.fill();\n context.fillStyle = buttonTextClor;\n if (MsDyn365.isBrowser && document.body.parentElement && document.body.parentElement.getAttribute('dir') === 'rtl') {\n context.fillText(text, coords[0] + buttonWidth / halfDivisor - buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n } else {\n context.fillText(text, coords[0] - buttonWidth / halfDivisor + buttonPadding / halfDivisor, coords[1] + paddingAdjustment);\n }\n }\n };\n\n /**\n * ExpandAnimation method - Shows expand animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public expandAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.expandAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.expandAnimationEndWidth;\n const radius = CanvasCalculations.expandRadius;\n const rotation = CanvasCalculations.rotation;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeInValue = CanvasCalculations.textFadeInStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Reders expand animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n context.fillStyle = color;\n if (buttonText) {\n if (animationStartWidth < animationEndWidth) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeInValue);\n textFadeInValue += CanvasCalculations.textFadeInterval;\n animationStartWidth++;\n } else {\n this.drawButton(buttonText, [pointPositionX, pointPositionY]);\n }\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * CollapseAnimation method - Shows collapse animation and contains fixed values to draw the circle and ellipse shapes.\n * @param coords -Coordinates.\n */\n public collapseAnimation = (coords: number[]): void => {\n const { color = CanvasStyles.color, buttonTextClor = CanvasStyles.buttonTextClor } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText;\n let animationStartWidth = CanvasCalculations.collapseAnimationStartWidth;\n const pointPositionX = coords[0];\n const pointPositionY = coords[1];\n const animationEndWidth = CanvasCalculations.collapseAnimationEndWidth;\n const rotation = CanvasCalculations.rotation;\n const clearMargin = CanvasCalculations.clearMargin;\n const clearHeight = CanvasCalculations.clearHeight;\n const clearWidth = CanvasCalculations.clearWidth;\n const radius = CanvasCalculations.collapseRadius;\n const startAngle = CanvasCalculations.startAngle;\n const endAngle = CanvasCalculations.endAngle;\n let textFadeOutValue = CanvasCalculations.textFadeOutStartValue;\n const buttonTextClorInRgb = this.convertHexToRgb(buttonTextClor.toLocaleLowerCase());\n\n /**\n * Animate method - Renders collapse animation.\n */\n const animate = () => {\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.beginPath();\n context.clearRect(pointPositionX - clearMargin, pointPositionY - clearMargin, clearWidth, clearHeight);\n context.ellipse(pointPositionX, pointPositionY, radius, animationStartWidth, rotation, startAngle, endAngle);\n context.fillStyle = color;\n context.fill();\n if (animationEndWidth < animationStartWidth && buttonText) {\n requestAnimationFrame(animate);\n this.applyFadingTransition(buttonText, coords, buttonTextClorInRgb, textFadeOutValue);\n textFadeOutValue -= CanvasCalculations.textFadeInterval;\n animationStartWidth--;\n }\n };\n\n if (this._isDesktopViewPort) {\n animate();\n }\n };\n\n /**\n * DrawCircle method - Renders active points.\n * @param coords -Coordinates.\n */\n public drawCircle = (coords: number[]): void => {\n const { color = CanvasStyles.color, viewPort } = this.props;\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n const startAngle: number = CanvasCalculations.startAngle;\n const context = this._canvas.current?.getContext('2d') ?? this._context;\n const radius = viewPort === 'xs' || viewPort === 'sm' ? coords[2] * doubleMultiplier : coords[2];\n if (!context) {\n return;\n }\n context.fillStyle = color;\n context.beginPath();\n context.strokeStyle = color;\n context.arc(coords[0], coords[1], radius, startAngle, Math.PI * doubleMultiplier);\n context.closePath();\n context.stroke();\n context.fill();\n };\n\n /**\n * ScaleCoords method - To scale the active point coordinates based on the window size.\n * @param coords -Coordinates.\n * @returns -Returns number[].\n */\n public scaleCoords = (coords: number[]): number[] => {\n const { imgWidth } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultScale: number = CanvasCalculations.defaultScale;\n\n // Calculate scale based on current 'width' and the original 'imgWidth'\n const width = this.getActiveImageWidth();\n const scale = width && imgWidth && imgWidth > defaultWidth ? width / imgWidth : defaultScale;\n return coords.map(coord => coord * scale);\n };\n\n /**\n * RenderPrefilledAreas method - To render active points in case of events.\n */\n public renderPrefilledAreas = (): void => {\n const { areaMap } = this.props;\n areaMap.areas.map(area => {\n this.drawCircle(this.scaleCoords(area.coords));\n return null;\n });\n };\n\n /**\n * ComputeCenter method - To re-calculate the center of active point based on window size.\n * @param area -IArea.\n * @returns -Returns number[].\n */\n public computeCenter = (area: IArea): number[] => {\n const scaledCoords = this.scaleCoords(area.coords);\n return [scaledCoords[0], scaledCoords[1]];\n };\n\n /**\n * HandleHoverOn method - To handle mouse hover on event.\n * @param area -IArea.\n */\n public handleHoverOn = (area: IArea): void => {\n if (area.center && this._canvas.current) {\n this.drawCircle(this.scaleCoords(area.coords));\n this.expandAnimation(area.center);\n }\n };\n\n /**\n * HandleHoverOff method - To handle mouse hover off event.\n * @param area -IArea.\n */\n public handleHoverOff = (area: IArea): void => {\n if (this._canvas.current) {\n const context = this._canvas.current.getContext('2d') ?? this._context;\n const canvasPositionX: number = CanvasCalculations.defaultPositionX;\n const canvasPositionY: number = CanvasCalculations.defaultPositionY;\n\n if (!context) {\n return;\n }\n context.clearRect(canvasPositionX, canvasPositionY, this._canvas.current.width, this._canvas.current.height);\n this.renderPrefilledAreas();\n if (area.center) {\n this.collapseAnimation(area.center);\n }\n }\n };\n\n /**\n * Click method - Mouse click event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public click = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onClick } = this.props;\n if (onClick) {\n event.preventDefault();\n onClick(area, index, event);\n }\n };\n\n /**\n * HoverOn method - Mouse hover on event.\n * @param area -IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOn = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseEnter } = this.props;\n this.handleHoverOn(area);\n if (onMouseEnter) {\n onMouseEnter(area, index, event);\n }\n };\n\n /**\n * HoverOff method - Mouse hover off event.\n * @param area - IArea.\n * @param index - Number.\n * @returns - Void.\n */\n public hoverOff = (area: IArea, index: number) => (event: AreaEvent): void => {\n const { onMouseLeave } = this.props;\n\n this.handleHoverOff(area);\n\n if (onMouseLeave) {\n onMouseLeave(area, index, event);\n }\n };\n\n /**\n * RenderAreas method - Renders active points at given coordinates.\n * @returns -Returns JSX.Element[].\n */\n public renderAreas = (): JSX.Element[] => {\n const { areaMap, viewPort } = this.props;\n const buttonText = this.props.imageMapperResources?.buttonText ? this.props.imageMapperResources.buttonText : '';\n const altText = this.props.imageMapperResources?.altText ? this.props.imageMapperResources.altText : '';\n const doubleMultiplier: number = CanvasCalculations.doubleMultiplier;\n\n return areaMap.areas.map((area, index) => {\n const scaledCoords = this.scaleCoords(area.coords);\n const xsRadius = area.coords[2] * doubleMultiplier;\n if (viewPort === 'xs') {\n scaledCoords[2] = xsRadius;\n }\n const center = this.computeCenter(area);\n const extendedArea = { ...area, scaledCoords, center };\n const areaKey = `area-${index}`;\n const altTextWithProductName = altText\n .replace('{buttonText}', buttonText ? buttonText : '')\n .replace('{productName}', area.productSearchResult?.Name ? area.productSearchResult.Name : '');\n return (\n \n );\n });\n };\n\n /**\n * InitCanvas method - To render the canvas.\n */\n public initCanvas = (): void => {\n if (!this._canvas.current || !this._backgroundImage.current || !this._container.current) {\n return;\n }\n\n const { color, onLoad } = this.props;\n const defaultWidth: number = CanvasCalculations.defaultWidth;\n const defaultHeight: number = CanvasCalculations.defaultHeight;\n\n const canvasWidth = this.getActiveImageWidth() ?? defaultWidth;\n const canvasHeight = this.getActiveImageHeight() ?? defaultHeight;\n\n this._canvas.current.width = canvasWidth;\n this._canvas.current.height = canvasHeight;\n this._container.current.style.width = `${canvasWidth}px`;\n\n const context = this._canvas.current.getContext('2d') ?? this._context;\n if (!context) {\n return;\n }\n context.fillStyle = color ?? '';\n\n if (onLoad) {\n onLoad();\n }\n\n this.renderPrefilledAreas();\n };\n\n /**\n * Render method - To render the image mapper component with active image, canvas and active points.\n * @returns -Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const { imageData, areaMap, requestContext } = this.props;\n\n return (\n
\n \n \n \n {this.renderAreas()}\n \n
\n );\n }\n}\n\nexport default ImageMapper;\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 { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport {\n activeImageAdditionalContent,\n ActiveProductComponent,\n IActiveImageAdditionalContentViewProps,\n IArea,\n IAreaMap,\n IImageMapperProps,\n ImageMapper\n} from '../active-image-utilities';\nimport { IActiveImageData } from './active-image.data';\nimport { IActiveImageProps } from './active-image.props.autogenerated';\n\n/**\n * @type AreaEvent for active points\n */\ntype AreaEvent = Event | React.MouseEvent | React.FocusEvent;\n\n/**\n * @interface IActiveImageViewProps\n * @classdesc - The IActiveImageViewProps interface contract.\n */\nexport interface IActiveImageViewProps extends IActiveImageProps<{}>, IImageMapperProps {\n activePointContainer: IModuleProps;\n activePointDetailsContainer: INodeProps;\n imageMapper: React.ReactNode;\n overlay: React.ReactNode;\n productCard: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IActiveImageAdditionalContentViewProps;\n productCardleftPosition: number;\n productCardtopPosition: number;\n handleAdditionalText?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalParagraph?(event: MsDyn365.ContentEditableEvent): void;\n handleAdditionalLinkText?(event: MsDyn365.ContentEditableEvent): void;\n}\n\n/**\n * @interface IActiveImageLinksData\n * @classdesc - The IActiveImageLinksData interface contract.\n */\nexport interface IActiveImageLinksData {\n linkText?: string;\n linkUrl: MsDyn365.ILinkData;\n ariaLabel?: string;\n willOpenInNewTab?: boolean;\n}\n\n/**\n * @interface IActiveImageState\n * @classdesc - The IActiveImageState interface contract.\n */\ninterface IActiveImageState {\n clientWidth: number;\n area: IArea | null;\n viewport: string;\n overlayClass: string;\n}\n\n/**\n * @enum ActiveImageConstants\n * @description - The active image constants enum.\n */\nexport enum ActiveImageConstants {\n timeoutInterval = 200,\n enterKey = 'Enter',\n escKey = 'Escape'\n}\n\n/**\n *\n * ActiveImage class.\n * @extends {React.PureComponent & IImageMapperProps, IActiveImageState>}\n */\nexport class ActiveImage extends React.PureComponent & IImageMapperProps, IActiveImageState> {\n private readonly _telemetryContent: ITelemetryContent;\n\n private _isDesktopViewPort: boolean;\n\n private readonly _defaultProductCardWidth: number = 315;\n\n private readonly _defaultProdutCardHight: number = 490;\n\n private readonly _activePoints: IArea[] = [];\n\n private readonly _activeImageRefs: React.RefObject;\n\n private readonly _activeImageClass: string;\n\n private readonly _productCardDivRef: React.RefObject;\n\n public constructor(props: IActiveImageProps & IImageMapperProps) {\n super(props);\n this._telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this._activeImageClass = `msc-active-image-${this.getActiveImageId()}`;\n this.state = {\n clientWidth: 0,\n area: null,\n viewport,\n overlayClass: ''\n };\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n this._activeImageRefs = React.createRef();\n this._productCardDivRef = React.createRef();\n }\n\n public componentDidMount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.addEventListener('resize', this.updateClientWidth);\n document.addEventListener('keydown', this.keyDown, false);\n document.addEventListener('mousedown', this._handleOutsideClick);\n }\n setTimeout(() => {\n this.updateClientWidth();\n }, ActiveImageConstants.timeoutInterval);\n\n if (MsDyn365.msdyn365Commerce.isBrowser && this._activeImageRefs.current) {\n const images: HTMLCollectionOf = this._activeImageRefs.current.getElementsByClassName(\n 'msc-thumbnail_image msc-active-image-img'\n );\n if (ArrayExtensions.hasElements(Array.from(images))) {\n images[0].removeAttribute('usemap');\n }\n }\n }\n\n /**\n * AddActivePoints method - To handle add Active Points.\n * @param area - IArea.\n * @param product - ProductSearchResult.\n * @param coords - Coords.\n * @param productUrl - String.\n */\n public addActivePoints = (area: IArea | undefined, product: ProductSearchResult, coords: number[], productUrl: string): void => {\n if (!area) {\n this._activePoints.push({\n areaId: product.RecordId.toString(),\n coords,\n primaryImageUrl: product.PrimaryImageUrl ?? '',\n productUrl,\n productSearchResult: product\n });\n }\n };\n\n /**\n * ComponentWillUnmount method.\n */\n public componentWillUnmount(): void {\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n window.removeEventListener('resize', this.updateClientWidth);\n document.removeEventListener('keydown', (this.keyDown as unknown) as EventListener, false);\n document.removeEventListener('mousedown', this._handleOutsideClick, false);\n }\n }\n\n /**\n * UpdateClientWidth method to update client width in state.\n */\n public updateClientWidth = (): void => {\n const viewport = isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n this.setState({ clientWidth: this.getActiveImageWidth(), viewport });\n this._isDesktopViewPort = viewport === 'lg' || viewport === 'xl';\n };\n\n /**\n * Render method.\n * @returns - Returns JSX.Element | null.\n */\n public render(): JSX.Element | null {\n const viewProps: IActiveImageViewProps = {\n ...(this.props as IImageMapperProps & IActiveImageProps<{}>),\n activePointContainer: {\n moduleProps: this.props,\n className: classnames('msc-active-image', this._activeImageClass, this.props.config.className)\n },\n activePointDetailsContainer: {\n tag: 'div',\n className: classnames('msc-active-image-wrapper', this._activeImageClass, this.props.config.className),\n ref: this._activeImageRefs\n },\n imgWidth: this.props.config.canvasWidth,\n imageMapper: this.renderImageMapper(),\n overlay: this.renderOverlay(),\n productCard: this.renderProductCard(),\n productCardleftPosition: this.getProductCardPositionX(),\n productCardtopPosition: this.getProductCardPositionY(),\n title: this.renderActiveImageDetailsHeading(),\n text: this.renderActiveImageDetailsParagraph(),\n links: this.renderActiveImageDetailsLinks(),\n detailsContainer: { className: 'msc-active-image__details' },\n detailsContainerCta: { className: 'msc-active-image__details__cta' },\n additionalContent: activeImageAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleAdditionalLinkText: this.handleAdditionalTextChange\n };\n\n return this.props.renderView(viewProps);\n }\n\n /**\n * RenderImageMapper method - To render image mapper.\n * @returns - Returns React.ReactNode | null.\n */\n public renderImageMapper = (): React.ReactNode | null => {\n const { config, context } = this.props;\n const defaultPosition: number = 0;\n const defaultLength: number = 0;\n const productResults = this.props.data.products.result;\n if (config.activePoints && productResults) {\n for (const product of productResults) {\n for (const configProduct of config.activePoints) {\n if (product.ItemId === configProduct.itemId) {\n const productUrl = getProductPageUrlSync(product.Name ?? '', product.RecordId, context.actionContext, undefined);\n const coords = [\n configProduct.xPosition ?? defaultPosition,\n configProduct.yPosition ?? defaultPosition,\n configProduct.radius ?? defaultPosition\n ];\n const area = this._activePoints.find(activePoint => JSON.stringify(activePoint.coords) === JSON.stringify(coords));\n this.addActivePoints(area, product, coords, productUrl);\n }\n }\n }\n }\n const mappedArea: IAreaMap = {\n name: `map-${this._activeImageClass}`,\n areas: this._activePoints.length > defaultLength ? this._activePoints : []\n };\n\n // If image is null, we want to render the placeholder SVG - by passing image data with empty src\n return (\n \n );\n };\n\n /**\n * EnterArea method - To handle mouse enter event.\n * @param area - Active point area.\n * @param index - Active point index.\n * @param event - Active point AreaEvent.\n */\n public enterArea = (area: IArea, index: number, event: AreaEvent): void => {\n this.setState({ area, overlayClass: 'msc-active-image-overlay' });\n if (this.props.onMouseEnter) {\n this.props.onMouseEnter(area, index, event);\n }\n if (event.type.toLocaleLowerCase() === 'click' && this._isDesktopViewPort) {\n window.open(area.productUrl, '_self');\n }\n };\n\n /**\n * LeaveArea method - To handle mouse leave event.\n */\n public leaveArea = (): void => {\n if (this._isDesktopViewPort) {\n this.resetState();\n }\n };\n\n /**\n * ResetState method - To reset the state for area and overlayclass.\n */\n public resetState = (): void => {\n this.setState({ area: null, overlayClass: '' });\n };\n\n /**\n * RenderProductComponent method - To render the product card with product information.\n * @returns - Returns React.ReactNode.\n */\n public renderProductComponent = (): React.ReactNode => {\n if (this.state.area?.productSearchResult) {\n const baseImageUrl: string = this.props.context.request.apiSettings.baseImageUrl;\n const imageUrl: string = this.state.area.primaryImageUrl ?? '';\n const primaryImageUrl: string = `${baseImageUrl}${imageUrl}`;\n const product: ProductSearchResult = this.state.area.productSearchResult;\n product.PrimaryImageUrl = primaryImageUrl;\n\n return (\n \n );\n }\n return React.Fragment;\n };\n\n /**\n * RenderProductCard method - To render product cards.\n * @returns - Returns React.ReactNode.\n */\n public renderProductCard = (): React.ReactNode => {\n const { area } = this.state;\n\n return (\n <>\n {area?.center && (\n
\n
\n {!this._isDesktopViewPort &&
\n
\n )}\n \n );\n };\n\n /**\n * RenderOverlay method - To render overlay for non desktop viewports.\n * @returns - Returns React.ReactNode.\n */\n public renderOverlay = (): React.ReactNode => {\n return <>{!this._isDesktopViewPort &&
};\n };\n\n /**\n * GetProductCardPositionX method - Provides product card x position to the left or right of active point based on available space.\n * For xs, sm and md viewports it provides x position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionX = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsWidth = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.w\n : defaultImageSettings.viewports.lg?.w;\n const defaultPositionX: number = 0;\n const halfDivisor: number = 2;\n const productCardWidth: number = productImageSettingsWidth ? productImageSettingsWidth : this._defaultProductCardWidth;\n const { area, clientWidth, viewport } = this.state;\n const pointPositionX = area?.center?.[0] ?? clientWidth / halfDivisor;\n const leftAllignPosition = pointPositionX - productCardWidth - productCardWidth / halfDivisor;\n const rightAllignPosition = pointPositionX + productCardWidth / halfDivisor;\n let position: number = (clientWidth - productCardWidth) / halfDivisor;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n if (leftAllignPosition < defaultPositionX) {\n position = rightAllignPosition;\n } else {\n position = leftAllignPosition;\n }\n }\n return position;\n };\n\n /**\n * GetProductCardPositionY method - Provides product card y position in center with respect to active point.\n * For xs, sm and md viewports it provides y position for the center alignment.\n * @returns - Returns number.\n */\n public getProductCardPositionY = (): number => {\n const defaultImageSettings = this.getDefaultImageSettings();\n const productImageSettingsHeight = this.props.config.productImageSettings?.viewports\n ? this.props.config.productImageSettings.viewports.lg?.h\n : defaultImageSettings.viewports.lg?.h;\n const halfDivisor: number = 2;\n const { area, viewport } = this.state;\n const produtCardHight: number = productImageSettingsHeight ? productImageSettingsHeight : this._defaultProdutCardHight;\n const pointPositionY = (this.getActiveImageHeight() - produtCardHight) / halfDivisor;\n let position: number = pointPositionY;\n if (viewport !== 'xs' && viewport !== 'sm' && viewport !== 'md') {\n position = (area?.center?.[1] ?? this.getActiveImageHeight() / halfDivisor) - produtCardHight / halfDivisor;\n }\n return position;\n };\n\n /**\n * GetDefaultImageSettings method.\n * @returns MsDyn365.IImageSettings.\n */\n public getDefaultImageSettings = (): MsDyn365.IImageSettings => {\n const defaultImageSettings: MsDyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n lg: { q: 'w=275&h=275&m=6', w: 275, h: 275 },\n xl: { q: 'w=275&h=275&m=6', w: 275, h: 275 }\n },\n lazyload: true\n };\n\n return defaultImageSettings;\n };\n\n /**\n * KeyDown method - To handle keydown event.\n * @param event - KeyboardEvent.\n */\n public keyDown = (event: KeyboardEvent): void => {\n if (event.key === ActiveImageConstants.enterKey) {\n const target: HTMLElement = event.target as HTMLElement;\n if (target.nodeName === 'AREA') {\n const area: HTMLAreaElement = target as HTMLAreaElement;\n if (area.href) {\n window.open(area.href, '_self');\n }\n }\n }\n if (event.key === ActiveImageConstants.escKey) {\n this.resetState();\n }\n };\n\n /**\n * GetActiveImageWidth method - To get active image width.\n * @returns Returns number.\n */\n public getActiveImageWidth = (): number => {\n const defaultWidth: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientWidth;\n }\n }\n return defaultWidth;\n };\n\n /**\n * GetActiveImageHeight method - To get active image height.\n * @returns Returns number.\n */\n public getActiveImageHeight = (): number => {\n const defaultHeight: number = 0;\n if (MsDyn365.msdyn365Commerce.isBrowser) {\n const activeImageReferenceValue = this._activeImageRefs;\n if (activeImageReferenceValue.current !== null) {\n return activeImageReferenceValue.current.clientHeight;\n }\n }\n return defaultHeight;\n };\n\n /**\n * HandleLinkTextChange method - To handle link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleTextChange method - To handle text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * HandleParagraphChange method - To handle paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * HandleAdditionalTextChange method - To handle additional text change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalLinkTextChange method - To handle additional link text change event.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * HandleAdditionalParagraphChange method - To handle additional paragraph change event.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * RenderActiveImageDetailsLinks method - To render active image details links.\n * @returns - React node.\n */\n public renderActiveImageDetailsLinks = (): React.ReactNode[] | undefined => {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this._telemetryContent, '');\n\n return links?.map((linkData: IActiveImageLinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this._telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'msc-active-image__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.willOpenInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n };\n\n /**\n * RenderActiveImageDetailsHeading method - To render active image details heading.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsHeading = (): React.ReactNode | undefined => {\n const { heading } = this.props.config;\n\n return (\n heading && (\n \n )\n );\n };\n\n /**\n * RenderActiveImageDetailsParagraph method - To render active image details paragraph.\n * @returns - React.ReactNode | undefined.\n */\n public renderActiveImageDetailsParagraph = (): React.ReactNode | undefined => {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n \n )\n );\n };\n\n /**\n * GetActiveImageId - To get active image id from src.\n * @returns - String.\n */\n public getActiveImageId = (): string => {\n const { activeImage } = this.props.config;\n let activeImageId: string = '';\n if (activeImage?.src) {\n const activeImageSource = activeImage.src.split('/');\n const decrementOne: number = 1;\n const activeImageIdPart = activeImageSource[activeImageSource.length - decrementOne].split('?');\n activeImageId = activeImageIdPart[0] ?? '';\n }\n return activeImageId;\n };\n\n /**\n * Handle outside click method - To handle outside click of the active image product.\n * @param event - Mouse event.\n */\n private readonly _handleOutsideClick = (event: MouseEvent) => {\n if (this._productCardDivRef.current?.contains(event.target as Node)) {\n return;\n }\n this.resetState();\n };\n}\nexport default ActiveImage;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getTelemetryObject, IModuleProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselData } from './carousel.data';\nimport { ICarouselProps } from './carousel.props.autogenerated';\nimport { ICarouselState } from './carousel.state';\n\nexport interface ICarouselViewProps extends ICarouselProps<{}>, ICarouselState {\n closeAnimation: string;\n carouselContainer: IModuleProps;\n telemetryContent: ITelemetryContent;\n next(): void;\n previous(): void;\n onIndicatorsClickHandler(): void;\n handleDismissCarousel(): void;\n handleOnExited(): void;\n handleOnExiting(): void;\n}\n\n/**\n *\n * CarouselModule component.\n * @extends {React.PureComponent>}\n */\nclass CarouselModule extends React.PureComponent, ICarouselState> {\n private animating: boolean;\n\n private readonly telemetryContent: ITelemetryContent;\n\n constructor(props: ICarouselProps, state: ICarouselState) {\n super(props);\n this.state = { activeIndex: 0, closeNow: false, dismissCarousel: false };\n this.animating = false;\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public componentDidMount(): void {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n if (this.props.context.request.cookies.get(`CarouselDismiss_${this.props.id}`) === undefined) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'false');\n this.setState({ dismissCarousel: false });\n }\n }\n }\n\n public render(): JSX.Element | null {\n if (this.state.dismissCarousel) {\n return null;\n }\n\n const { className } = this.props.config;\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n ...this.state,\n telemetryContent: this.telemetryContent,\n carouselContainer: {\n moduleProps: this.props,\n className: classnames('ms-carousel', className)\n },\n closeAnimation: this.state.closeNow ? 'close-now' : '',\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n handleDismissCarousel: this._handleDismissCarousel,\n handleOnExited: this._onExited,\n handleOnExiting: this._onExiting\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Function implementation to dismiss the Carousel.\n */\n private readonly _handleDismissCarousel = (): void => {\n if (this.props.context && this.props.context.request && this.props.context.request.cookies) {\n this.props.context.request.cookies.set(`CarouselDismiss_${this.props.id}`, 'true');\n this.setState({ dismissCarousel: true });\n }\n };\n\n /**\n * Function implementation to move to next slide.\n */\n private readonly _next = (): void => {\n const { slots } = this.props;\n const nextIndex = this.state.activeIndex === (slots && slots.content && slots.content.length - 1) ? 0 : this.state.activeIndex + 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n /**\n * Function implementation to move to previous slide.\n */\n private readonly _previous = (): void => {\n const slots = this.props.slots && this.props.slots.content;\n const nextIndex = this.state.activeIndex === 0 ? (slots ? slots.length - 1 : 0) : this.state.activeIndex - 1;\n\n if (this.animating) {\n this.setState({ closeNow: true, activeIndex: nextIndex });\n } else {\n this.setState({ activeIndex: nextIndex });\n }\n };\n\n private readonly _onExiting = (): void => {\n this.animating = true;\n };\n\n private readonly _onExited = (): void => {\n this.animating = false;\n this.setState({ closeNow: false });\n };\n\n /**\n * Function implementation to move to a given slide.\n * @param newIndex\n */\n private readonly _goToIndex = (newIndex: number): void => {\n if (this.animating) {\n return;\n }\n this.setState({ activeIndex: newIndex });\n };\n}\n\nexport default CarouselModule;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n IAction,\n IActionContext,\n IActionInput,\n IAny,\n ICommerceApiSettings,\n ICreateActionContext,\n IGeneric\n} from '@msdyn365-commerce/core';\nimport { getCartState } from '@msdyn365-commerce/global-state';\nimport { ProductDeliveryOptions, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n ActiveCartProductsInput,\n QueryResultSettingsProxy,\n buildCacheKey,\n getActiveCartProductsAction\n} from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Input class for pickup delivery options for items in cart.\n */\nexport class ProductPickUpOptionsForCartLineItems implements IActionInput {\n public readonly apiSettings: ICommerceApiSettings;\n\n public constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n /**\n * Get Cache Key.\n * @returns - Cache key string.\n */\n public getCacheKey = (): string => buildCacheKey('ActiveCartLineItemsPickUpOptions', this.apiSettings);\n\n /**\n * Get Cachetype Name.\n * @returns - Cache name string.\n */\n public getCacheObjectType = (): string => 'ActiveCartLineItemsPickUpOptions';\n\n /**\n * Get Cachetype.\n * @returns - CacheType enum.\n */\n public dataCacheType = (): CacheType => 'none';\n}\n\n/**\n * CreateInput method for the GetPickUpOptionCartLineItems method.\n * @param inputData - The input data passed to the createInput method.\n * @returns - Input for data action.\n */\nconst createInput = (inputData: ICreateActionContext>) => {\n return new ProductPickUpOptionsForCartLineItems(inputData.requestContext.apiSettings);\n};\n\n/**\n * The action method for the GetPickUpOptionCartLineItems data action.\n * @param input - The action input.\n * @param context - The action context.\n * @returns - Order Template object.\n */\nexport async function getPickUpOptionsForCartLineItems(\n input: ProductPickUpOptionsForCartLineItems,\n context: IActionContext\n): Promise {\n // If no input is provided fail out\n if (!input.apiSettings.channelId) {\n throw new Error('[getPickUpOptionsForCartLineItems]No valid Input was provided, failing');\n }\n const cartState = await getCartState(context);\n const cart = cartState.cart;\n const products = await getActiveCartProductsAction(new ActiveCartProductsInput(), context);\n const filterOption = 4;\n const response: ProductDeliveryOptions[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- existing code.\n if (cart === undefined || !ArrayExtensions.hasElements(products)) {\n return Promise.resolve(response);\n }\n\n const pickupoptions = await ProductsDataActions.getDeliveryOptionsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n products.map(product => product.RecordId),\n {},\n filterOption\n );\n\n return pickupoptions;\n}\n\n/**\n * The GetPickupOptionCartLineItems Data Action\n * Returns pickup options.\n */\nexport const getPickUpOptionsForCartLineItemsDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/retail-actions/get-pickup-options-for-cartlines',\n action: getPickUpOptionsForCartLineItems as IAction,\n input: createInput\n});\n\nexport default getPickUpOptionsForCartLineItemsDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n CartLine,\n ChannelDeliveryOptionConfiguration,\n DeliveryOption,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPickUpInStoreViewProps {\n callbacks: {\n toggleBopis(isBopisSelected: boolean): void;\n };\n defaultComponent?: React.ReactNode;\n orgUnitName?: string;\n isBopisSelected: boolean;\n ContainerProps: INodeProps;\n deliveryOption?: string;\n}\n\nexport interface IPickUpInStoreProps {\n cartline: CartLine;\n product: SimpleProduct;\n shipitText: string;\n pickUpInStoreText: string;\n changeStoreText: string;\n cartState: ICartState | undefined;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n orgUnitLocations?: OrgUnitLocation[] | undefined;\n deliveryOptions?: ProductDeliveryOptions;\n pickupDeliveryModeCode?: string;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n retailMulitplePickupFeatureState?: boolean;\n locationChangedHandler(): void;\n}\n\nexport const PickUpInStore = (props: IPickUpInStoreProps): IPickUpInStoreViewProps | undefined => {\n const _onLocationChangedCallback = async (\n orgUnitLocation: OrgUnitLocation,\n cartState: ICartState | undefined,\n cartline: CartLine,\n deliveryMode?: string\n ) => {\n if (!cartState) {\n return Promise.resolve();\n }\n return cartState\n .updateCartLinePickupLocation({ cartLineId: cartline.LineId!, location: orgUnitLocation, deliveryMode })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n };\n\n const _toggleBOPIS = (isBopisSelected: boolean) => {\n const { storeSelectorStateManager, product, cartline, cartState, storeSelectorModuleId } = props;\n\n if (isBopisSelected) {\n if (!storeSelectorStateManager) {\n return;\n }\n storeSelectorStateManager\n .openDialog({\n id: storeSelectorModuleId,\n product,\n alreadySelectedLocation: {\n OrgUnitNumber: cartline.FulfillmentStoreId\n },\n deliveryOptions: props.deliveryOptions,\n onLocationSelected: async (orgUnitLocation, deliveryMode: string | undefined) => {\n return _onLocationChangedCallback(orgUnitLocation, cartState, cartline, deliveryMode);\n }\n })\n .catch(error => {});\n } else {\n if (!cartState) {\n return;\n }\n cartline.DeliveryMode = '';\n cartline.FulfillmentStoreId = '';\n cartline.ShippingAddress = {};\n cartState\n .clearCartLinePickupLocation({ cartLineId: cartline.LineId! })\n .then(result => {\n if (result.status === 'SUCCESS') {\n props.locationChangedHandler();\n }\n })\n .catch(error => {});\n }\n };\n\n const _getOrgUnitName = (fulfillmentStoreId: string | undefined, orgUnitLocations: OrgUnitLocation[] | undefined) => {\n if (!orgUnitLocations || !fulfillmentStoreId || orgUnitLocations.length === 0) {\n return '';\n }\n\n const foundLocation = orgUnitLocations.find(orgUnitLocation => {\n return orgUnitLocation.OrgUnitNumber === fulfillmentStoreId;\n });\n\n if (foundLocation) {\n return foundLocation.OrgUnitName;\n }\n return fulfillmentStoreId;\n };\n\n const _renderShippingMethod = (\n cartLine: CartLine,\n shipItText: string,\n pickupInStoretext: string,\n changeStoreText: string,\n orgUnitLocations: OrgUnitLocation[] | undefined\n ): JSX.Element => {\n const orgUnitName = _getOrgUnitName(cartLine.FulfillmentStoreId, orgUnitLocations);\n const bopisSelected = !!cartLine.FulfillmentStoreId;\n\n const toggleBOPIS = (isBopisSelected: boolean) => {\n return () => {\n _toggleBOPIS(isBopisSelected);\n };\n };\n\n return (\n <>\n \n \n {cartLine.FulfillmentStoreId ? (\n
\n {orgUnitName}\n \n
\n ) : null}\n \n );\n };\n\n const _getDeliveryOption = (pickupStore: IPickUpInStoreProps, deliveryOptions: ProductDeliveryOptions) => {\n const delivery = deliveryOptions?.DeliveryOptions?.find(option => option.Code === pickupStore.pickupDeliveryModeCode);\n return delivery?.Description;\n };\n\n /**\n * Method to check if we have atleast one common delivery code between product and channel.\n * @param productdeliveryOptions - Product DeliveryOption List.\n * @param storePickUpOptionList - Channel DeliveryOption List.\n * @returns Boolean flag.\n */\n const matchDeliveryOptions = (\n productdeliveryOptions: DeliveryOption[] | undefined,\n storePickUpOptionList: string[] | undefined\n ): boolean => {\n const deliveryOption: string[] = [];\n productdeliveryOptions?.map(delivery => {\n const pickup = storePickUpOptionList?.find(deliveryCode => deliveryCode === delivery.Code);\n if (pickup) {\n deliveryOption.push(pickup);\n }\n return deliveryOption;\n });\n\n return ArrayExtensions.hasElements(deliveryOption);\n };\n\n // If no delivery options present on the product, or none of the delivery options\n // match the PickupDeliveryModeCode, that means the item cannot be used for BOPIS\n if (!props.deliveryOptions || !props.deliveryOptions.DeliveryOptions) {\n return undefined;\n }\n\n if (props.retailMulitplePickupFeatureState && props.channelDeliveryOptionConfig) {\n if (!matchDeliveryOptions(props.deliveryOptions.DeliveryOptions, props.channelDeliveryOptionConfig?.PickupDeliveryModeCodes)) {\n return undefined;\n }\n } else if (\n !props.pickupDeliveryModeCode ||\n !props.deliveryOptions.DeliveryOptions.find(option => option.Code === props.pickupDeliveryModeCode)\n ) {\n return undefined;\n }\n\n return {\n callbacks: {\n toggleBopis: _toggleBOPIS\n },\n defaultComponent: _renderShippingMethod(\n props.cartline,\n props.shipitText,\n props.pickUpInStoreText,\n props.changeStoreText,\n props.orgUnitLocations\n ),\n orgUnitName: _getOrgUnitName(props.cartline.FulfillmentStoreId, props.orgUnitLocations),\n isBopisSelected: !!props.cartline.FulfillmentStoreId,\n deliveryOption: _getDeliveryOption(props, props.deliveryOptions),\n ContainerProps: {\n className: 'msc-cart-line__bopis-container'\n }\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n AddToOrderTemplateComponent,\n AddToWishlistComponent,\n CartLineItemComponent,\n IAddToOrderTemplateDialogResources,\n ICartlineResourceString,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult\n} from '@msdyn365-commerce/components';\nimport MsDyn365, {\n IAny,\n ICoreContext,\n IGeneric,\n IGridSettings,\n IImageSettings,\n ITelemetry,\n TelemetryEvent,\n isChannelTypeB2B\n} from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResultsByLineId,\n ChannelDeliveryOptionConfiguration,\n CommerceList,\n Customer,\n OrgUnitLocation,\n ProductDeliveryOptions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductDimensionType, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { IStoreSelectorStateManager } from '@msdyn365-commerce-modules/bopis-utilities';\nimport {\n ArrayExtensions,\n getInvoiceDetailsPageUrlSync,\n getProductUrlSync,\n IProductInventoryInformation,\n isCartLineItemPickUpType,\n ObjectExtensions,\n OrderTemplate,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { getProductByProductId, getProductByProductIdAndWarehouse } from '../../../Common/get-product';\nimport { IPickUpInStoreViewProps, PickUpInStore } from './cart-pick-up-in-store';\n\nexport interface ICartLineItemsProps {\n cartlines: CartLine[];\n cartlinesErrors: CartLineValidationResultsByLineId;\n cartState: ICartState | undefined;\n orgUnitLocations: OrgUnitLocation[] | undefined;\n resources: ICartlineResourceString;\n productAvailabilites: IProductInventoryInformation[] | undefined;\n products: SimpleProduct[] | undefined;\n productDeliveryOptions: ProductDeliveryOptions[] | undefined;\n pickupDeliveryModeCode?: string;\n catalogs?: ProductCatalog[];\n retailMulitplePickupFeatureState?: boolean;\n\n /* GridSettings for the product image in cartline */\n gridSettings: IGridSettings;\n\n /* ImageSettings for the product image in cartline */\n imageSettings: IImageSettings;\n id: string;\n typeName: string;\n context: ICoreContext>;\n telemetry: ITelemetry;\n removeButtonText: string;\n addToWishlistButtonText: string;\n removeFromWishlistButtonText: string;\n shipItText: string;\n pickitUpText: string;\n changeStoreText: string;\n outOfStockText: string;\n outOfRangeOneText: string;\n outOfRangeFormatText: string;\n storeSelectorStateManager: IStoreSelectorStateManager | undefined;\n isStockCheckEnabled: boolean;\n wishlists: CommerceList[] | undefined;\n defaultWishlistName: string;\n maxCartlineQuantity: number;\n includeErrors?: boolean;\n showShippingChargesForLineItems?: boolean;\n telemetryContent?: ITelemetryContent;\n isQuantityLimitsFeatureEnabled: boolean;\n hasInvoiceLine?: boolean;\n storeSelectorModuleId?: string;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n\n addToOrderTemplateDialogResources: IAddToOrderTemplateDialogResources;\n createOrderTemplateDialogResources: IOrderTemplateNameDialogResources;\n itemAddedToOrderTemplateDialogResources: IItemAddedToOrderTemplateDialogResources;\n duplicateItemsWhenAddingToOrderTemplateDialogResources: IDuplicateItemsWhenAddingToOrderTemplateDialogResources;\n\n addToOrderTemplateButtonText: string;\n addToOrderTemplateButtonTooltip: string;\n addToOrderTemplateMessage: string;\n addItemToOrderTemplateError: string;\n orderTemplates: OrderTemplate[] | undefined;\n customerInformation: Customer | undefined;\n shouldIgnoreWarehouse: boolean | undefined;\n productAvailability?: AsyncResult;\n productPickUpOptions?: ProductDeliveryOptions[] | undefined;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogId?: number;\n\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n updateCartLinesQuantitySuccessHandler(cartline: CartLine, quantity: number, lineIndex?: number): boolean;\n locationChangedHandler(): void;\n}\n\nexport interface ICartlinesViewProps {\n cartline: React.ReactNode;\n pickUpInStore?: IPickUpInStoreViewProps;\n remove: React.ReactNode;\n addToWishlist: React.ReactNode | undefined;\n addToOrderTemplate: React.ReactNode | undefined;\n\n error?: string;\n cartlineId?: string;\n hasError?: boolean;\n data?: {\n product?: SimpleProduct;\n cartline: CartLine;\n };\n}\n\nconst _getCartItemAvailableQuantity = (\n isStockCheckEnabled: boolean,\n productAvailability: IProductInventoryInformation | undefined\n): number => {\n if (\n !isStockCheckEnabled ||\n !productAvailability ||\n !productAvailability.ProductAvailableQuantity ||\n !productAvailability.IsProductAvailable ||\n !productAvailability.ProductAvailableQuantity.AvailableQuantity\n ) {\n return 0;\n }\n\n return productAvailability.ProductAvailableQuantity.AvailableQuantity;\n};\n\nconst _getCartItemMaxQuantity = (\n maxQuantityByConfig: number,\n isStockCheckEnabled: boolean,\n availableQuantityInStock: number,\n isQuantityLimitsFeatureEnabled: boolean,\n maxByQuantityLimitsFeature: number\n) => {\n if (isQuantityLimitsFeatureEnabled) {\n let maxByQuantityLimitsFeatureResult = maxByQuantityLimitsFeature;\n\n // If max by feature in not defined when feature is on then we suggest that there no max by feature\n // and consider available qty if stock check enabled and max from config in site settings.\n if (!maxByQuantityLimitsFeature) {\n maxByQuantityLimitsFeatureResult = maxQuantityByConfig || 10;\n }\n\n return isStockCheckEnabled\n ? maxByQuantityLimitsFeatureResult < availableQuantityInStock\n ? maxByQuantityLimitsFeatureResult\n : availableQuantityInStock\n : maxByQuantityLimitsFeatureResult;\n }\n if (isStockCheckEnabled) {\n return availableQuantityInStock < maxQuantityByConfig ? availableQuantityInStock : maxQuantityByConfig;\n }\n return maxQuantityByConfig;\n};\n\nconst _getErrorMessage = (\n availableQuantityInStock: number,\n currentQuantity: number,\n props: ICartLineItemsProps,\n shouldSkipStockCheck: boolean,\n cartLine: CartLine,\n lineId: string | undefined,\n foundProductAvailability?: IProductInventoryInformation\n): string | undefined => {\n const finalErrorMessages: string[] = [];\n\n const isLoadingDeliveryOptions = props.productAvailability?.status === 'LOADING';\n if (isLoadingDeliveryOptions) {\n return undefined;\n }\n // check availability passed as prop for each cartline\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n if (foundProductAvailability === undefined) {\n finalErrorMessages.push(props.outOfStockText);\n return finalErrorMessages.toString();\n }\n }\n if (props.includeErrors && props.isStockCheckEnabled && !shouldSkipStockCheck) {\n if (availableQuantityInStock <= 0) {\n finalErrorMessages.push(props.outOfStockText);\n } else if (availableQuantityInStock < currentQuantity) {\n if (availableQuantityInStock === 1) {\n finalErrorMessages.push(props.outOfRangeOneText);\n } else {\n finalErrorMessages.push(props.outOfRangeFormatText.replace('{numLeft}', availableQuantityInStock.toString()));\n }\n }\n }\n\n // Server-side validation\n const checkForErrors = props.cartlinesErrors.ValidationResultsPairs;\n const errorsFoundByLineId = checkForErrors?.filter(index => index.LineId === lineId);\n if (errorsFoundByLineId !== undefined) {\n for (const i of errorsFoundByLineId) {\n if (ArrayExtensions.hasElements(i.ValidationFailures)) {\n i.ValidationFailures.forEach(validation => {\n if (validation.ErrorContext !== undefined) {\n finalErrorMessages.push(validation.ErrorContext);\n }\n });\n }\n }\n }\n\n if (ArrayExtensions.hasElements(finalErrorMessages)) {\n return finalErrorMessages.join(' ');\n }\n\n return undefined;\n};\n\n/**\n * On Remove Click functionality.\n * @param removeItemClickHandler -Remove item click function.\n * @param cartline -CartLine.\n * @returns Remove change value.\n */\nconst onRemoveClickFunction = (removeItemClickHandler: (cartlineToRemove: CartLine) => void, cartline: CartLine) => () => {\n removeItemClickHandler(cartline);\n};\n\n// eslint-disable-next-line complexity -- Auto-suppressed.\nconst _assembleNode = (\n cartline: CartLine,\n product: SimpleProduct | undefined,\n props: ICartLineItemsProps,\n index: number,\n foundProductAvailability?: IProductInventoryInformation,\n productPickUpOptions?: ProductDeliveryOptions\n): ICartlinesViewProps => {\n const {\n imageSettings,\n gridSettings,\n id,\n typeName,\n context,\n resources,\n removeButtonText,\n removeItemClickHandler,\n moveToWishlistSuccessHandler,\n addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip,\n addToOrderTemplateDialogResources,\n createOrderTemplateDialogResources,\n itemAddedToOrderTemplateDialogResources,\n duplicateItemsWhenAddingToOrderTemplateDialogResources,\n addToWishlistButtonText,\n removeFromWishlistButtonText,\n orderTemplates,\n customerInformation,\n wishlists,\n defaultWishlistName,\n storeSelectorModuleId,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n\n const isAuthenticated = context.request.user.isAuthenticated;\n const nameOfWishlist = wishlists && wishlists.length > 0 && wishlists[0].Name ? wishlists[0].Name : defaultWishlistName;\n const availableQuantityInStock = _getCartItemAvailableQuantity(props.isStockCheckEnabled, foundProductAvailability);\n\n const maxQuantity =\n product &&\n _getCartItemMaxQuantity(\n props.maxCartlineQuantity,\n props.isStockCheckEnabled,\n availableQuantityInStock,\n props.isQuantityLimitsFeatureEnabled,\n product?.Behavior?.MaximumQuantity || 0\n );\n\n // Skip stock check if the cart line is a service item or an invoice line\n const shouldSkipStockCheck = product?.ItemTypeValue === ReleasedProductType.Service || !!cartline.IsInvoiceLine;\n\n const errorMessage = ObjectExtensions.isNullOrUndefined(maxQuantity)\n ? undefined\n : _getErrorMessage(\n availableQuantityInStock,\n cartline.Quantity!,\n props,\n shouldSkipStockCheck,\n cartline,\n cartline.LineId,\n foundProductAvailability\n );\n\n const onRemoveClickHandler = onRemoveClickFunction(removeItemClickHandler, cartline);\n\n const payload = getPayloadObject(TelemetryEvent.RemoveFromCart, props.telemetryContent!, removeButtonText, '');\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\n\n const inventoryLbl = foundProductAvailability?.StockLevelLabel;\n const inventoryCode = foundProductAvailability\n ? `ms-cart-line__inventory-code-${foundProductAvailability.StockLevelCode?.toLowerCase()}`\n : undefined;\n const productDimension = 4;\n const customPriceDimensionType = productDimension as ProductDimensionType.Style;\n const isCustomPriceSelected =\n product?.Dimensions?.find(dimension => dimension.DimensionTypeValue === customPriceDimensionType)?.DimensionValue?.Value ===\n 'Custom';\n\n let productUrl: string | undefined;\n if (product) {\n productUrl = getProductUrlSync(product, props.context.actionContext, undefined);\n\n if (MsDyn365.isBrowser && isChannelTypeB2B(props.context.actionContext.requestContext)) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${cartline.CatalogId ?? 0}`);\n productUrl = fullUrl.href;\n }\n } else {\n productUrl = getInvoiceDetailsPageUrlSync(cartline.Description || '', props.context.actionContext);\n }\n\n return {\n data: {\n product,\n cartline\n },\n cartlineId: cartline.LineId,\n error: errorMessage,\n hasError:\n (!shouldSkipStockCheck && props.isStockCheckEnabled ? cartline.Quantity! > (maxQuantity ?? 0) : false) ||\n (!ObjectExtensions.isNullOrUndefined(errorMessage) && !StringExtensions.isNullOrEmpty(errorMessage)),\n cartline: (\n \n ),\n pickUpInStore: product\n ? PickUpInStore({\n storeSelectorModuleId,\n cartState: props.cartState,\n cartline,\n product,\n shipitText: props.shipItText,\n pickUpInStoreText: props.pickitUpText,\n changeStoreText: props.changeStoreText,\n storeSelectorStateManager: props.storeSelectorStateManager,\n orgUnitLocations: props.orgUnitLocations,\n deliveryOptions: productPickUpOptions,\n pickupDeliveryModeCode:\n cartline.DeliveryMode !== (undefined || '') ? cartline.DeliveryMode : props.pickupDeliveryModeCode,\n retailMulitplePickupFeatureState: props.retailMulitplePickupFeatureState,\n channelDeliveryOptionConfig: props.channelDeliveryOptionConfig,\n locationChangedHandler: props.locationChangedHandler\n })\n : undefined,\n remove: (\n \n ),\n addToWishlist:\n isAuthenticated && product && !isCustomPriceSelected ? (\n \n ) : (\n undefined\n ),\n addToOrderTemplate:\n isAuthenticated && orderTemplates && product ? (\n \n ) : (\n undefined\n )\n };\n};\n\nexport const assembleCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[] | null => {\n const reactNodes: ICartlinesViewProps[] = [];\n\n cartlines.map((cartline, index) => {\n let product;\n if (props.isQuantityLimitsFeatureEnabled) {\n // When feature is enabled the same products could have different quantity limits in Behavior so we need\n // to check productId and WarehouseId for identification.\n product = getProductByProductIdAndWarehouse(cartline.ProductId, products, cartline.WarehouseId, props.cartState);\n } else {\n product = getProductByProductId(cartline.ProductId, products);\n }\n let foundProductAvailability;\n\n // check if cartlineitem is pickup item\n const isPickUpItem = isCartLineItemPickUpType(\n cartline,\n props.retailMulitplePickupFeatureState,\n props.channelDeliveryOptionConfig,\n props.pickupDeliveryModeCode\n );\n if (props.productAvailabilites && ArrayExtensions.hasElements(props.productAvailabilites)) {\n foundProductAvailability = props.productAvailabilites.find(productAvailability => {\n if (!props.shouldIgnoreWarehouse && isPickUpItem) {\n // check warehouse only if siteBuilder setting is not \"Based on aggregate for shipping and pickup warehouses\" and cartlineitem is pickupitem\n return (\n productAvailability.ProductAvailableQuantity?.ProductId === cartline.ProductId &&\n productAvailability.InventLocationId?.toUpperCase() === cartline.WarehouseId?.toUpperCase()\n );\n }\n return productAvailability.ProductAvailableQuantity.ProductId === cartline.ProductId;\n });\n }\n\n let productPickUpOptions;\n if (props.productPickUpOptions !== undefined && ArrayExtensions.hasElements(props.productPickUpOptions)) {\n productPickUpOptions = props.productPickUpOptions.find(deliveryOption => {\n return deliveryOption && deliveryOption.ProductId === cartline.ProductId;\n });\n }\n reactNodes.push(_assembleNode(cartline, product, props, index, foundProductAvailability, productPickUpOptions));\n });\n\n return reactNodes;\n};\n\n/**\n * CartLineItems component.\n * @param props\n */\nexport const CartLineItems = (props: ICartLineItemsProps) => {\n const { products, cartlines } = props;\n return assembleCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartLine, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport groupBy from 'lodash/groupBy';\n\nimport { assembleCartlines, ICartLineItemsProps, ICartlinesViewProps } from './cart-line-items';\n\nconst _assembleGroupCartlines = (\n cartlines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (!products || products.length === 0) {\n props.context.telemetry.error('Products content is empty, module wont render');\n return null;\n }\n\n const getGroupByStorePickup = (items: CartLine[]) => groupBy(items, item => item.FulfillmentStoreId);\n const getGroupByDelivery = (items: CartLine[]) => groupBy(items, item => item.DeliveryMode);\n const groupDelivery = getGroupByDelivery(cartlines);\n const cartLinesGroup: CartLine[] = [];\n\n // 1) Group by store and pick up mode\n Object.entries(groupDelivery).forEach(([deliveryType, groupByDeliveryType]) => {\n // @ts-expect-error\n groupDelivery[deliveryType] = getGroupByStorePickup(groupByDeliveryType);\n cartLinesGroup.push(getGroupByStorePickup(groupByDeliveryType));\n });\n\n // 2) Create cartlines group\n Object.keys(cartLinesGroup).forEach(key => {\n const cartLines = cartLinesGroup[key];\n Object.keys(cartLines).forEach(index => {\n const cartLine = cartLines[index];\n const carLineViewProps = assembleCartlines(cartLine, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n });\n });\n\n return reactNodes;\n};\n\nconst _assembleGroupInvoiceCartlines = (\n cartLines: CartLine[],\n products: SimpleProduct[] | undefined,\n props: ICartLineItemsProps\n): ICartlinesViewProps[][] | null => {\n const reactNodes: ICartlinesViewProps[][] = [];\n if (cartLines && cartLines.length > 0) {\n // Create invoice cartLines group\n const carLineViewProps = assembleCartlines(cartLines, products, props);\n if (carLineViewProps !== null) {\n reactNodes.push(carLineViewProps);\n }\n }\n return reactNodes;\n};\n\n/**\n * CartLine Group component.\n * @param props\n */\nexport const CartLineGroupItems = (props: ICartLineItemsProps) => {\n const { products, cartlines, hasInvoiceLine } = props;\n return hasInvoiceLine\n ? _assembleGroupInvoiceCartlines(cartlines, products, props)\n : _assembleGroupCartlines(cartlines, products, props);\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { getPromotionOptionsForCartLineItems, PromotionOptionsForCartLineItems } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * IPromotionData entity interface.\n */\nexport interface IPromotionData {\n promotionOptions?: CartPromotionLine[];\n}\n\n/**\n * Calls the Retail API and returns a promotion data.\n * @param ctx\n */\nexport async function getPromotionData(ctx: IActionContext): Promise {\n const promotionData: IPromotionData = {};\n\n await getPromotionOptionsForCartLineItems(new PromotionOptionsForCartLineItems(ctx.requestContext.apiSettings), ctx)\n .then(promotionOptions => {\n if (promotionOptions) {\n promotionData.promotionOptions = promotionOptions;\n }\n })\n .catch(error => {\n ctx.telemetry.exception(error);\n return {};\n });\n\n return promotionData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n IAddToOrderTemplateDialogResources,\n IDuplicateItemsWhenAddingToOrderTemplateDialogResources,\n IItemAddedToOrderTemplateDialogResources,\n ILinesAddedToOrderTemplateDialogResources,\n IOrderTemplateNameDialogResources,\n IWishlistActionSuccessResult,\n PromoCodeComponent,\n SaveCartToOrderTemplateComponent\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { getCatalogId, getUrlSync, IImageSettings, isChannelTypeB2B } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport { AsyncResult, CartLine, CartLineValidationResultsByLineId, LineValidationResult } from '@msdyn365-commerce/retail-proxy';\nimport { FeatureState, ProductDeliveryOptions, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cartLineQuantityUpdatedAsync, validateCartAsync } from '@msdyn365-commerce-modules/cart-utilities';\nimport { IInvoiceSummaryLines, InvoiceSummary } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines, OrderSummary } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport {\n ActiveCartProductsInput,\n ArrayExtensions,\n getActiveCartProductsAction,\n ICartLineInventoryValidationResult,\n ObjectExtensions,\n validateCartLinesInventory,\n ProductPickUpOptionsForCartLineItems,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n Button,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant,\n Waiting,\n updateMaxQuantityForCartLineItem,\n urlCheck\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport React from 'react';\nimport { getPickUpOptionsForCartLineItems } from './actions/get-pickup-options-for-cartlines';\n\nimport { ICartData } from './cart.data';\nimport { ICartProps, ICartResources } from './cart.props.autogenerated';\nimport { CartLineGroupItems } from './components/cart-line-groups';\nimport { CartLineItems, ICartlinesViewProps } from './components/cart-line-items';\nimport { cartPromotions, ICartLineItemViewProps } from './components/cart-line-items-promotion';\nimport { getPromotionData, IPromotionData } from './utils/get-promotion-in-cart';\n\n/**\n * Cart view props interface.\n */\nexport interface ICartViewProps extends ICartProps {\n className: string;\n title?: React.ReactNode;\n CartlinesWrapper: INodeProps;\n cartlines?: ICartlinesViewProps[];\n cartLinesGroup?: ICartlinesViewProps[][];\n cart: ICartState | undefined;\n orderSummaryHeading: React.ReactNode;\n orderSummaryLineitems?: IOrderSummaryLines;\n invoiceSummaryLineitems?: IInvoiceSummaryLines;\n OrderSummaryWrapper: INodeProps;\n OrderSummaryItems: INodeProps;\n OrderSummaryErrors?: IOrderSummaryErrors;\n checkoutAsGuestButton: React.ReactNode;\n checkoutAsSignInUserButton: React.ReactNode;\n storeSelector?: React.ReactNode;\n expressCheckoutButton?: React.ReactNode[];\n ExpressCheckoutSectionWrapper: INodeProps;\n backToShoppingButton: React.ReactNode;\n waitingComponent: React.ReactNode;\n promotionOptions?: ICartLineItemViewProps;\n promoCode: React.ReactNode;\n cartLoadingStatus: string;\n cartDataResult: boolean;\n multiplePickUpEnabled?: boolean;\n createTemplateFromCartButton: React.ReactNode;\n telemetryContent?: ITelemetryContent;\n checkoutBlockedDueToUnavailableFunds?: React.ReactNode;\n removeItemClickHandler(cartlineToRemove: CartLine): void;\n moveToWishlistSuccessHandler(result: IWishlistActionSuccessResult, cartlineId: CartLine): void;\n}\n\n/**\n * Order summary errors interface.\n */\nexport interface IOrderSummaryErrors {\n Wrapper: INodeProps;\n header: React.ReactNode;\n errors: React.ReactNode[];\n}\n\n/**\n * Cart component state interface.\n */\ninterface ICartComponentState {\n showPromotionDialog: boolean;\n cartlinesErrors: CartLineValidationResultsByLineId;\n promotionData: IPromotionData;\n isCartValid: boolean;\n productPickUpOptions?: ProductDeliveryOptions[];\n}\n\n/**\n * Cart component.\n * @extends {React.PureComponent>}\n */\n@observer\nclass Cart extends React.Component> {\n public state: ICartComponentState;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n private isQuantityLimitsFeatureEnabled: boolean = false;\n\n private _isMounted: boolean = false;\n\n private readonly promotionPopupId: string = 'cart-promotion-popup';\n\n public constructor(props: ICartProps) {\n super(props);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '');\n this.promotionLinkClick = this.promotionLinkClick.bind(this);\n this.promotionCloseButtonclick = this.promotionCloseButtonclick.bind(this);\n\n this.state = {\n showPromotionDialog: false,\n promotionData: {},\n isCartValid: true,\n productPickUpOptions: undefined,\n cartlinesErrors: {}\n };\n }\n\n /**\n * Component did mount function.\n */\n public async componentDidMount(): Promise {\n this._isMounted = true;\n const {\n config,\n context: { actionContext }\n } = this.props;\n\n this.isQuantityLimitsFeatureEnabled =\n (await this.getOrderQuantityLimitsFeatureFlag()) || (await this._isChannelLimitsFeatureEnabled());\n if (this.isQuantityLimitsFeatureEnabled) {\n await this.validateCart();\n }\n\n if (config.showAvailablePromotions) {\n if (this._isMounted && this.props.data.cart.result?.cart.CartLines) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n this.setState({ promotionData: await getPromotionData(actionContext) });\n }\n }\n );\n }\n reaction(\n () => this.props.data.cart.result?.cart.CartLines,\n async () => {\n if (this._isMounted) {\n const input = new ProductPickUpOptionsForCartLineItems(actionContext.requestContext.apiSettings);\n this.setState({ productPickUpOptions: await getPickUpOptionsForCartLineItems(input, actionContext) });\n }\n }\n );\n }\n\n /**\n * Component will unmount function.\n */\n public componentWillUnmount(): void {\n this._isMounted = false;\n }\n\n /**\n * Should component update function.\n * @param nextProps - Next props.\n * @param nextState - Next state.\n * @returns True if component should update, false otherwise.\n */\n public shouldComponentUpdate(nextProps: ICartProps, nextState: ICartComponentState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n /* eslint-disable complexity -- Disabling complexity for render method */\n public render(): JSX.Element | null {\n const {\n data: {\n cart: { result: cart },\n products: { result: products }\n },\n context: {\n request: {\n user: { isAuthenticated, signInUrl }\n }\n },\n resources\n } = this.props;\n\n const guestCheckoutUrl = getUrlSync('checkout', this.props.context.actionContext) || '';\n const backToShoppingUrl = getUrlSync('home', this.props.context.actionContext) || '';\n const checkoutURL = this.getCheckoutURL(isAuthenticated, guestCheckoutUrl, signInUrl || '');\n const isCartEmpty = cart && cart.cart.CartLines && cart.cart.CartLines.length === 0;\n const cartLines = this._getCartLines();\n const emailDeliveryModeCode = this.props.context.request.channel?.EmailDeliveryModeCode;\n const validInventoryAcrossCartLines = validateCartLinesInventory(\n cart?.cart.CartLines ?? [],\n this.props.data.productAvailabilites.result ?? [],\n this.props.context.actionContext,\n products ?? [],\n emailDeliveryModeCode\n );\n\n const hasError =\n !validInventoryAcrossCartLines?.isValid ||\n (!validInventoryAcrossCartLines && !this.state.isCartValid) ||\n (cartLines ? cartLines.some(cartline => cartline.hasError) : false);\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const { featureState } = this.props.data;\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n const currentCatalogId = getCatalogId(this.props.context.request);\n validateCatalogId(currentCatalogId);\n const cartLinesGroup = cart?.hasInvoiceLine || multiplePickUpEnabled ? this.getCartLinesGroup() : null;\n this.payLoad.contentAction.etext = TelemetryConstant.Checkout;\n const checkoutBySignInAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.GuestCheckout;\n const checkoutByGuestAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n this.payLoad.contentAction.etext = TelemetryConstant.BackToShopping;\n const backtoShoppingAttributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n\n // If there's inventory issues across multiple cart lines then update the error and display as part of the order summary\n if (validInventoryAcrossCartLines && !validInventoryAcrossCartLines.isValid) {\n if (multiplePickUpEnabled && cartLinesGroup !== null) {\n for (const cartLineGroup of cartLinesGroup) {\n this._updateCartLineErrorForInvalidInventory(cartLineGroup, validInventoryAcrossCartLines);\n }\n }\n\n this._updateCartLineErrorForInvalidInventory(cartLines, validInventoryAcrossCartLines);\n }\n\n const viewProps = {\n ...this.props,\n className: classnames('ms-cart'),\n title:

{resources.cartTitle}

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

{resources.invoiceSummaryTitle}

\n ) : (\n

{resources.orderSummaryTitle}

\n )\n ) : null,\n orderSummaryLineitems: this._getOrderSummaryLineItems(),\n invoiceSummaryLineitems: this._getInvoiceSummaryLineItems(),\n checkoutAsSignInUserButton: !isCartEmpty ? (\n \n {resources.checkoutButtonTitle}\n \n ) : null,\n checkoutAsGuestButton:\n !isCartEmpty && !isAuthenticated && this.props.config.showGuestCheckoutButton ? (\n \n {resources.guestCheckoutButtonTitle}\n \n ) : null,\n expressCheckoutButton: !isCartEmpty ? this.props.slots.paymentExpress : null,\n ExpressCheckoutSectionWrapper: { className: 'msc-express-payment-container-in-cart-page' },\n backToShoppingButton: (\n \n {resources.backToShoppingButtonTitle}\n \n ),\n createTemplateFromCartButton:\n this._displayAddCartToTemplate() && products ? (\n \n ) : null,\n checkoutBlockedDueToUnavailableFunds: null,\n storeSelector:\n this.props.slots.storeSelector && this.props.slots.storeSelector.length > 0 ? this.props.slots.storeSelector[0] : null,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n waitingComponent: ,\n cartLoadingStatus: this.props.data.cart.status === 'FAILED' ? this.props.resources.cartLoadingErrorMessage : null,\n cartDataResult: this.props.data.cart.result && this.props.data.cart.result.isEmpty,\n OrderSummaryErrors: this._getOrderSummaryErrors(cartLines),\n telemetryContent: this.telemetryContent\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n /* eslint-enable complexity -- Disabling complexity for render method */\n\n /**\n * Promotion click event handler.\n * @param event - The mouse event.\n */\n private readonly promotionLinkClick = (event: React.MouseEvent) => {\n this.setState({\n showPromotionDialog: !this.state.showPromotionDialog\n });\n };\n\n /**\n * Promotion close button click.\n */\n private readonly promotionCloseButtonclick = () => {\n this._hidePromotionDialog();\n };\n\n /**\n * Hide promotion dialog.\n */\n private _hidePromotionDialog(): void {\n this.setState({\n showPromotionDialog: false\n });\n }\n\n /**\n * Display add to cart template.\n * @returns True if should display, false otherwise.\n */\n private _displayAddCartToTemplate(): boolean {\n const cart = this.props.data.cart?.result;\n if (ObjectExtensions.isNullOrUndefined(cart) || cart.hasInvoiceLine) {\n return false;\n }\n\n if (\n isChannelTypeB2B(this.props.context.actionContext.requestContext) &&\n this.props.data.orderTemplates.result &&\n ArrayExtensions.hasElements(cart.cart?.CartLines) &&\n this.props.data.customerInformation.result\n ) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Get promotions.\n * @returns React node with the promotions.\n */\n private _getPromotions(): React.ReactNode {\n return (\n this.props.config.showAvailablePromotions &&\n cartPromotions({\n id: this.promotionPopupId,\n showPromotionPopup: this.state.showPromotionDialog,\n onSeeAllClick: this.promotionLinkClick,\n onCloseButtonClick: this.promotionCloseButtonclick,\n promotions: this.state.promotionData.promotionOptions,\n resources: {\n promotionStringHeading: this.props.resources.promotionStringHeading,\n promotionLinkText: this.props.resources.promotionLinkText,\n promotionPopupHeading: this.props.resources.promotionPopupHeading,\n promotionCloseButtonAriaLabel: this.props.resources.promotionCloseButtonAriaLabel\n }\n })\n );\n }\n\n /**\n * Add error message in cart line in case the quantity exceeds the current inventory.\n * @param cartLines - The cart lines.\n * @param cartLineInventoryValidationResult - The cart line inventory result.\n */\n private _updateCartLineErrorForInvalidInventory(\n cartLines: ICartlinesViewProps[] | null,\n cartLineInventoryValidationResult: ICartLineInventoryValidationResult\n ) {\n const { resources } = this.props;\n\n if (\n ArrayExtensions.hasElements(cartLines) &&\n !cartLineInventoryValidationResult.isValid &&\n ArrayExtensions.hasElements(cartLineInventoryValidationResult.productIdWithErrors)\n ) {\n for (const productIdWithError of cartLineInventoryValidationResult.productIdWithErrors) {\n const cartLine = cartLines?.find(element => element.data?.cartline.ProductId === productIdWithError);\n if (cartLine) {\n cartLine.error = resources.outOfStockErrorMessage;\n cartLine.hasError = true;\n }\n }\n }\n }\n\n /**\n * Get order summary errors.\n * @param cartLines - The cart lines.\n * @returns Order summary errors.\n */\n private _getOrderSummaryErrors(cartLines: ICartlinesViewProps[] | null): IOrderSummaryErrors | undefined {\n const allErrors =\n (cartLines &&\n cartLines\n .map(cartline => {\n // Check if the product is service or not by product type\n const isServiceItem = cartline.data?.product?.ItemTypeValue === ReleasedProductType.Service;\n\n if (!isServiceItem && cartline.error) {\n const fullError =\n cartline.data && cartline.data.product?.Name\n ? `${cartline.data.product.Name}: ${cartline.error}`\n : cartline.error;\n\n return (\n
\n {fullError}\n
\n );\n }\n\n return null;\n })\n .filter((line): line is JSX.Element => !!line)) ||\n [];\n\n return {\n Wrapper: {\n tag: Alert,\n className: 'msc-alert',\n isOpen: allErrors.length > 0,\n color: 'danger',\n assertive: true,\n 'aria-label': this.props.resources.outOfStockErrorMessageHeader\n },\n header: (\n \n ),\n errors: allErrors\n };\n }\n\n /**\n * Gets invoice summary line items.\n * @returns Invoice summary lines.\n */\n private _getInvoiceSummaryLineItems(): IInvoiceSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart }\n },\n telemetry,\n resources\n } = this.props;\n\n return cart?.hasInvoiceLine\n ? InvoiceSummary({\n orderTotalLabel: resources.totalAmountLabel,\n invoiceLabel: resources.invoiceLabel,\n cart: cart.cart,\n context: this.props.context,\n typeName: this.props.typeName,\n telemetry,\n id: this.props.id\n })\n : undefined;\n }\n\n /**\n * Gets order summary line items.\n * @returns Order summary lines.\n */\n private _getOrderSummaryLineItems(): IOrderSummaryLines | undefined {\n const {\n data: {\n cart: { result: cart },\n channelDeliveryOptionConfig\n },\n telemetry,\n resources\n } = this.props;\n\n const channelConfiguration = this.props.context && this.props.context.request && this.props.context.request.channel;\n const multiplePickupStoreSwitchName = 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature';\n const featureState = this.props?.data?.featureState;\n const retailMultiplePickUpOptionEnabled = featureState?.result?.find(item => item.Name === multiplePickupStoreSwitchName)\n ?.IsEnabled;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n const isShowOrHideTaxEnabled = this.props.context.request.app.config?.isEnableShowOrHideSalesTaxECommerceEnabled === true;\n\n return channelConfiguration && ArrayExtensions.hasElements(cart?.cart.CartLines) && !cart?.hasInvoiceLine\n ? OrderSummary({\n cart: cart!.cart,\n subTotalLabel: resources.itemsWithCountLabel,\n shippingLabel: resources.estimatedShippingLabel,\n otherChargeLabel: resources.otherCharges,\n taxLabel: resources.estimatedTaxLabel,\n orderTotalLabel: resources.orderTotal,\n totalDiscountsLabel: resources.totalDiscountsLabel,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n toBeCalculatedText: resources.yetToBeCalculatedText,\n freeText: resources.priceFree,\n channelConfiguration,\n retailMultiplePickUpOptionEnabled,\n channelDeliveryOptionConfig: channelDeliveryOptionConfig?.result,\n telemetry,\n isTaxIncludedInPrice: cart!.cart.IsTaxIncludedInPrice,\n isShowTaxBreakup: isShowOrHideTaxEnabled\n })\n : undefined;\n }\n\n /**\n * Gets promo code.\n * @returns React node with the promo code.\n */\n private _getPromoCode(): React.ReactNode {\n const {\n data: {\n cart: { result: cart }\n },\n resources\n } = this.props;\n\n return (\n cart && (\n \n )\n );\n }\n\n /**\n * Generate add to order template dialog resources.\n * @param resources - The resources.\n * @returns IAddToOrderTemplateDialogResources.\n */\n private _generateAddToOrderTemplateDialogResources(resources: ICartResources): IAddToOrderTemplateDialogResources {\n return {\n addToOrderTemplateHeader: resources.addToOrderTemplateHeader,\n\n noOrderTemplatesMessage: resources.noOrderTemplatesMessage,\n noOrderTemplatesDescription: resources.noOrderTemplatesDescription,\n\n createAnOrderTemplateButtonText: resources.createAnOrderTemplateButtonText,\n createNewOrderTemplateButtonText: resources.createNewOrderTemplateButtonText,\n cancelOrderTemplateCreationButtonText: resources.cancelOrderTemplateCreationButtonText,\n\n selectTemplatesText: resources.selectTemplatesText,\n addToTemplateButtonText: resources.addToTemplateButtonText,\n lineItemsText: resources.lineItemsText\n };\n }\n\n /**\n * Generate item added to order template dialog resources.\n * @param resources - The resources.\n * @returns IItemAddedToOrderTemplateDialogResources.\n */\n private _generateItemAddedToOrderTemplateDialogResources(resources: ICartResources): IItemAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n itemAddedToOrderTemplateHeaderItemOneText: resources.itemAddedToOrderTemplateHeaderItemOneText,\n itemAddedToOrderTemplateHeaderItemFormatText: resources.itemAddedToOrderTemplateHeaderItemFormatText,\n itemAddedToOrderTemplateHeaderMessageText: resources.itemAddedToOrderTemplateHeaderMessageText,\n freePriceText: resources.freePriceText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText\n };\n }\n\n /**\n * Generate lines added to order template dialog resources.\n * @param resources - The resources.\n * @returns ILinesAddedToOrderTemplateDialogResources.\n */\n private _generateLinesAddedToOrderTemplateDialogResources(resources: ICartResources): ILinesAddedToOrderTemplateDialogResources {\n return {\n viewOrderTemplateButtonText: resources.viewOrderTemplateButtonText,\n continueShoppingButtonText: resources.continueShoppingButtonText,\n linesAddedToOrderTemplateHeaderItemsOneText: resources.linesAddedToOrderTemplateHeaderItemsOneText,\n linesAddedToOrderTemplateHeaderItemsFormatText: resources.linesAddedToOrderTemplateHeaderItemsFormatText,\n linesAddedToOrderTemplateHeaderLinesOneText: resources.linesAddedToOrderTemplateHeaderLinesOneText,\n linesAddedToOrderTemplateHeaderLinesFormatText: resources.linesAddedToOrderTemplateHeaderLinesFormatText,\n linesAddedToOrderTemplateHeaderMessageText: resources.linesAddedToOrderTemplateHeaderMessageText,\n linesAddedToOrderTemplateCustomPriceAlertMessageText: resources.linesAddedToOrderTemplateCustomPriceAlertMessageText\n };\n }\n\n /**\n * Generate duplicate items when adding to order template dialog resources.\n * @param resources - The resources.\n * @returns IDuplicateItemsWhenAddingToOrderTemplateDialogResources.\n */\n private _generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources: ICartResources\n ): IDuplicateItemsWhenAddingToOrderTemplateDialogResources {\n return {\n duplicatedProductsHeader: resources.duplicatedProductsHeader,\n duplicatedProductsDescription: resources.duplicatedProductsDescription,\n updateQuantityButtonText: resources.updateQuantityButtonText,\n cancelDuplicateItemsButtonText: resources.cancelDuplicateItemsButtonText\n };\n }\n\n /**\n * Generate order template name dialog resources.\n * @param resources - The resources.\n * @returns IOrderTemplateNameDialogResources.\n */\n private _generateOrderTemplateNameDialogResources(resources: ICartResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.createOrderTemplateHeader,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateNameAriaLabel,\n orderTemplateDescription: resources.createOrderTemplateDescription,\n\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n\n orderTemplateButtonLabel: resources.createOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelNewOrderTemplateCreationButtonText\n };\n }\n\n /**\n * Gets the cart lines view props.\n * @returns ICartlinesViewProps [].\n */\n private _getCartLines(): ICartlinesViewProps[] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n this.props.data.featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled ||\n false;\n return ArrayExtensions.hasElements(cart?.cart.CartLines)\n ? CartLineItems({\n cartlines: cart!.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n typeName: this.props.typeName,\n id: this.props.id,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n productAvailability: this.props.data.productAvailabilites,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n\n /**\n * Gets the checkout URL.\n * @param isAuthenticated - Is authenticated flag.\n * @param guestCheckoutUrl - Guest checkout URL.\n * @param signInUrl -The sign in URL.\n * @returns The checkout URL.\n */\n private getCheckoutURL(isAuthenticated: boolean, guestCheckoutUrl: string, signInUrl: string): string {\n if (isAuthenticated) {\n return guestCheckoutUrl;\n }\n\n const isAbsoluteUrl = urlCheck(guestCheckoutUrl);\n let returnURL = guestCheckoutUrl;\n if (MsDyn365.isBrowser && !isAbsoluteUrl) {\n returnURL = `${window.location.origin}${guestCheckoutUrl}`;\n }\n\n return `${signInUrl}${!signInUrl.includes('?') ? '?' : '&'}ru=${returnURL}`;\n }\n\n /**\n * Gets the image settings.\n * @param imageSettings - Image settings.\n * @returns IImageSettings.\n */\n private readonly getImageSettings = (imageSettings: IImageSettings | undefined): IImageSettings => {\n return (\n imageSettings || {\n viewports: {\n xs: { q: 'w=80&h=94&m=6', w: 0, h: 0 },\n sm: { q: 'w=148&h=174&m=6', w: 0, h: 0 },\n lg: { q: 'w=148&h=174&m=6', w: 0, h: 0 }\n },\n lazyload: true\n }\n );\n };\n\n /**\n * Remove item from cart handler.\n * @param cartlineToRemove - The cart line to remove.\n */\n private readonly removeItemFromCartHandler = (cartlineToRemove: CartLine) => {\n if (this.props.data.cart.result) {\n const input = {\n cartLineIds: [cartlineToRemove.LineId!.toString()]\n };\n this.props.data.cart.result\n .removeCartLines(input)\n .then(() => {\n this.validateCart().catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n })\n .catch(error => {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to Remove Cart Line');\n });\n }\n };\n\n /**\n * Move to wish list handler.\n * @param result - The wish list action success result.\n * @param cartline - The cart line.\n */\n private readonly moveToWishlistSuccessHandler = (result: IWishlistActionSuccessResult, cartline?: CartLine) => {\n if (result.status === 'ADDED' && cartline) {\n this.removeItemFromCartHandler(cartline);\n }\n };\n\n /**\n * Updates the cart line quantity.\n * @param cartlineToUpdate - The cart line.\n * @param quantity - The quantity.\n * @param lineIndex - The line index.\n * @returns True if the cart line was updated, false otherwise.\n */\n private readonly updateCartlineQuantity = (cartlineToUpdate: CartLine, quantity: number, lineIndex?: number): boolean => {\n cartLineQuantityUpdatedAsync(\n this.isQuantityLimitsFeatureEnabled,\n this.props.data.cart.result,\n this.props.telemetry,\n this.props.data.products.result,\n cartlineToUpdate,\n quantity\n )\n .then((cartActionResult: ICartActionResult | undefined): boolean => {\n if (cartActionResult?.status === 'SUCCESS') {\n this.validateCart().catch(error => {\n this.props.telemetry.warning((error as Error).message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n this.setState({\n cartlinesErrors: {}\n });\n return true;\n }\n\n if (!ObjectExtensions.isNullOrUndefined(cartActionResult)) {\n // Show update line error message.\n const lineUpdateFailure: LineValidationResult = {\n LineId: ObjectExtensions.isNullOrUndefined(cartlineToUpdate.LineId) ? '0' : cartlineToUpdate.LineId,\n ValidationFailures: [\n {\n ErrorContext: ArrayExtensions.hasElements(cartActionResult.validationResults)\n ? cartActionResult.validationResults[0].ErrorContext\n : '',\n LocalizedMessage: cartActionResult.errorDetails?.LocalizedMessage\n }\n ]\n };\n\n this.setState({\n cartlinesErrors: { ValidationResultsPairs: [lineUpdateFailure] }\n });\n }\n\n return false;\n })\n .catch(() => {\n return false;\n });\n\n return false;\n };\n\n /**\n * Fulfillment store id is updated.\n */\n private readonly fulfillmentStoreIdUpdated = () => {\n if (this.isQuantityLimitsFeatureEnabled) {\n // Refresh products (in props.data) based on latest cart.\n getActiveCartProductsAction(new ActiveCartProductsInput(), this.props.context.actionContext)\n .then(async () => this.validateCart())\n .catch((error: Error) => {\n this.props.telemetry.warning(error.message);\n this.props.telemetry.debug('Unable to validate Cart');\n });\n }\n };\n\n /**\n * Validates cart.\n * @returns Void promise.\n */\n private async validateCart(): Promise {\n if (!this.isQuantityLimitsFeatureEnabled) {\n this.setState({ cartlinesErrors: {}, isCartValid: true });\n return AsyncResult.resolve();\n }\n\n const {\n data: { cart },\n telemetry,\n context\n } = this.props;\n\n const validationResults: CartLineValidationResultsByLineId | undefined = await validateCartAsync(cart, telemetry, context, true);\n\n if (validationResults) {\n const isValid = !ArrayExtensions.hasElements(validationResults.ValidationResultsPairs);\n this.setState({\n cartlinesErrors: validationResults,\n isCartValid: isValid\n });\n } else {\n this.setState({ cartlinesErrors: {}, isCartValid: true });\n }\n\n return AsyncResult.resolve();\n }\n\n /**\n * Get order quantity limit feature flag.\n * @returns True if flag is enabled, false otherwise.\n */\n private async getOrderQuantityLimitsFeatureFlag(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n try {\n const isQuantityLimitsFeatureEnabledInHq =\n featureStatuses.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature'\n )?.IsEnabled || false;\n if (!isQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get feature states');\n return false;\n }\n\n const useSiteBuilderSettings = featureStatuses?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\n const defaultOrderQuantityLimitsFeatureConfig = this.props.context?.request?.app?.platform?.enableDefaultOrderQuantityLimits;\n if (defaultOrderQuantityLimitsFeatureConfig === 'none') {\n return false;\n }\n\n if (defaultOrderQuantityLimitsFeatureConfig === 'all') {\n return true;\n }\n\n try {\n const customerInfo = await this.props.data.customerInformation;\n return (\n !!customerInfo &&\n ((defaultOrderQuantityLimitsFeatureConfig === 'b2b' && customerInfo.IsB2b) ||\n (defaultOrderQuantityLimitsFeatureConfig === 'b2c' && !customerInfo.IsB2b))\n );\n } catch (error) {\n this.props.telemetry.warning(error);\n this.props.telemetry.debug('Unable to get customer info');\n return false;\n }\n } else {\n const cartConfiguration = await this.props.data.cartConfiguration;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\n }\n\n private async _isChannelLimitsFeatureEnabled(): Promise {\n const featureStatuses = await this.props.data.featureState;\n\n const isChannelLimitsFeatureEnabledInHq = featureStatuses?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.EcommerceQuantityLimitConfigurationsFeature'\n )?.IsEnabled;\n\n return isChannelLimitsFeatureEnabledInHq ?? false;\n }\n\n /**\n * Gets the cart lines group.\n * @returns ICartlinesViewProps [][].\n */\n private getCartLinesGroup(): ICartlinesViewProps[][] | null {\n const {\n data: {\n cart: { result: cart },\n wishlists: { result: wishlists },\n orderTemplates: { result: orderTemplates },\n customerInformation: { result: customerInformation }\n },\n context: {\n request: { channel: { PickupDeliveryModeCode } = { PickupDeliveryModeCode: undefined } }\n },\n config,\n telemetry,\n resources,\n modules\n } = this.props;\n\n const imageSettings = this.getImageSettings(config.imageSettings);\n const cartlinesErrors: CartLineValidationResultsByLineId = this.state.cartlinesErrors;\n let storeSelectorId: string = '';\n if (modules && Object.keys(modules).length > 0 && modules.storeSelector && modules.storeSelector.length > 0) {\n storeSelectorId = modules.storeSelector[0].id;\n }\n\n const RetailMultiplePickupFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n );\n const multiplePickUpEnabled = RetailMultiplePickupFeatureState?.IsEnabled;\n const { featureState } = this.props.data;\n const channelMultipleCatalogsFeature = 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature';\n const isMultipleCatalogsFeatureEnabled =\n featureState.result?.find((item: FeatureState) => item.Name === channelMultipleCatalogsFeature)?.IsEnabled || false;\n return this.props.data.products &&\n (cart?.hasInvoiceLine || this.props.data.products.result) &&\n cart &&\n cart.cart.CartLines &&\n cart.cart.CartLines.length > 0 &&\n this.props.data.channelDeliveryOptionConfig?.result\n ? CartLineGroupItems({\n cartlines: cart.cart.CartLines,\n storeSelectorModuleId: storeSelectorId,\n cartlinesErrors,\n products: this.props.data.products.result,\n productAvailabilites: this.props.data.productAvailabilites.result,\n productDeliveryOptions: this.props.data.deliveryOptions.result,\n catalogs: this.props.data.catalogs?.result,\n imageSettings,\n isStockCheckEnabled: this.props.context.app.config.enableStockCheck || false,\n hasInvoiceLine: cart?.hasInvoiceLine || false,\n maxCartlineQuantity: updateMaxQuantityForCartLineItem(this.props.context.app.config.maxQuantityForCartLineItem),\n gridSettings: this.props.context.request.gridSettings!,\n context: this.props.context,\n retailMulitplePickupFeatureState: multiplePickUpEnabled,\n typeName: this.props.typeName,\n id: this.props.id,\n resources: {\n sizeString: resources.productDimensionTypeSize,\n colorString: resources.productDimensionTypeColor,\n configString: resources.productDimensionTypeConfiguration,\n styleString: resources.productDimensionTypeStyle,\n amountString: resources.productDimensionTypeAmount,\n quantityDisplayString: resources.quantityDisplayText,\n inputQuantityAriaLabel: resources.inputQuantityAriaLabel,\n decrementButtonAriaLabel: resources.decrementButtonAriaLabel,\n incrementButtonAriaLabel: resources.incrementButtonAriaLabel,\n discountStringText: resources.discountStringText,\n originalPriceText: resources.originalPriceText,\n currentPriceText: resources.currentPriceText,\n shippingChargesText: resources.shippingCharges,\n salesAgreementPricePrompt: resources.salesAgreementPricePrompt,\n priceEditorResources: {\n ...resources\n }\n },\n telemetry,\n addToWishlistButtonText: resources.addToWishlistButtonText,\n removeFromWishlistButtonText: resources.removeFromWishlistButtonText,\n removeButtonText: resources.removeCartButtonText,\n shipItText: resources.shipInsteadDisplayText,\n pickitUpText: resources.pickItUpDisplayText,\n changeStoreText: resources.changeStoreDisplayText,\n storeSelectorStateManager: this.props.data.storeSelectorStateManager.result,\n outOfStockText: resources.outOfStockErrorMessage,\n outOfRangeOneText: resources.errorMessageOutOfRangeOneLeft,\n outOfRangeFormatText: resources.errorMessageOutOfRangeFormat,\n cartState: this.props.data.cart.result,\n orgUnitLocations: this.props.data.orgUnitLocations.result,\n removeItemClickHandler: this.removeItemFromCartHandler,\n moveToWishlistSuccessHandler: this.moveToWishlistSuccessHandler,\n updateCartLinesQuantitySuccessHandler: this.updateCartlineQuantity,\n locationChangedHandler: this.fulfillmentStoreIdUpdated,\n wishlists,\n defaultWishlistName: resources.defaultWishlistName,\n pickupDeliveryModeCode: PickupDeliveryModeCode,\n includeErrors: config.showOutOfStockErrors,\n showShippingChargesForLineItems: config.showShippingChargesForLineItems,\n telemetryContent: this.telemetryContent,\n isQuantityLimitsFeatureEnabled: this.isQuantityLimitsFeatureEnabled,\n\n addToOrderTemplateDialogResources: this._generateAddToOrderTemplateDialogResources(resources),\n createOrderTemplateDialogResources: this._generateOrderTemplateNameDialogResources(resources),\n itemAddedToOrderTemplateDialogResources: this._generateItemAddedToOrderTemplateDialogResources(resources),\n duplicateItemsWhenAddingToOrderTemplateDialogResources: this._generateDuplicateItemsWhenAddingToOrderTemplateDialogResources(\n resources\n ),\n\n addToOrderTemplateButtonText: resources.addToOrderTemplateButtonText,\n addToOrderTemplateButtonTooltip: resources.addToOrderTemplateButtonTooltip,\n addToOrderTemplateMessage: resources.addToOrderTemplateMessage,\n addItemToOrderTemplateError: resources.addItemToOrderTemplateError,\n orderTemplates,\n customerInformation,\n channelDeliveryOptionConfig: this.props.data.channelDeliveryOptionConfig?.result,\n shouldIgnoreWarehouse: this.props.context.app.config.warehouseAggregation === 'multiple',\n productAvailability: this.props.data.productAvailabilites,\n productPickUpOptions: this.state.productPickUpOptions || this.props.data.cartLinesPickUpOptions?.result,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogsFeatureEnabled || false\n })\n : null;\n }\n}\n\nexport default Cart;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CartPromotionLine } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ICartLineItemPromotion {\n id: string;\n showPromotionPopup: boolean;\n promotions: CartPromotionLine[] | undefined;\n resources: ICartLineItemPromotionResourceString;\n onSeeAllClick(event: React.MouseEvent): void;\n onCloseButtonClick(): void;\n}\n\nexport interface ICartLineItemViewProps {\n promotionMessageWrapper: INodeProps;\n promotionMessage: React.ReactNode;\n promotionSeeAllLink: React.ReactElement;\n promotionDialog: React.ReactNode;\n}\n\nexport interface ICartLineItemPromotionResourceString {\n promotionLinkText: string;\n promotionStringHeading: string;\n promotionPopupHeading: string;\n promotionCloseButtonAriaLabel: string;\n}\n\nexport const cartPromotions = (props: ICartLineItemPromotion): ICartLineItemViewProps | undefined => {\n const {\n id,\n showPromotionPopup,\n promotions,\n resources: { promotionLinkText, promotionPopupHeading },\n onCloseButtonClick,\n onSeeAllClick\n } = props;\n\n if (!ArrayExtensions.hasElements(promotions)) {\n return;\n }\n\n const titleId = `${id}_title`;\n const className = 'msc-cart__promotion';\n return {\n promotionMessageWrapper: {\n className: 'msc-cart__promotion'\n },\n promotionMessage: (\n <>\n \n {props.resources.promotionStringHeading}\n \n ),\n promotionSeeAllLink: (\n \n {` `}\n {promotionLinkText} {` `}\n \n ),\n promotionDialog: (\n \n \n
\n {promotionPopupHeading}\n
\n
\n \n
    \n {promotions.map(_promotion => {\n return (\n
  • \n {_promotion.Promotion?.OfferName} {` `}\n
  • \n );\n })}\n
\n
\n \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 { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { getCatalogId, ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductListLine, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport { ProductCatalog, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n addItemToOrderTemplate,\n AddItemToOrderTemplateInput,\n ArrayExtensions,\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getSelectedVariant,\n SelectedVariantInput,\n validateCatalogId\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Modal, ModalBody, ModalHeader, getPayloadObject, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport { get } from 'lodash';\nimport { computed } from 'mobx';\nimport React from 'react';\n\nimport { IProductConfigurationState, NotFoundComponent, ProductConfiguration, ProductList } from '.';\nimport Spinner from './spinner';\n\nexport interface IAddLineToTemplateProps {\n context: ICoreContext;\n resources: IAddLineToTemplateResources;\n orderTemplateId: string;\n imageSettings?: IImageSettings;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n catalogs?: ProductCatalog[] | undefined;\n telemetryContent?: ITelemetryContent;\n}\n\nexport interface IAddLineToTemplateResources {\n addLineModalLinkText: string;\n searchButtonAriaLabel: string;\n searchInputAriaLabel: string;\n searchModalPlaceholderText: string;\n selectCatalogTitleText: string;\n selectProductButtonText: string;\n addItemToTemplateText: string;\n addLineProductUnitPricePrefix: string;\n backButtonText: string;\n decrementButtonAriaLabel: string;\n incrementButtonAriaLabel: string;\n quantitySelectLabel: string;\n addLineProductUnitOfMeasurePrefix: string;\n notFoundSearchErrorNotice: string;\n notFoundSearchErrorRedediation: string;\n searchErrorMessage: string;\n productDimensionTypeColor: string;\n productDimensionTypeConfiguration: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n searchResultsCountVerbage: string;\n searchResultsCountSubject: string;\n addToTemplateConfirmation: string;\n totalPriceLabel: string;\n progressNotificationText: string;\n addToTemplateDuplicateError: string;\n addToTemplateGenericError: string;\n dimensionMissingError: string;\n backToResultsText?: string;\n}\n\nenum CONTENT {\n Search,\n ProductList,\n ProductConfiguration,\n NotFound,\n Error,\n Loading\n}\n\ninterface IAddLineToTemplateState {\n isOpen: boolean;\n query: string;\n products: ProductSearchResult[];\n productCatalogs: ProductCatalog[] | null;\n content: number;\n selectedProduct: SimpleProduct | null;\n selectedCatalogId: number | undefined;\n selectedProductDimensions?: ProductDimensionFull[];\n selectedQuantity?: number;\n reloadPage?: boolean;\n}\n\n/**\n * Add Lines to order template.\n */\nexport class AddLineToTemplate extends React.Component {\n public state: IAddLineToTemplateState = {\n isOpen: false,\n query: '',\n products: [],\n productCatalogs: [],\n content: CONTENT.Search,\n selectedProduct: null,\n selectedCatalogId: 0\n };\n\n public defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n public searchTextInput: React.RefObject = React.createRef(); // @TODO public/private\n\n private readonly addLineButtonRef: React.RefObject = React.createRef();\n\n constructor(props: IAddLineToTemplateProps) {\n super(props);\n }\n\n public onComponentDidMount(): void {\n this.searchTextInput.current?.focus();\n }\n\n public componentDidMount(): void {\n this._getCatalogs();\n }\n\n public onComponentDidUpdate(): void {\n this.searchTextInput.current?.focus();\n }\n\n @computed get showBackArrow(): boolean {\n return this.state.content === CONTENT.ProductConfiguration;\n }\n\n public shouldComponentUpdate(nextProps: IAddLineToTemplateProps, nextState: IAddLineToTemplateState): 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 {\n resources: { addLineModalLinkText, backToResultsText }\n } = this.props;\n\n const modalProps = {\n ...this.props,\n className: 'msc-add-line-to-template',\n toggle: this._toggleModalHandler,\n isOpen: this.state.isOpen,\n ariaLabel: addLineModalLinkText\n };\n\n return (\n <>\n \n \n {this.showBackArrow && (\n \n )}\n {addLineModalLinkText}\n \n {this._renderContent()}\n \n \n \n {addLineModalLinkText}\n \n \n );\n }\n\n private readonly _renderSearchForm = () => {\n const {\n resources: { searchButtonAriaLabel, searchModalPlaceholderText, selectCatalogTitleText }\n } = this.props;\n\n return (\n \n {this.state.productCatalogs && ArrayExtensions.hasElements(this.state.productCatalogs) && (\n <>\n \n \n {this._getCatalogNodes()}\n \n \n )}\n
\n \n
\n \n );\n };\n\n private readonly _onSearchSubmit = (event: React.FormEvent): void => {\n event.preventDefault();\n\n const query = get(this, 'searchTextInput.current.value', null);\n\n if (!query) {\n return;\n }\n\n this.setState({\n content: CONTENT.Loading\n });\n\n this._getSearchResults(query)\n .then(result => {\n if (result.length === 0) {\n this.setState({\n products: result,\n content: CONTENT.NotFound\n });\n } else {\n this.setState({\n products: result,\n content: CONTENT.ProductList\n });\n }\n })\n .catch(error => {\n this.setState({\n content: CONTENT.Error\n });\n });\n };\n\n private readonly _onQuantityChangeHandler = (event: React.ChangeEvent) => {\n this.setState({\n selectedQuantity: +event.target.value\n });\n };\n\n private readonly _onSelectItem = async (product: ProductSearchResult): Promise => {\n const {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n } = this.props.context;\n const varianteInput = new SelectedVariantInput(product.RecordId, channelId, [], undefined, this.props.context.request);\n const productVariant = await getSelectedVariant(varianteInput, actionContext);\n\n if (!productVariant) {\n this.props.context.telemetry.error('Error retrieving product variant');\n return Promise.resolve([]);\n }\n\n const dimensions = await this._getProductDimensions(product as SimpleProduct);\n\n this.setState({\n selectedProductDimensions: dimensions,\n content: CONTENT.ProductConfiguration,\n selectedProduct: productVariant\n });\n\n return dimensions;\n };\n\n private readonly _onInputChange = (event: React.ChangeEvent): void => {\n this.setState({\n query: event.target.value\n });\n };\n\n private readonly _onBackButtonClickHandler = (): void => {\n this.setState({\n content: CONTENT.ProductList\n });\n };\n\n private readonly _highlightSearchTerm = (name: string) => {\n const parsedName = name && unescape(name.replace(new RegExp(this.state.query, 'i'), '$&'));\n\n return (\n \n );\n };\n\n private readonly _resultCountText = (): string => {\n return this.props.resources.searchResultsCountVerbage\n .replace('{count}', this.state.products.length.toString())\n .replace('{subject}', `${this.props.resources.searchResultsCountSubject}${this.state.products.length > 1 ? 's' : ''}`);\n };\n\n private _renderContent(): React.ReactNode | null {\n switch (this.state.content) {\n case CONTENT.ProductConfiguration:\n const { selectedProduct, selectedProductDimensions } = this.state;\n const viewProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n product: selectedProduct!,\n dimensions: selectedProductDimensions!,\n addToTemplateHandler: this._addItemToTemplateHandler,\n onQuantityChangeHandler: this._onQuantityChangeHandler,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm()\n };\n\n return ;\n\n case CONTENT.ProductList:\n const productProps = {\n ...this.props,\n imageSettings: this.props.imageSettings || this.defaultImageSettings,\n clickHandler: this._onSelectItem,\n products: this.state.products,\n highlightSearchTerm: this._highlightSearchTerm,\n searchForm: this._renderSearchForm(),\n renderResultCountText: this._resultCountText\n };\n\n return (\n \n \n \n );\n\n case CONTENT.Loading:\n return (\n \n {this._renderSearchForm()}\n \n \n );\n\n case CONTENT.NotFound:\n const { notFoundSearchErrorNotice, notFoundSearchErrorRedediation } = this.props.resources;\n\n return (\n \n

{this._resultCountText()}

\n {this._renderSearchForm()}\n \n
\n );\n\n case CONTENT.Error:\n return (\n \n {this._renderSearchForm()}\n
\n {this.props.resources.searchErrorMessage}\n
\n
\n );\n\n default:\n return {this._renderSearchForm()};\n }\n }\n\n private readonly _addItemToTemplateHandler = async (config: IProductConfigurationState): Promise => {\n const {\n orderTemplateId,\n context: { actionContext },\n isMultipleCatalogFeatureEnabledInHq\n } = this.props;\n const catalogId = this.state.selectedCatalogId;\n const input = isMultipleCatalogFeatureEnabledInHq\n ? new AddItemToOrderTemplateInput(\n orderTemplateId,\n config.product.RecordId,\n config.quantity,\n config.product.DefaultUnitOfMeasure || 'ea',\n isMultipleCatalogFeatureEnabledInHq,\n catalogId\n )\n : new AddItemToOrderTemplateInput(\n orderTemplateId,\n config.product.RecordId,\n config.quantity,\n config.product.DefaultUnitOfMeasure || 'ea'\n );\n const result = await addItemToOrderTemplate(input, actionContext);\n this.setState({\n isOpen: false,\n reloadPage: true\n });\n // reload when closing\n window.location.reload();\n return result;\n };\n\n /**\n *\n * Get all active product catalogs.\n */\n private _getCatalogs(): void {\n const { isMultipleCatalogFeatureEnabledInHq, catalogs } = this.props;\n\n // if Channel Multiple Catalogs Feature is enabled then show all catalogs.\n const productCatalogs = isMultipleCatalogFeatureEnabledInHq && catalogs ? catalogs : [];\n\n // get the current catalog id.\n const catalogId = getCatalogId(this.props.context.request);\n validateCatalogId(catalogId);\n // set the current catalog id as a default selected catalog id from the url\n this.setState({\n productCatalogs: productCatalogs,\n selectedCatalogId: catalogId\n });\n }\n\n private _getCatalogNodes(): JSX.Element[] | null {\n const { productCatalogs, selectedCatalogId } = this.state;\n if (productCatalogs && ArrayExtensions.hasElements(productCatalogs)) {\n return productCatalogs.map((productCatalog: ProductCatalog) => {\n // initially select default catalog in dropdown\n const isSelected = productCatalog.RecordId === selectedCatalogId;\n return (\n \n );\n });\n }\n return [];\n }\n\n private readonly _onCatalogSelectionChange = (event: React.ChangeEvent) => {\n this.setState({\n selectedCatalogId: Number.parseInt(event.target.value, 10)\n });\n };\n\n private _getSearchResults(searchText: string): Promise {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const { selectedCatalogId } = this.state;\n const searchCriteriaInput: ProductSearchCriteria = {};\n\n searchCriteriaInput.Context = {\n ChannelId: channelId,\n CatalogId: selectedCatalogId\n };\n\n if (process.env.NODE_ENV === 'development' && process.env.ENABLE_CLOUD_SEARCH?.toLowerCase() !== 'true') {\n searchCriteriaInput.IncludeAttributes = false;\n } else {\n searchCriteriaInput.IncludeAttributes = true;\n }\n searchCriteriaInput.SearchCondition = searchText;\n\n return searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\n }\n\n private async _getProductDimensions(product: SimpleProduct): Promise {\n const {\n context: {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n }\n } = this.props;\n const id = product.MasterProductId ? product.MasterProductId : product.RecordId;\n\n return getDimensionsForSelectedVariant(\n new GetDimensionsForSelectedVariantInput(id, channelId, [], this.props.context.request),\n actionContext\n );\n }\n\n private readonly _toggleModalHandler = () => {\n if (this.state.isOpen) {\n const payLoad = getPayloadObject('click', this.props.telemetryContent!, 'add-item-to-template', '');\n onTelemetryClick(this.props.telemetryContent!, payLoad, 'add-item-to-template');\n this._getCatalogs();\n this.addLineButtonRef.current!.focus();\n }\n\n this.setState({\n isOpen: !this.state.isOpen,\n content: CONTENT.Search\n });\n\n if (this.state.reloadPage) {\n window.location.reload();\n this.setState({\n reloadPage: false\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 { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\ninterface IDropdownState {\n /**\n * @friendlyName selectedIndex\n * @description Selected index.\n */\n selectedIndex: string;\n}\n\nexport interface IDropdownProps {\n dropdownId: number;\n dropdownName: string;\n dropdownList: IDropdownItemProps[];\n telemetryContent?: ITelemetryContent;\n onChange?(selection: IDropdownOnSelection): void;\n}\n\nexport interface IDropdownItemProps {\n value: string;\n id: number;\n}\n\nexport interface IDropdownOnSelection {\n dropdownId: number;\n selectId: string;\n selectedValue: string;\n}\n\n/**\n *\n * DropDown component.\n * @extends {React.PureComponent}\n */\nexport class Dropdown extends React.PureComponent {\n private readonly selectMenu: React.RefObject = React.createRef();\n\n constructor(props: IDropdownProps, state: IDropdownState) {\n super(props);\n this.state = {\n selectedIndex: ''\n };\n }\n\n public componentDidMount(): void {\n if (this.selectMenu.current) {\n this.selectMenu.current.selectedIndex = 0;\n }\n }\n\n public render(): JSX.Element {\n const { dropdownId, dropdownList, dropdownName } = this.props;\n\n return (\n \n {dropdownList.map(\n (item: IDropdownItemProps) =>\n item && (\n \n {item.value}\n \n )\n )}\n \n );\n }\n\n private readonly _onChanged = (event: React.ChangeEvent): void => {\n this.setState({ selectedIndex: event.target.value });\n\n if (this.props.onChange) {\n this.props.onChange({\n dropdownId: this.props.dropdownId,\n selectId: event.target.value,\n selectedValue: event.target.innerText\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 * as React from 'react';\n\nexport const NotFoundComponent = (props: { error: string; msg: string }) => (\n <>\n
\n
{props.error}
\n
{props.msg}
\n \n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { debounce } from 'lodash';\nimport { reaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\ninterface IQuantityProps {\n min?: number;\n max: number;\n currentCount?: number;\n disabled?: boolean;\n incrementGlyphClass?: string;\n decrementGlyphClass?: string;\n decrementButtonAriaLabel?: string;\n incrementButtonAriaLabel?: string;\n inputQuantityAriaLabel?: string;\n id?: string;\n onChange?(newValue: number): void;\n}\n\ninterface IQuantityState {\n currentInput: number;\n}\n\n/**\n * Quantity Component - This component is used to add or remove quantity.\n */\n@observer\nexport default class OrderTemplateQuantity extends React.PureComponent {\n public static defaultProps: Partial = {\n min: 1,\n decrementGlyphClass: 'fas fa-minus',\n incrementGlyphClass: 'fas fa-plus'\n };\n\n private readonly inputRef: React.RefObject = React.createRef();\n\n constructor(props: IQuantityProps) {\n super(props);\n this.state = { currentInput: props.currentCount || 1 };\n this._handleChange = this._handleChange.bind(this);\n\n reaction(\n () => this.props.currentCount,\n () => {\n this.setState({ currentInput: this.props.currentCount || 1 });\n }\n );\n }\n\n public render(): JSX.Element {\n const glyphMinusClassName: string = `${this.props.decrementGlyphClass!} quantity__controls-glyph`;\n const glyphPlusClassName: string = `${this.props.incrementGlyphClass!} quantity__controls-glyph`;\n const disabled = this.props.currentCount === this.props.min;\n const incDisabled = this.props.currentCount === this.props.max;\n const currentValue = this.state.currentInput;\n let extraClass = '';\n if (disabled) {\n // The quantity has reached its boundaries (max or min)\n extraClass = 'disabled';\n } else if (this.props.disabled) {\n // This.props.disabled shows if the state is not succeded yet\n extraClass = 'transition';\n }\n const getChangeHandler = (amount: number) => () => {\n this._onIncrementalChange(amount);\n };\n\n return (\n
\n \n \n \n \n \n \n \n
\n );\n }\n\n private _onIncrementalChange(amount: number): void {\n const updatedQuantity = this.state.currentInput + amount;\n\n if (updatedQuantity >= 1 && updatedQuantity <= this.props.max) {\n this.props.onChange && this.props.onChange(updatedQuantity);\n }\n }\n\n private _handleChange(e: React.ChangeEvent): void {\n const currentValue = Number.parseInt(e.target.value, 10);\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n const inputElement =\n this.inputRef && this.inputRef.current && this.inputRef.current instanceof HTMLInputElement && this.inputRef.current;\n\n if (currentValue > this.props.max) {\n this.setState({ currentInput: this.props.max });\n } else {\n this.setState({ currentInput: currentValue }, () => {\n debounce(() => {\n if (!isNaN(this.state.currentInput) && !(this.state.currentInput < minValue) && inputElement) {\n inputElement.setAttribute('aria-valuenow', currentValue.toString());\n inputElement.setAttribute('value', currentValue.toString());\n }\n }, 200)();\n });\n }\n }\n\n private readonly _validateMin = (): void => {\n const minValue = this.props.min === undefined ? 1 : this.props.min;\n\n if (isNaN(this.state.currentInput) || this.state.currentInput < minValue) {\n this.props.onChange && this.props.onChange(minValue);\n } else {\n this.props.onChange && this.props.onChange(this.state.currentInput);\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 { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductDimensionValue, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n getDimensionsForSelectedVariant,\n GetDimensionsForSelectedVariantInput,\n getFallbackImageUrl,\n getPriceForSelectedVariant,\n getProductAvailabilitiesForSelectedVariant,\n getSelectedVariant,\n IProductInventoryInformation,\n PriceForSelectedVariantInput,\n ProductAvailabilitiesForSelectedVariantInput,\n SelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent, ModalBody, ModalFooter } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport OrderTemplateQuantity from '../common/order-template-quantity';\nimport { Dropdown, IAddLineToTemplateProps, IAddLineToTemplateResources, IDropdownItemProps, IDropdownOnSelection } from '.';\n\nexport interface IProductCnnfigurationProps extends IAddLineToTemplateProps {\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n imageSettings: IImageSettings;\n telemetryContent?: ITelemetryContent;\n searchForm: React.ReactNode;\n addToTemplateHandler(params: IProductConfigurationState): Promise;\n highlightSearchTerm(name: string): React.ReactNode;\n}\n\nexport interface IProductConfigurationState {\n quantity: number;\n unitPrice: number;\n totalPrice: number;\n product: SimpleProduct;\n dimensions: ProductDimensionFull[];\n selectedDimensions: {};\n productAvailableQuantity?: IProductInventoryInformation;\n buttonDisabled: boolean;\n showAddConfirmation: boolean;\n errorMessage?: string;\n isBusy: boolean;\n errors: { dimension?: string[]; add?: string };\n}\n\n/**\n * Configure selected product for addition to order template.\n */\nexport class ProductConfiguration extends React.Component {\n private selectedDimensions: {} = {};\n\n constructor(props: IProductCnnfigurationProps) {\n super(props);\n\n this.state = {\n quantity: 1,\n unitPrice: props.product.Price,\n totalPrice: props.product.Price,\n product: props.product,\n dimensions: props.dimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n selectedDimensions: {},\n buttonDisabled: false,\n showAddConfirmation: false\n } as IProductConfigurationState;\n }\n\n public shouldComponentUpdate(nextProps: IProductCnnfigurationProps, nextState: IProductConfigurationState): 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 {\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: { gridSettings }\n },\n resources: {\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n totalPriceLabel\n },\n imageSettings,\n highlightSearchTerm\n } = this.props;\n const { buttonDisabled, product, quantity, unitPrice, totalPrice, showAddConfirmation, errors } = this.state;\n const isMultipleCatalogSelect = this.props.isMultipleCatalogFeatureEnabledInHq ? 'isMultipleCatalogSelect' : '';\n return (\n <>\n \n {this.props.searchForm}\n
\n
\n
\n \n
\n
{product?.ItemId}
\n {highlightSearchTerm(product?.Name ?? '')}\n
\n {addLineProductUnitPricePrefix}\n {` `}\n {this._formatPrice(unitPrice)}\n
\n
\n {addLineProductUnitOfMeasurePrefix}\n {` `}\n {product?.DefaultUnitOfMeasure}\n
\n
\n
\n
{this._getDimensionsNodes()}
\n
\n
\n
{quantitySelectLabel}
\n \n
\n
\n
\n {totalPriceLabel}\n {` `}\n {this._formatPrice(totalPrice)}\n
\n
\n \n {showAddConfirmation && (\n \n
\n )}\n {errors?.add && (\n
\n
\n )}\n \n {addItemToTemplateText}\n \n \n \n );\n }\n\n private _getConfirmationMessage(): string {\n const selectedDimensionNames = this.state.dimensions\n .map(dimension => {\n let variant = dimension.DimensionValues?.find(\n value => value.RecordId === this.selectedDimensions[dimension.DimensionTypeValue]\n )?.Value;\n if (dimension.DimensionTypeValue === 3) {\n variant = `size ${variant}`;\n }\n return variant;\n })\n .filter(value => value);\n\n return this.props.resources.addToTemplateConfirmation\n .replace('{count}', this.state.quantity.toString())\n .replace('{productAndDimensions}', `${this.state.product.Name}, ${Object.values(selectedDimensionNames).join(', ')}`);\n }\n\n private _getDimensionsNodes(): React.ReactElement[] {\n const { dimensions } = this.state;\n const { resources } = this.props;\n\n return dimensions?.map((dimension: ProductDimensionFull) => {\n const { DimensionValues, DimensionTypeValue } = dimension;\n const mapDimensions = (value: ProductDimensionValue): IDropdownItemProps => ({\n id: value.RecordId,\n value: value.Value || ''\n });\n const dimensionName = this._getDropdownName(DimensionTypeValue, resources);\n const dropdownList: IDropdownItemProps[] = DimensionValues ? DimensionValues.map(mapDimensions) : [];\n dropdownList.unshift({ id: 0, value: `Choose a ${dimensionName}` });\n\n return (\n
\n
{dimensionName}
\n {this.state.errors?.dimension?.includes(DimensionTypeValue.toString()) && (\n \n \n \n )}\n \n
\n );\n });\n }\n\n private readonly _getDimensionsError = (dimensionName: string) =>\n this.props.resources.dimensionMissingError.replace(/{dimensionName}/g, dimensionName);\n\n private readonly _addToTemplateHandler = async (event: React.MouseEvent) => {\n // Hide confirmation of previous addition when adding multiple items\n this.setState({\n isBusy: true,\n showAddConfirmation: false,\n errors: { ...this.state.errors, add: undefined }\n });\n\n const missingDimensions = this.state.dimensions\n .map(dimension => dimension.DimensionTypeValue.toString())\n .filter(type => !this.selectedDimensions[type]);\n\n this.setState({\n errors: { dimension: missingDimensions }\n });\n if (missingDimensions.length > 0) {\n this.setState({\n isBusy: false\n });\n return;\n }\n\n this.props\n .addToTemplateHandler({ ...this.state })\n .then(status => {\n // Validate against the existance of a ProductListId\n if (status.ProductListId) {\n this.setState({\n isBusy: false,\n showAddConfirmation: true\n });\n }\n })\n .catch(error => {\n const { addToTemplateDuplicateError, addToTemplateGenericError } = this.props.resources;\n let errorMessage;\n\n if (error.error.name === 'Microsoft_Dynamics_Commerce_Runtime_DuplicateObject') {\n errorMessage = addToTemplateDuplicateError;\n } else {\n errorMessage = addToTemplateGenericError;\n }\n\n this.setState({\n isBusy: false,\n errors: { ...this.state.errors, add: errorMessage }\n });\n this.props.context.telemetry.error('Error adding item to order template');\n });\n };\n\n private readonly _onQuantityChange = (newValue: number) => {\n this.setState({\n quantity: newValue,\n totalPrice: newValue * this.props.product.Price\n });\n };\n\n private readonly _updateDimensionValue = (\n productDimensionFull: ProductDimensionFull,\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 // Rehydrate the selected variants price, available dimensions & sizes\n private readonly _onDimensionChanged = async (selection: IDropdownOnSelection): Promise => {\n const { product, dimensions, context } = this.props;\n const {\n actionContext,\n request: {\n apiSettings: { channelId }\n }\n } = context;\n\n // Remaining error notifications for missing dimensions\n const remainingDimensionsErrors = this.state.errors?.dimension?.filter(id => id !== selection.dropdownId.toString());\n\n this.setState({\n isBusy: false,\n showAddConfirmation: false,\n buttonDisabled: true,\n errors: { add: undefined, dimension: remainingDimensionsErrors }\n });\n\n // Update currently selected dimensions\n this.selectedDimensions[selection.dropdownId] = +selection.selectId;\n\n const mappedDimensions = dimensions\n ?.map(dimension => {\n return {\n DimensionTypeValue: dimension.DimensionTypeValue,\n DimensionValue:\n this._updateDimensionValue(dimension, this.selectedDimensions[dimension.DimensionTypeValue]) ||\n dimension.DimensionValue,\n ExtensionProperties: dimension.ExtensionProperties\n };\n })\n .filter(dimension => {\n return dimension && dimension.DimensionValue;\n });\n\n const variantProduct = await getSelectedVariant(\n new SelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId,\n mappedDimensions,\n undefined,\n this.props.context.request\n ),\n actionContext\n );\n\n if (!variantProduct) {\n this.props.context.telemetry.error(\n `Error retrieving variant product for product ${product.MasterProductId ? product.MasterProductId : product.RecordId}`\n );\n return;\n }\n\n const dimensionInput = new GetDimensionsForSelectedVariantInput(\n variantProduct.RecordId,\n channelId,\n mappedDimensions,\n this.props.context.request\n );\n const variantDimensions = await getDimensionsForSelectedVariant(dimensionInput, actionContext);\n\n if (!variantDimensions) {\n this.props.context.telemetry.error('Error retrieving dimensions for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n const availabilityInput = new ProductAvailabilitiesForSelectedVariantInput(\n product.MasterProductId ? product.MasterProductId : product.RecordId,\n channelId\n );\n\n // @TODO sync UX quantity w/ actual availability\n const newAvailableQuantity = await getProductAvailabilitiesForSelectedVariant(availabilityInput, actionContext);\n const priceInput = new PriceForSelectedVariantInput(product.RecordId, channelId);\n const productPrice = await getPriceForSelectedVariant(priceInput, actionContext);\n\n if (!productPrice) {\n this.props.context.telemetry.error('Error retrieving price for reconfigured product variant');\n this.setState({\n buttonDisabled: false\n });\n return;\n }\n\n this.setState({\n buttonDisabled: false,\n productAvailableQuantity: (newAvailableQuantity && newAvailableQuantity[0]) || undefined,\n unitPrice: +(productPrice.BasePrice || product.Price),\n dimensions: variantDimensions.sort((a, b) => a.DimensionTypeValue - b.DimensionTypeValue),\n product: variantProduct\n });\n };\n\n private readonly _getDropdownName = (dimensionType: number, resources: IAddLineToTemplateResources): string => {\n switch (dimensionType) {\n case 1: // Color\n return resources.productDimensionTypeColor;\n case 2: // Configuration\n return resources.productDimensionTypeConfiguration;\n case 3: // Size\n return resources.productDimensionTypeSize;\n case 4: // Style\n return resources.productDimensionTypeStyle;\n default:\n return '';\n }\n };\n\n private _formatPrice(price: number): string {\n const {\n context: {\n cultureFormatter: {\n formatCurrency,\n\n // @ts-expect-error\n currencyCode\n }\n }\n } = this.props;\n\n return formatCurrency(price.toFixed(2), currencyCode);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ProductDimensionFull } from '@msdyn365-commerce/commerce-entities';\nimport { IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React, { useState } from 'react';\n\nimport { IAddLineToTemplateProps } from '.';\n\nexport interface IProductListProps extends IAddLineToTemplateProps {\n products: ProductSearchResult[];\n imageSettings: IImageSettings;\n searchForm: React.ReactNode;\n clickHandler(product: ProductSearchResult): Promise;\n highlightSearchTerm(name: string): React.ReactNode;\n renderResultCountText(): string;\n}\n\nexport const ProductList = (props: IProductListProps) => {\n const {\n products,\n context: {\n actionContext: {\n requestContext: { apiSettings }\n },\n request: { gridSettings },\n cultureFormatter: {\n formatCurrency,\n\n // @ts-expect-error\n currencyCode\n }\n },\n clickHandler,\n highlightSearchTerm,\n renderResultCountText,\n resources: { selectProductButtonText },\n imageSettings\n } = props;\n\n return (\n <>\n

\n {renderResultCountText()}\n

\n {props.searchForm}\n
\n {products.map((product: ProductSearchResult, index: number) => {\n const { Price, ItemId, Name, PrimaryImageUrl } = product;\n const price = formatCurrency(Price.toFixed(2), currencyCode);\n const primaryImageSource = generateImageUrl(PrimaryImageUrl ?? '', apiSettings) ?? '';\n const fallBackImg = getFallbackImageUrl(ItemId, apiSettings, props.context.request.app?.config?.OmniChannelMedia) ?? '';\n\n return (\n
\n
\n \n
\n
{ItemId}
\n {highlightSearchTerm(Name ?? '')}\n
\n
\n
\n {price}\n \n
\n
\n );\n })}\n
\n \n );\n};\n\ninterface IProductSelectButton {\n product: ProductSearchResult;\n buttonText: string;\n clickHandler(product: ProductSearchResult): Promise;\n}\n\nconst ProductSelectButton = (props: IProductSelectButton) => {\n const [isBusy, setBusy] = useState(false);\n const { product, buttonText, clickHandler } = props;\n const getClickHandler = React.useCallback(async () => {\n setBusy(!isBusy);\n await clickHandler(product);\n setBusy(!isBusy);\n }, [clickHandler, isBusy, product]);\n\n return (\n \n {buttonText}\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, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport { IOrderTemplateData } from '../order-template.data';\nimport { IOrderTemplateProps } from '../order-template.props.autogenerated';\nimport { AddLineToTemplate } from '.';\n\ninterface IOrderTemplateBulkActionsProps extends IOrderTemplateProps {\n orderTemplateId: string;\n selectedLines: IOrderTemplateLineViewModel[];\n isMinifiedView: boolean;\n isMultipleCatalogFeatureEnabledInHq: boolean;\n telemetryContent?: ITelemetryContent;\n onAddSelectionToBag(): void;\n onRemoveSelection(): void;\n}\n\ninterface IOrderTemplateBulkActionsState {\n isAddDisabled: boolean;\n isRemoveDisabled: boolean;\n}\n\n/**\n * Bulk Order Template line actions.\n */\nexport class OrderTemplateBulkActions extends React.PureComponent {\n public state: IOrderTemplateBulkActionsState = {\n isAddDisabled: true,\n isRemoveDisabled: true\n };\n\n public static getDerivedStateFromProps(\n props: IOrderTemplateBulkActionsProps,\n state: IOrderTemplateBulkActionsState\n ): IOrderTemplateBulkActionsState {\n const selectedLines = props.selectedLines.length;\n let nextState = { ...state };\n nextState = {\n isAddDisabled: selectedLines === 0,\n isRemoveDisabled: selectedLines === 0\n };\n return nextState;\n }\n\n public render(): JSX.Element {\n const {\n addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectCatalogTitleText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n addSelectedToBagButtonText,\n removeSelectedToBagButtonText,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n } = this.props.resources;\n\n const addLineProps = {\n context: this.props.context,\n telemetryContent: this.props.telemetryContent,\n resources: {\n addLineModalLinkText,\n searchButtonAriaLabel,\n searchInputAriaLabel,\n searchModalPlaceholderText,\n selectCatalogTitleText,\n selectProductButtonText,\n addItemToTemplateText,\n addLineProductUnitPricePrefix,\n backButtonText,\n decrementButtonAriaLabel,\n incrementButtonAriaLabel,\n quantitySelectLabel,\n addLineProductUnitOfMeasurePrefix,\n notFoundSearchErrorNotice,\n notFoundSearchErrorRedediation,\n searchErrorMessage,\n productDimensionTypeColor,\n productDimensionTypeConfiguration,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n searchResultsCountVerbage,\n searchResultsCountSubject,\n addToTemplateConfirmation,\n totalPriceLabel,\n progressNotificationText,\n addToTemplateDuplicateError,\n addToTemplateGenericError,\n dimensionMissingError\n },\n imageSettings: this.props.config.imageSettings,\n orderTemplateId: this.props.orderTemplateId,\n isMultipleCatalogFeatureEnabledInHq: this.props.isMultipleCatalogFeatureEnabledInHq,\n catalogs: this.props.data.catalogs?.result\n };\n\n return (\n <>\n \n \n \n {!this.props.isMinifiedView && addSelectedToBagButtonText}\n \n \n \n {!this.props.isMinifiedView && removeSelectedToBagButtonText}\n \n \n );\n }\n\n private readonly addHandler = (event: React.MouseEvent) => {\n this.setState({\n isAddDisabled: true\n });\n\n this.props.onAddSelectionToBag();\n\n this.setState({\n isAddDisabled: false\n });\n };\n\n private readonly removeHandler = (event: React.MouseEvent) => {\n this.setState({\n isRemoveDisabled: true\n });\n\n this.props.onRemoveSelection();\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 AddOrderTemplateToCartComponent,\n ILinesAddedToCartDialogResources,\n IOrderTemplateNameDialogResources,\n RenameOrderTemplateComponent,\n OrderTemplateNameDialog\n} from '@msdyn365-commerce/components';\nimport { IComponentProps, ICoreContext } from '@msdyn365-commerce/core';\nimport { ProductList } from '@msdyn365-commerce/retail-proxy';\nimport { OrderTemplate, Random } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, ITelemetryContent, Popover } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\nimport { useState } from 'react';\n\nexport interface IOrderTemplateActionsData {\n orderTemplate: OrderTemplate;\n}\n\nexport interface IOrderTemplateActionsProps extends IComponentProps {\n context: ICoreContext;\n telemetryContent?: ITelemetryContent;\n handlers: {\n onRemoveTemplate(orderTemplateId: string): void;\n onRenameTemplate(orderTemplate: ProductList): Promise;\n };\n renameOrderTemplateDialogStrings: IOrderTemplateNameDialogResources;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n resources: {\n addTemplateToBagButtonText: string;\n renameTemplateButtonText: string;\n deleteTemplateButtonText: string;\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n orderTemplateErrorMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n}\n\nexport interface IOrderTemplateActionsViewProps {\n addTemplateToBag: React.ReactNode;\n renameTemplate?: React.ReactNode;\n removeTemplate?: React.ReactNode;\n isMultipleCatalogsFeatureEnabled?: boolean;\n actionsSplitButton?: React.ReactNode;\n}\n\n/**\n * Remove Order Action.\n * @param props -Order template action props.\n * @returns Remove order template.\n */\nconst removeOrderActionHandler = (props: IOrderTemplateActionsProps) => () => {\n _removeOrderTemplate(props);\n};\n\nexport const OrderTemplateActionsView = (props: IOrderTemplateActionsProps): IOrderTemplateActionsViewProps => {\n const { resources, isMultipleCatalogFeatureEnabledInHq } = props;\n const { deleteTemplateButtonText } = resources;\n\n return {\n addTemplateToBag: _getOrderTemplateAddToCartDialog(props),\n renameTemplate: !isMultipleCatalogFeatureEnabledInHq && _getOrderTemplateRenameControl(props),\n removeTemplate: !isMultipleCatalogFeatureEnabledInHq && (\n \n ),\n actionsSplitButton: isMultipleCatalogFeatureEnabledInHq && \n };\n};\n\nconst _removeOrderTemplate = (props: IOrderTemplateActionsProps): void => {\n const {\n data: { orderTemplate },\n handlers\n } = props;\n const { onRemoveTemplate } = handlers;\n\n if (onRemoveTemplate) {\n onRemoveTemplate(orderTemplate.productList.Id);\n }\n};\n\nconst _getOrderTemplateAddToCartDialog = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const {\n data: { orderTemplate },\n typeName,\n id,\n context,\n telemetryContent,\n resources,\n isMultipleCatalogFeatureEnabledInHq\n } = props;\n const {\n addTemplateToBagButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n orderTemplateErrorMessage,\n linesAddedToCartDialogResources\n } = resources;\n\n const dialogStrings = {\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n orderTemplateErrorMessage,\n linesAddedToCartDialogResources\n };\n\n return (\n \n );\n};\n\nconst _getOrderTemplateRenameControl = (props: IOrderTemplateActionsProps): React.ReactNode => {\n const { renameOrderTemplateDialogStrings, resources, context, handlers } = props;\n return (\n \n );\n};\n\nlet buttonEventReference: HTMLButtonElement | undefined;\nexport const ActionsSplitButton: React.FC = (props: IOrderTemplateActionsProps) => {\n const [isStatementRequestAdminDropdownOpen, setIsStatementRequestAdminDropdownOpen] = useState(false);\n const [renameOrderTemplateDialogOpen, setOrderTemplateNameDialogOpen] = React.useState(false);\n\n const onOrderTemplateNameCancel = () => {\n context.telemetry.debug('Rename of template was canceled.');\n buttonEventReference?.focus();\n };\n\n const onRenameButtonClick = (event: React.MouseEvent) => {\n buttonEventReference = event.target as HTMLButtonElement;\n setOrderTemplateNameDialogOpen(true);\n event.preventDefault();\n };\n const onToggleDropdown1 = () => {\n setIsStatementRequestAdminDropdownOpen(!isStatementRequestAdminDropdownOpen);\n };\n const {\n data: { orderTemplate },\n resources,\n renameOrderTemplateDialogStrings,\n context\n } = props;\n\n const className = 'ms-order-template-action-bar';\n\n const popoverReference = React.createRef();\n const renderModalPopup = (\n \n );\n const requestStatementDropdownString = `request-statement-dropdown-id-${Random.Guid.generateGuid()}`;\n\n return (\n
\n {renderModalPopup}\n \n {'Options'}\n \n \n \n\n \n {'Delete'}\n \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 { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport { ProductCatalog, ProductPrice, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { ArrayExtensions, getFallbackImageUrl, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport React, { useState } from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\nimport OrderTemplateQuantity from './common/order-template-quantity';\n\nexport interface IOrderTemplateLineProps extends ProductListLine {\n orderTemplateLine: IOrderTemplateLineViewModel;\n productListLine: ProductListLine;\n price?: ProductPrice;\n context: ICoreContext;\n productUrl: string;\n imageSettings?: IImageSettings;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n quantity: number;\n isQuantityDisabledForUpdate?: boolean;\n handlers: {\n onAddToBag(product: SimpleProduct, quantity: number, itemKey: string, catalogId?: number | undefined): void;\n onRemoveItem(line: IOrderTemplateLineViewModel): void;\n onChangeQuantity(orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps): void;\n onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void;\n };\n resources: {\n selectOneRowText?: string;\n moreButtonText?: string;\n viewProductDetailsText?: string;\n productDimensionTypeColor: string;\n productDimensionTypeSize: string;\n productDimensionTypeStyle: string;\n originalPriceText: string;\n currentPriceText: string;\n freePriceText: string;\n inputQuantityAriaLabel: string;\n removeFromOrderTemplateLinesText: string;\n addToBagButtonText: string;\n deleteButtonText: string;\n incrementButtonAriaLabel?: string;\n decrementButtonAriaLabel?: string;\n editOrderTemplateLineQuantityError?: string;\n unavailableProductErrorMessage?: string;\n outOfStockProductErrorMessage?: string;\n };\n index: number;\n isMobile: boolean;\n productQuantityView?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n toggleDetailsDisplayed(props: IOrderTemplateLineProps): void;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n catalogs?: ProductCatalog[];\n error?: string;\n shouldDisable?: boolean;\n}\n\nexport interface IOrderTemplateLineViewProps {\n key?: string;\n productImage: React.ReactNode;\n productPrice?: React.ReactNode;\n addToBagButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n productName?: string;\n productNumber?: React.ReactNode;\n productInfo?: React.ReactNode;\n productLabel?: React.ReactNode;\n productUnitOfMeasure?: React.ReactNode;\n productQuantity?: number;\n productQuantityView?: React.ReactNode;\n productListId?: string;\n selectLine?: React.ReactNode;\n popUp?: JSX.Element;\n extraActionsPopup?: JSX.Element | null | undefined;\n isMobile?: boolean;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n productLineCatalog?: React.ReactNode;\n disabled?: boolean;\n}\n\ninterface IEventHandlerFactory {\n getAddToBag(): (event: React.MouseEvent) => void;\n getRemoveItem(): (event: React.MouseEvent) => void;\n}\n\nconst OrderTemplateLineActions = (props: IOrderTemplateLineProps): IEventHandlerFactory => {\n const { orderTemplateLine, productListLine, quantity, handlers } = props;\n const { LineId, CatalogId } = productListLine;\n const { onAddToBag, onRemoveItem } = handlers;\n\n return {\n getAddToBag: () => (event: React.MouseEvent) => {\n LineId &&\n orderTemplateLine.fullProduct &&\n onAddToBag(orderTemplateLine.fullProduct.ProductDetails, quantity, LineId, CatalogId);\n },\n getRemoveItem: () => (event: React.MouseEvent) => LineId && onRemoveItem(props.orderTemplateLine)\n };\n};\n\ninterface IPopupProps extends IOrderTemplateLineProps {\n addButtonClassName: string;\n removeButtonClassName: string;\n}\n\nconst PopUp = (props: IPopupProps): JSX.Element | null => {\n const { addToBagButtonText, removeFromOrderTemplateLinesText, moreButtonText, viewProductDetailsText } = props.resources;\n const [showMobile, setShowMobile] = useState(false);\n const componentClassName = 'ms-table';\n\n const getViewHandler = () => (event: React.MouseEvent) => {\n props.toggleDetailsDisplayed(props);\n };\n\n const toggle = React.useCallback(() => {\n setShowMobile(!showMobile);\n }, [showMobile]);\n\n return (\n
\n \n {showMobile && (\n
\n \n View\n \n {getActionButton(\n props.isMobile,\n props.removeButtonClassName,\n removeFromOrderTemplateLinesText,\n OrderTemplateLineActions(props).getRemoveItem()\n )}\n {getActionButton(\n props.isMobile,\n props.addButtonClassName,\n addToBagButtonText,\n OrderTemplateLineActions(props).getAddToBag()\n )}\n
\n )}\n
\n );\n};\n\nconst getActionButton = (\n isMobile: boolean,\n className: string,\n buttonText: string,\n clickHandler: (event: React.MouseEvent) => void\n): React.ReactNode => (\n \n);\n\nconst getDesktopActionButton = (\n className: string,\n buttonText: string,\n clickHandler: (event: React.MouseEvent) => void\n): React.ReactNode => (\n \n);\n/**\n * On Select line function.\n * @param orderTemplateLine -Order template line.\n * @param input -Order template line props.\n * @returns Set on select order template.\n */\nconst onSelectLineHandler = (orderTemplateLine: IOrderTemplateLineViewModel, input: IOrderTemplateLineProps) => (\n event: React.ChangeEvent\n) => {\n orderTemplateLine.isChecked = !orderTemplateLine.isChecked;\n\n input.handlers.onSelect(orderTemplateLine, event.target.checked);\n};\n\nexport const OrderTemplateLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | null => {\n const {\n orderTemplateLine,\n productListLine,\n price,\n context,\n imageSettings,\n quantity,\n resources,\n isMobile,\n isMultipleCatalogFeatureEnabledInHq\n } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n const { removeFromOrderTemplateLinesText, addToBagButtonText, selectOneRowText } = resources;\n if (!product) {\n return null;\n }\n\n const { ItemId, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(\n ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const addButtonClassName = input.isMobile ? 'ms-table__row-links-add' : 'ms-order-template-table-line__product-add-button';\n const removeButtonClassName = input.isMobile ? 'ms-table__row-links-delete' : 'ms-order-template-table-line__product-remove-button';\n\n return {\n isMobile,\n isMultipleCatalogFeatureEnabledInHq: isMultipleCatalogFeatureEnabledInHq,\n selectLine: (\n \n ),\n key: LineId!,\n productLineCatalog: isMultipleCatalogFeatureEnabledInHq && renderProductCatalog(input),\n productImage: _renderProductImage(\n 'ms-order-template-table-line__product-image',\n context,\n product.ProductDetails.Name!,\n PrimaryImageUrl,\n fallbackImage,\n imageSettings\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: product && (\n <>\n
{ItemId}
\n {input.error !== 'NONE' ? (\n
{_renderProductError(input)}
\n ) : (\n undefined\n )}\n \n ),\n productUnitOfMeasure: price ? (\n
{UnitOfMeasure || price.UnitOfMeasure}
\n ) : (\n undefined\n ),\n productListId: LineId!,\n removeButton:\n !isMultipleCatalogFeatureEnabledInHq &&\n getActionButton(\n input.isMobile,\n removeButtonClassName,\n removeFromOrderTemplateLinesText,\n OrderTemplateLineActions(input).getRemoveItem()\n ),\n productQuantityView:
{_generateQuantity(input, LineId!)}
,\n productQuantity: quantity,\n addToBagButton:\n !isMultipleCatalogFeatureEnabledInHq &&\n getActionButton(input.isMobile, addButtonClassName, addToBagButtonText, OrderTemplateLineActions(input).getAddToBag()),\n extraActionsPopup:\n !isMobile && isMultipleCatalogFeatureEnabledInHq ? (\n \n ) : (\n undefined\n ),\n popUp: ,\n disabled: input.shouldDisable\n };\n};\n\nconst ExtraActionsPopup = (props: IPopupProps): JSX.Element | null => {\n const [showActions, setShowActions] = useState(false);\n const toggle = React.useCallback(() => {\n setShowActions(!showActions);\n }, [showActions]);\n\n const className = 'ms-order-template-table-line__extra-actions-cell';\n const actionsContainerClassName = `${className}__actions-container`;\n return (\n
\n
\n );\n};\n\nexport const OrderTemplateMobileLineView = (input: IOrderTemplateLineProps): IOrderTemplateLineViewProps | undefined => {\n const { orderTemplateLine, productListLine, price, context, imageSettings, isMultipleCatalogFeatureEnabledInHq } = input;\n const product = orderTemplateLine.fullProduct;\n const { LineId, UnitOfMeasure } = productListLine;\n if (!product) {\n return;\n }\n const { ItemId, PrimaryImageUrl } = product.ProductDetails;\n const fallbackImage = getFallbackImageUrl(\n ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n\n return {\n productLineCatalog: isMultipleCatalogFeatureEnabledInHq && renderProductCatalog(input),\n productImage: _renderProductImage(\n 'thumbnail',\n context,\n product.ProductDetails.Name!,\n PrimaryImageUrl,\n fallbackImage,\n imageSettings\n ),\n productInfo: renderProductInfo(input),\n productPrice: price && _renderPrice(input),\n productNumber: ItemId,\n productUnitOfMeasure: UnitOfMeasure || price?.UnitOfMeasure,\n productQuantityView: _generateQuantity(input, LineId!)\n };\n};\n\nexport interface IOrderTemplateProductQuantityViewProps {\n ContainerProps: INodeProps;\n input: React.ReactNode;\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: (orderTemplateLineId: string, quantity: number, props?: IOrderTemplateLineProps | undefined) => void,\n itemKey: string,\n props: IOrderTemplateLineProps\n) => (newValue: number) => {\n if (onChangeQuantity) {\n onChangeQuantity(itemKey, newValue, props);\n }\n};\n\nconst _generateQuantity = (props: IOrderTemplateLineProps, itemKey: string): React.ReactNode => {\n const { handlers, resources, quantity } = props;\n const { onChangeQuantity } = handlers;\n return (\n \n );\n};\n\nexport const _renderProductImage = (\n className: string,\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=64&h=64&m=6', w: 0, h: 0 },\n lg: { q: 'w=64&h=64&m=6', w: 0, h: 0 },\n xl: { q: 'w=64&h=64&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n return (\n \n );\n};\n\nexport const renderProductCatalog = (props: IOrderTemplateLineProps) => {\n const catalogId = props.productListLine.CatalogId;\n validateCatalogId(catalogId);\n\n if (!props.context.request.user.isB2b || !catalogId || !ArrayExtensions.hasElements(props.catalogs)) {\n return null;\n }\n\n const catalog = props.catalogs.find(item => item.RecordId === catalogId);\n\n if (!catalog || !catalog.Name) {\n return null;\n }\n\n return
{catalog.Name}
;\n};\n\nconst _renderPrice = (props: IOrderTemplateLineProps): JSX.Element | null => {\n const { price, context, moduleId, moduleTypeName, resources } = props;\n\n if (price) {\n return (\n \n );\n }\n return null;\n};\n\nconst _renderProductDimensions = (props: IOrderTemplateLineProps): (string | undefined)[] => {\n const { orderTemplateLine } = props;\n\n if (!orderTemplateLine.fullProduct || !orderTemplateLine.fullProduct.ProductDetails.Dimensions) {\n return [];\n }\n\n return orderTemplateLine.fullProduct.ProductDetails.Dimensions.map(dimension => {\n if (!dimension.DimensionValue || !dimension.DimensionValue.Value) {\n return undefined;\n }\n\n return dimension.DimensionValue.Value;\n });\n};\n\nconst _renderProductError = (props: IOrderTemplateLineProps) => {\n const { error, resources } = props;\n\n if (!error) {\n return '';\n }\n\n const errorMessages = {\n OOS: resources.outOfStockProductErrorMessage,\n UNASSORTED: resources.unavailableProductErrorMessage,\n NONE: ''\n };\n\n return errorMessages[error];\n};\n\nexport const renderProductInfo = (props: IOrderTemplateLineProps): React.ReactNode | undefined => {\n const { orderTemplateLine, productUrl } = props;\n const name = orderTemplateLine.fullProduct?.ProductDetails.Name;\n\n const dimensions = _renderProductDimensions(props);\n if (!orderTemplateLine.fullProduct) {\n return [];\n }\n\n const productName = productUrl ? (\n \n {name}\n \n ) : (\n
{name}
\n );\n\n const dimensionsLine: string = dimensions.join(', ');\n\n return (\n
\n
{productName}
\n
{dimensionsLine}
\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 { orderTemplateLinesStatus } from '../order-template';\n\nexport interface IOrderTemplateLinesStatusMessageProps {\n className?: string;\n errorType: orderTemplateLinesStatus;\n text?: string;\n}\n\nexport const OrderTemplateLinesStatusMessage: React.FC = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return

{text}

;\n case 'FAILED':\n return

{text}

;\n case 'LOADING':\n default:\n return

{text}

;\n }\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nimport { IOrderTemplateLineViewModel } from '../order-template';\n\nexport interface IOrderTemplateTableHeadingProps {\n selectAllRowsText?: string;\n productNumber: string;\n productName: string;\n productUnitPrice: string;\n productUOM: string;\n productQuantity: string;\n productActions: string;\n lines: IOrderTemplateLineViewModel[];\n isMobile: boolean;\n clickHandler(isChecked: boolean): void;\n productImage?: string;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n productLineCatalogName?: string;\n}\n\n/**\n * Order Template's table state.\n */\nexport interface IOrderTemplateTableHeadingState {\n isChecked: boolean;\n}\n\nexport interface IOrderTemplateTableShortHeading {\n productNumber: string;\n productActions: string;\n}\n\n/**\n * Order Template's table heading.\n */\nexport class OrderTemplateTableHeading extends React.PureComponent {\n public state: IOrderTemplateTableHeadingState = {\n isChecked: false\n };\n\n private readonly componentClassName: string = 'ms-table';\n\n public static getDerivedStateFromProps(\n props: IOrderTemplateTableHeadingProps,\n state: IOrderTemplateTableHeadingState\n ): IOrderTemplateTableHeadingState {\n const checkedLines = props.lines.filter(line => !line.isChecked).length;\n let nextState = { ...state };\n nextState = { isChecked: checkedLines === 0 };\n return nextState;\n }\n\n public getOnChange = () => (event: React.ChangeEvent) => {\n this.setState(\n {\n isChecked: this.state.isChecked\n },\n () => {\n this.props.clickHandler(!this.state.isChecked);\n }\n );\n };\n\n public render(): JSX.Element {\n return (\n \n \n \n \n \n {!this.props.isMobile && this.props.isMultipleCatalogFeatureEnabledInHq ? (\n {this.props.productLineCatalogName}\n ) : null}\n {!this.props.isMobile ? {this.props.productImage} : null}\n {this.props.productNumber}\n {!this.props.isMobile ? {this.props.productName} : null}\n {!this.props.isMobile ? {this.props.productUnitPrice} : null}\n {!this.props.isMobile ? {this.props.productUOM} : null}\n {!this.props.isMobile ? {this.props.productQuantity} : null}\n {!this.props.isMobile ? {this.props.productActions} : }\n \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 {\n IItemAddedToCartDialogData,\n IItemAddedToCartDialogResources,\n ILinesAddedToCartDialogResources,\n IOrderTemplateNameDialogResources,\n ItemAddedToCartDialog\n} from '@msdyn365-commerce/components';\nimport MsDyn365, { AsyncResult, getCatalogId, getUrlSync, ICoreContext, IRequestContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult } from '@msdyn365-commerce/global-state';\nimport { ProductList, ProductListLine } from '@msdyn365-commerce/retail-proxy';\nimport {\n deleteAsync,\n removeProductListLinesAsync,\n updateProductListLinesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductListsDataActions.g';\nimport { FeatureState, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n ArrayExtensions,\n createGetFeatureStateInput,\n getFeatureState,\n getPriceForSelectedVariant,\n getProductUrlSync,\n ObjectExtensions,\n OrderTemplate,\n OrderTemplateLine,\n PriceForSelectedVariantInput,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Alert,\n getTelemetryObject,\n Heading,\n IModuleProps,\n INodeProps,\n ITelemetryContent,\n UncontrolledPagination\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport { action, computed, observable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n IOrderTemplateActionsProps,\n IOrderTemplateActionsViewProps,\n IOrderTemplateLineProps,\n IOrderTemplateLineViewProps,\n IOrderTemplateTableHeadingProps,\n OrderTemplateActionsView,\n OrderTemplateLinesStatusMessage,\n OrderTemplateLineView,\n OrderTemplateMobileLineView,\n OrderTemplateTableHeading\n} from '../..';\nimport { ActiveOrderTemplateLinesInput } from './actions/get-order-template';\nimport { OrderTemplateBulkActions } from './components/bulk-actions';\nimport { IOrderTemplateData } from './order-template.data';\nimport { IOrderTemplateProps, IOrderTemplateResources } from './order-template.props.autogenerated';\nimport Spinner from './components/add-line/spinner';\n\nexport interface IOrderTemplateLineActionMessageState {\n itemKey: string;\n userMessage: string;\n statusCssString: string;\n messageGlyph: string;\n isOpen: boolean;\n isItemAddedToOrderTemplateOpen: boolean;\n isConfirmAddSelectionToBagModalOpen: boolean;\n itemAddedToCartDialogData?: IItemAddedToCartDialogData;\n productSelection: IOrderTemplateLineViewModel[];\n isDetailsDisplayed: boolean;\n detailedProductView?: IOrderTemplateLineViewProps;\n isQuantityDisabledForUpdate?: boolean;\n}\n\nexport type orderTemplateLinesStatus = 'LOADING' | 'SUCCESS' | 'FAILED' | 'EMPTY';\ntype GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface IOrderTemplateViewProps extends IOrderTemplateProps {\n OrderTemplateLines: IModuleProps;\n callbacks?: IOrderTemplateLinesCallbacks;\n status?: orderTemplateLinesStatus;\n statusMessage?: React.ReactNode;\n heading?: React.ReactNode;\n OrderTemplateActions?: INodeProps;\n ProductsTable?: INodeProps;\n ProductsTableRow?: INodeProps;\n ProductsTableHeading?: React.ReactNode;\n ProductDetails?: INodeProps;\n orderLines?: IOrderTemplateLineViewProps[];\n productListLines?: ProductListLine[];\n productsStatusMessage?: React.ReactNode;\n orderActions?: IOrderTemplateActionsViewProps | null;\n resources: IOrderTemplateResources;\n pagination?: React.ReactNode;\n itemAddedToCartDialog?: React.ReactNode;\n bulkOrderLineActions?: React.ReactNode;\n isDetailsDisplayed?: boolean;\n detailedProduct?: IOrderTemplateLineProps;\n detailedProductView?: IOrderTemplateLineViewProps;\n productQuantityView?: React.ReactNode;\n addButton?: React.ReactNode;\n isMobile?: boolean;\n toggleDetailsDisplayed?(props: IOrderTemplateLineProps | undefined): void;\n}\n\nexport interface IOrderTemplateLinesCallbacks {\n updateQuantity(itemKey: string, quantity: number): void;\n}\n\nexport interface IOrderTemplateLineViewModel extends OrderTemplateLine {\n isChecked: boolean;\n productQuantityView: React.ReactNode;\n}\n\n/**\n *\n * OrderTemplateLines component.\n * @extends {React.PureComponent, IOrderTemplateLineActionMessageState>}\n */\n@observer\nclass OrderTemplateLines extends React.Component, IOrderTemplateLineActionMessageState> {\n private readonly className: string;\n\n private readonly telemetryContent?: ITelemetryContent;\n\n @observable\n private _viewport: GridSize;\n\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n constructor(props: IOrderTemplateProps, state: IOrderTemplateLineActionMessageState) {\n super(props);\n this.className = 'ms-order-template';\n this._viewport =\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._updateViewport = this._updateViewport.bind(this);\n\n this.state = {\n itemKey: '',\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: false,\n isConfirmAddSelectionToBagModalOpen: false,\n productSelection: [],\n isDetailsDisplayed: false,\n isQuantityDisabledForUpdate: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n\n if (MsDyn365.isBrowser && !this.props.context.request.user.isAuthenticated && !this.props.context.request.params.isEditor) {\n window.location.assign(this.props.context.request.user.signInUrl || '/');\n }\n }\n\n @action\n public async componentDidMount(): Promise {\n this.setState({});\n const orderTemplate = await this.props.data.orderTemplate;\n this.props.config.heading!.text = orderTemplate?.productList.Name || '';\n this.setState({\n productSelection: orderTemplate?.orderTemplateLines as IOrderTemplateLineViewModel[]\n });\n\n if (MsDyn365.isBrowser) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public shouldComponentUpdate(\n nextProps: IOrderTemplateProps,\n nextState: IOrderTemplateLineActionMessageState\n ): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { heading, className } = this.props.config;\n const { emptyOrderTemplateLinesText, errorGettingOrderTemplateLines } = this.props.resources;\n const { orderTemplate, cart } = this.props.data;\n\n if (cart.status === 'LOADING' || ObjectExtensions.isNullOrUndefined(orderTemplate) || orderTemplate.status === 'LOADING') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(this.className, className)\n },\n status: 'LOADING',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n return this.props.renderView(errorProps);\n }\n\n if (cart.status === 'FAILED' || orderTemplate.status === 'FAILED') {\n const errorProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'FAILED',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources\n };\n\n return this.props.renderView(errorProps);\n }\n\n const orderTemplateResult = orderTemplate && orderTemplate.result;\n const orderTemplateLines = orderTemplateResult && orderTemplateResult.orderTemplateLines;\n\n if (!orderTemplateResult || !orderTemplateLines || orderTemplateLines.length === 0) {\n if (orderTemplateResult && !this._isFirstPage() && MsDyn365.isBrowser) {\n window.location.href = this._getOrderTemplatePageUrl();\n return null;\n }\n\n const emptyViewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'EMPTY',\n statusMessage: ,\n heading: heading && ,\n resources: this.props.resources,\n orderActions:\n orderTemplateResult &&\n this._renderOrderTemplateActions(orderTemplateResult, this._isChannelMultipleCatalogsFeatureEnabled()),\n bulkOrderLineActions: orderTemplateResult && this._getOrderTemplateLineActions(orderTemplateResult.productList.Id),\n OrderTemplateActions: {\n className: `${this.className}-action-bar`,\n tag: 'div'\n }\n };\n\n return this.props.renderView(emptyViewProps);\n }\n\n const viewProps: IOrderTemplateViewProps = {\n ...(this.props as IOrderTemplateProps),\n OrderTemplateLines: {\n moduleProps: this.props,\n className: classnames(`${this.className}`, className)\n },\n status: 'SUCCESS',\n productsStatusMessage: this.state.isOpen && (\n
\n \n {this.state.userMessage}\n \n
\n ),\n heading: heading && ,\n OrderTemplateActions: {\n className: `${this.className}-action-bar`,\n tag: 'div'\n },\n ProductsTable: {\n className: `${this.className}__table`,\n tag: 'table',\n role: 'grid'\n },\n ProductsTableRow: {\n className: `${this.className}-table-line`,\n tag: 'tr'\n },\n ProductsTableHeading: this._renderProductListHeader(this.props.resources),\n ProductDetails: {\n className: `${this.className}-table-line__link`,\n tag: 'a'\n },\n orderLines: this._renderProductList(),\n callbacks: { updateQuantity: debounce(this._changeQuantity, 2000) },\n orderActions: this._renderOrderTemplateActions(orderTemplateResult, this._isChannelMultipleCatalogsFeatureEnabled()),\n pagination: this._renderPagination(),\n itemAddedToCartDialog: this._renderItemAddedToCartDialog(),\n bulkOrderLineActions: this._getOrderTemplateLineActions(orderTemplateResult.productList.Id),\n isDetailsDisplayed: this.state.isDetailsDisplayed,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed,\n detailedProductView: this.state.detailedProductView,\n isMobile: this.isMobile\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public onSelect(line: IOrderTemplateLineViewModel, isChecked: boolean): void {\n line.isChecked = isChecked;\n\n const updated =\n this.state.productSelection.map(product => {\n if (product.fullProduct?.ProductDetails.ItemId === line.fullProduct?.ProductDetails.ItemId) {\n line.isChecked = isChecked;\n }\n return product;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n public onSelectAll(isChecked: boolean): void {\n const updated =\n this.state.productSelection.map(line => {\n line.isChecked = isChecked;\n return line;\n }) || [];\n\n this.setState({\n productSelection: updated\n });\n }\n\n private _renderProductListHeader(resources: IOrderTemplateResources): React.ReactNode {\n const {\n productImage,\n productNumberText,\n productText,\n productUnitPriceText,\n productUOMText,\n productQuantityText,\n productActionsText,\n selectAllRowsText,\n productLineCatalogName\n } = resources;\n const headers: IOrderTemplateTableHeadingProps = {\n productImage: productImage,\n productNumber: productNumberText,\n productName: productText,\n productUnitPrice: productUnitPriceText,\n productUOM: productUOMText,\n productQuantity: productQuantityText,\n productActions: productActionsText,\n selectAllRowsText,\n lines: this.state.productSelection,\n isMobile: this.isMobile,\n clickHandler: (isChecked: boolean) => {\n this.onSelectAll(isChecked);\n },\n isMultipleCatalogFeatureEnabledInHq: this._isChannelMultipleCatalogsFeatureEnabled(),\n productLineCatalogName: productLineCatalogName\n };\n\n return ;\n }\n\n private _getOrderTemplateLineActions(orderTemplateId: string): React.ReactNode {\n return (\n line.isChecked)}\n onAddSelectionToBag={this._onAddSelectionToBag}\n onRemoveSelection={this._onRemoveSelection}\n isMinifiedView={this.isMobile}\n isMultipleCatalogFeatureEnabledInHq={this._isChannelMultipleCatalogsFeatureEnabled()}\n telemetryContent={this.telemetryContent}\n />\n );\n }\n\n private _generateLinesAddedToCartDialogResources(): ILinesAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n linesAddedToCartHeaderItemsOneText: this.props.resources.linesAddedToCartHeaderItemsOneText,\n linesAddedToCartHeaderLinesOneText: this.props.resources.linesAddedToCartHeaderLinesOneText,\n linesAddedToCartHeaderLinesFormatText: this.props.resources.linesAddedToCartHeaderLinesFormatText,\n linesAddedToCartHeaderMessageText: this.props.resources.linesAddedToCartHeaderMessageText\n };\n }\n\n private _generateItemAddedToCartDialogResources(): IItemAddedToCartDialogResources {\n return {\n viewCartButtonText: this.props.resources.viewCartButtonText,\n orderTemplateCloseButtonText: this.props.resources.orderTemplateCloseButtonText,\n itemAddedToCartHeaderItemOneText: this.props.resources.itemAddedToCartHeaderItemOneText,\n itemAddedToCartHeaderItemFormatText: this.props.resources.itemAddedToCartHeaderItemFormatText,\n itemAddedToCartHeaderMessageText: this.props.resources.itemAddedToCartHeaderMessageText,\n freePriceText: this.props.resources.freePriceText,\n originalPriceText: this.props.resources.originalPriceText,\n currentPriceText: this.props.resources.currentPriceText\n };\n }\n\n private readonly _isChannelMultipleCatalogsFeatureEnabled = (): boolean => {\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (this.props.data.featureState) {\n isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState.result?.find(\n feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n return isMultipleCatalogFeatureEnabledInHq;\n };\n\n private readonly _onRemoveSelection = (): void => {\n const { context, resources } = this.props;\n const { telemetry } = context;\n const { removeSelectedFailureMessage, removeSelectedSuccessMessage } = resources;\n const lines = this.state.productSelection;\n const productListLines = lines && lines.length && lines.filter(line => line.isChecked).map(line => line.productListLine);\n\n if (productListLines && productListLines.length > 0) {\n const productListId = productListLines[0].ProductListId;\n\n const maxWaitTimeInMilliSeconds: number = 1000;\n removeProductListLinesAsync({ callerContext: context.actionContext }, productListId!, productListLines)\n .then(async () => {\n this.setState({\n userMessage: removeSelectedSuccessMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n // eslint-disable-next-line no-promise-executor-return -- fix\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n this.setState({\n userMessage: removeSelectedFailureMessage,\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: true\n });\n });\n }\n };\n\n private readonly _getOrderTemplatePageUrl = (): string => {\n let url = getUrlSync('ordertemplate', this.props.context.actionContext) || '';\n url = url.includes('?') ? url.substr(0, url.indexOf('?')) : url;\n if (this.props.data.orderTemplate?.result?.productList.Id) {\n return `${url}?id=${this.props.data.orderTemplate.result.productList.Id}`;\n }\n return '';\n };\n\n private readonly _onAddSelectionToBag = async (): Promise => {\n const lines = this.state.productSelection;\n const selectedLines = lines.filter(line => line.isChecked);\n if (selectedLines.length > 0) {\n for (const productLine of selectedLines) {\n const itemKey = productLine.fullProduct?.ProductDetails.ItemId ?? '';\n const product = productLine.fullProduct?.ProductDetails ?? {\n RecordId: 0,\n ProductTypeValue: 0,\n BasePrice: 0,\n Price: 0,\n AdjustedPrice: 0\n };\n const quantity = productLine.productListLine.Quantity ?? 0;\n if (this._isChannelMultipleCatalogsFeatureEnabled()) {\n const catalogId = productLine.productListLine.CatalogId;\n await this._addItemToBag(product, quantity, itemKey, catalogId);\n } else {\n await this._addItemToBag(product, quantity, itemKey);\n }\n }\n }\n return Promise.resolve(void 0);\n };\n\n private _renderOrderTemplateActions(\n orderTemplate: OrderTemplate,\n isMultipleCatalogFeatureEnabledInHq: boolean\n ): IOrderTemplateActionsViewProps {\n const { id, typeName, context, resources } = this.props;\n const {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n closeWindowButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n orderTemplateErrorMessage\n } = resources;\n\n const orderTemplateActions: IOrderTemplateActionsProps = {\n data: { orderTemplate },\n id,\n typeName,\n context,\n telemetryContent: this.telemetryContent,\n handlers: {\n onRenameTemplate: this._renameTemplate,\n onRemoveTemplate: this._removeTemplate\n },\n isMultipleCatalogFeatureEnabledInHq,\n renameOrderTemplateDialogStrings: this._generateOrderTemplateNameDialogResources(resources),\n resources: {\n addTemplateToBagButtonText,\n renameTemplateButtonText,\n deleteTemplateButtonText,\n addToCartFailureMessage,\n addToCartSuccessMessage,\n addToCartProcessMessage,\n closeWindowButtonText,\n orderTemplateErrorMessage,\n linesAddedToCartDialogResources: this._generateLinesAddedToCartDialogResources()\n }\n };\n\n return OrderTemplateActionsView(orderTemplateActions);\n }\n\n private _generateOrderTemplateNameDialogResources(resources: IOrderTemplateResources): IOrderTemplateNameDialogResources {\n return {\n orderTemplateHeaderLabel: resources.renameOrderTemplateTitleText,\n orderTemplateTitleLabel: resources.orderTemplateTitle,\n orderTemplateNameAriaLabel: resources.orderTemplateTitle,\n orderTemplateDescription: '',\n defaultOrderTemplateName: resources.defaultOrderTemplateName,\n orderTemplateButtonLabel: resources.renameOrderTemplateButtonText,\n orderTemplateCancelButtonLabel: resources.cancelBtnLabel\n };\n }\n\n private readonly _getCurrentUrl = (reqContext: IRequestContext): URL => {\n if (MsDyn365.isBrowser) {\n return new URL(window.location.href);\n }\n return new URL(reqContext.url.requestUrl.href);\n };\n\n /**\n * On close handler.\n */\n private readonly onCloseHandler = () => {\n this.setState({\n itemKey: this.state.itemKey,\n userMessage: this.state.userMessage,\n statusCssString: this.state.statusCssString,\n messageGlyph: this.state.messageGlyph,\n isOpen: this.state.isOpen,\n isItemAddedToOrderTemplateOpen: false\n });\n };\n\n private readonly _renderItemAddedToCartDialog = (): React.ReactNode | null => {\n if (!this.state.itemAddedToCartDialogData) {\n return null;\n }\n const isMultipleCatalogFeatureEnabledInHq =\n this.props.data.featureState?.result?.find(feature => feature.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature')\n ?.IsEnabled || false;\n\n return (\n \n );\n };\n\n private _isFirstPage(): boolean {\n return this._getCurrentPageNumber() === 0;\n }\n\n private _getCurrentPageNumber(): number {\n const itemsPerPage = this.props.config.itemsPerPage || 50;\n return (this.props.context.request.query && +this.props.context.request.query.skip / itemsPerPage) || 0;\n }\n\n private readonly _renderPagination = (): React.ReactNode | null => {\n const { config, context, data, resources } = this.props;\n const orderTemplate = data && data.orderTemplate && data.orderTemplate.result;\n if (!orderTemplate) {\n return null;\n }\n\n const fullUrl = this._getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 50;\n const currentPageNumber = this._getCurrentPageNumber();\n const skipCount = currentPageNumber * itemsPerPage;\n const totalItems = orderTemplate && orderTemplate.totalLines;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n\n return (\n \n );\n };\n\n private _renderProductList(): IOrderTemplateLineViewProps[] {\n const {\n selectOneRowText,\n moreButtonText,\n viewProductDetailsText,\n priceFree,\n originalPriceText,\n currentPriceText,\n addOrderTemplateItemToBagButtonText,\n removeItemFromOrderTemplateButtonText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n inputQuantityAriaLabel,\n deleteButtonText,\n incrementButtonAriaLabel,\n decrementButtonAriaLabel,\n unavailableProductErrorMessage,\n outOfStockProductErrorMessage\n } = this.props.resources;\n\n const { context, telemetry, data } = this.props;\n const { catalogs } = data;\n const { imageSettings } = this.props.config;\n\n return this.state.productSelection.map((line, index) => {\n const currentProductProps: IOrderTemplateLineProps = {\n orderTemplateLine: line,\n productListLine: line.productListLine,\n price: line.fullProduct?.ProductPrice,\n error: line.error,\n shouldDisable: line.shouldDisable,\n context,\n isQuantityDisabledForUpdate: this.state.isQuantityDisabledForUpdate,\n productUrl: line.fullProduct\n ? this._updateProductUrlCatalog(line.fullProduct.ProductDetails, context, line.productListLine.CatalogId)\n : '',\n imageSettings,\n telemetry,\n moduleId: this.props.id,\n moduleTypeName: this.props.typeName,\n quantity: line.productListLine.Quantity!,\n handlers: {\n onAddToBag: this._addItemToBag,\n onRemoveItem: this._removeItemFromOrderTemplateLines,\n onChangeQuantity: this._changeQuantity,\n onSelect: this.onSelect.bind(this)\n },\n resources: {\n selectOneRowText,\n moreButtonText,\n viewProductDetailsText,\n productDimensionTypeColor,\n productDimensionTypeSize,\n productDimensionTypeStyle,\n freePriceText: priceFree,\n originalPriceText,\n currentPriceText,\n inputQuantityAriaLabel,\n removeFromOrderTemplateLinesText: removeItemFromOrderTemplateButtonText,\n addToBagButtonText: addOrderTemplateItemToBagButtonText,\n deleteButtonText,\n incrementButtonAriaLabel,\n decrementButtonAriaLabel,\n unavailableProductErrorMessage,\n outOfStockProductErrorMessage\n },\n index,\n isMobile: this.isMobile,\n toggleDetailsDisplayed: this._toggleDetailsDisplayed,\n isMultipleCatalogFeatureEnabledInHq: this._isChannelMultipleCatalogsFeatureEnabled(),\n catalogs: catalogs && catalogs.result\n };\n\n return OrderTemplateLineView(currentProductProps)!;\n });\n }\n\n private readonly _toggleDetailsDisplayed = (props: IOrderTemplateLineProps): void => {\n let state = {\n isDetailsDisplayed: !this.state.isDetailsDisplayed\n };\n if (props) {\n state = {\n ...state,\n ...{\n detailedProductView: OrderTemplateMobileLineView(props)\n }\n };\n }\n this.setState(state);\n };\n\n // This method is used to update the product url with the catalogId\n private readonly _updateProductUrlCatalog = (\n productDetails: SimpleProduct,\n context: ICoreContext,\n catalogId: number | undefined\n ): string => {\n const productUrl = getProductUrlSync(productDetails, context.actionContext, undefined);\n if (!StringExtensions.isNullOrWhitespace(productUrl) && catalogId !== undefined) {\n const absoluteUrl = new URL(productUrl, window.location.href);\n absoluteUrl.searchParams.set('catalogid', `${catalogId ?? 0}`);\n return absoluteUrl.href;\n }\n\n return productUrl;\n };\n\n // Dismiss alert when addingToCart/removeItem\n private readonly _onDismiss = () => {\n this.setState({\n isOpen: false\n });\n };\n\n private readonly _changeQuantity = async (itemKey: string, quantity: number, props?: IOrderTemplateLineProps) => {\n const { context, data, telemetry, config, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context) {\n if (orderTemplate?.result) {\n const orderTemplateLinesData = orderTemplate.result.orderTemplateLines;\n if (orderTemplateLinesData) {\n const orderLineIndex = orderTemplateLinesData.findIndex(\n (lines: OrderTemplateLine) => lines.productListLine.LineId === itemKey\n );\n const newProductListLine = { ...orderTemplateLinesData[orderLineIndex] };\n if (orderTemplateLinesData[orderLineIndex].productListLine.Quantity === quantity) {\n return;\n }\n const prevQuantity = newProductListLine.productListLine.Quantity;\n newProductListLine.productListLine.Quantity = quantity;\n const { fullProduct, ...line } = newProductListLine;\n\n // Update mobile modal\n if (props) {\n props.quantity = quantity;\n this.setState({\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n }\n\n this.setState({\n isQuantityDisabledForUpdate: true\n });\n\n updateProductListLinesAsync({ callerContext: context.actionContext }, orderTemplate.result.productList.Id, [\n line.productListLine\n ])\n .then(list => {\n this.setState({\n itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isQuantityDisabledForUpdate: false,\n isOpen: false\n });\n if (list) {\n const newLine = list.find(lines => lines.LineId === itemKey);\n orderTemplateLinesData[orderLineIndex].productListLine = newLine!;\n const updatedLines = [...orderTemplateLinesData];\n updatedLines[orderLineIndex] = { fullProduct, productListLine: newLine! };\n const updatedOrderTemplate = { ...orderTemplate.result, ProductListLines: updatedLines };\n context.actionContext.update(\n new ActiveOrderTemplateLinesInput(context.actionContext.requestContext, config),\n updatedOrderTemplate\n );\n }\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable to update product quantity.');\n telemetry.error(error);\n const userMessage = resources.editOrderTemplateLineQuantityError;\n if (props) {\n props && (props.productListLine.Quantity = prevQuantity);\n this.setState({\n itemKey,\n userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isQuantityDisabledForUpdate: false,\n isOpen: true,\n detailedProductView: OrderTemplateMobileLineView(props)\n });\n } else {\n newProductListLine.productListLine.Quantity = prevQuantity;\n this.setState({\n itemKey,\n userMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isQuantityDisabledForUpdate: false,\n isOpen: true\n });\n }\n });\n }\n }\n }\n };\n\n private readonly _addItemToBag = async (\n product: SimpleProduct,\n quantity: number,\n itemKey: string,\n catalogId?: number | undefined\n ): Promise => {\n const { context, data, resources, telemetry } = this.props;\n const { cart } = data;\n const { maxQuantityLimitText, addedToCartFailureMessage } = resources;\n\n if (context) {\n if (cart.result) {\n const addProductToCartInput = {\n product,\n count: quantity,\n catalogId\n };\n\n await cart.result\n .addProductToCart(addProductToCartInput)\n .then((result: ICartActionResult) => {\n if (result.status === 'SUCCESS') {\n return getPriceForSelectedVariant(\n new PriceForSelectedVariantInput(\n product.RecordId,\n this.props.context.actionContext.requestContext.apiSettings.channelId,\n product\n ),\n this.props.context.actionContext\n ).then(priceResult => {\n if (!priceResult) {\n return AsyncResult.reject('Failed to retrieve product price');\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\n const isMiniCart = context.app.config.addToCartBehavior === 'showMiniCart';\n this.setState({\n itemKey,\n userMessage: '',\n statusCssString: 'success',\n messageGlyph: 'fas fa-check',\n isOpen: false,\n isItemAddedToOrderTemplateOpen: !isMiniCart,\n itemAddedToCartDialogData: {\n product,\n productPrice: priceResult,\n quantity\n },\n isDetailsDisplayed: false\n });\n return AsyncResult.resolve();\n });\n } else {\n switch (result.substatus) {\n case 'MAXQUANTITY':\n if (context.app.config.maxQuantityForCartLineItem) {\n const cartLineQuantity: number | undefined =\n cart.result?.cart.CartLines &&\n cart.result?.cart.CartLines.find(result => result.ProductId === product.RecordId)?.Quantity;\n const defaultMessage = `You can only add ${context.app.config.maxQuantityForCartLineItem} of this item to your shopping bag`;\n this.setState({\n itemKey,\n userMessage:\n cartLineQuantity !== undefined\n ? maxQuantityLimitText\n .replace('{curQuantity}', cartLineQuantity.toString())\n .replace(\n '{maxQuantity}',\n context.app.config.maxQuantityForCartLineItem.toString()\n ) || defaultMessage\n : defaultMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n } else {\n const defaultMessage = `Max quantity for cart line item is undefined. Please define in configuration settings.`;\n this.setState({\n itemKey,\n userMessage: defaultMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n case 'INVOICEINCART': {\n this.setState({\n itemKey,\n userMessage: result.errorDetails?.LocalizedMessage || addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n default:\n telemetry.debug('[order-template-lines] Unable to Update Cart Line from the order template lines');\n this.setState({\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n return AsyncResult.resolve();\n }\n }\n })\n .catch((error: Error) => {\n telemetry.warning(error.message);\n telemetry.debug('[order-template-lines] Error trying to Update Cart Line from the order template lines');\n if (StringExtensions.isNullOrWhitespace(error.message)) {\n this.setState({\n itemKey,\n userMessage: error.message,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n } else {\n this.setState({\n itemKey,\n userMessage: addedToCartFailureMessage,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n }\n });\n }\n }\n };\n\n private readonly _removeItemFromOrderTemplateLines = async (line: IOrderTemplateLineViewModel) => {\n const { context, data, telemetry } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const maxWaitTimeInMilliSeconds: number = 1000;\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate?.result && line) {\n const featureStates = await getFeatureState(createGetFeatureStateInput(context.actionContext), context.actionContext);\n let isMultipleCatalogFeatureEnabledInHq = false;\n if (ArrayExtensions.hasElements(featureStates)) {\n isMultipleCatalogFeatureEnabledInHq =\n featureStates.find(\n (featureState: FeatureState) => featureState.Name === 'Dynamics.AX.Application.ChannelMultipleCatalogsFeature'\n )?.IsEnabled || false;\n }\n const catalogId = getCatalogId(context.actionContext.requestContext);\n if (isMultipleCatalogFeatureEnabledInHq) {\n line.productListLine.CatalogId = catalogId;\n }\n removeProductListLinesAsync({ callerContext: context.actionContext }, line.productListLine.ProductListId!, [\n line.productListLine\n ])\n .then(async () => {\n // eslint-disable-next-line no-promise-executor-return -- fix\n await new Promise(resolve => setTimeout(resolve, maxWaitTimeInMilliSeconds));\n window.location.reload();\n })\n .catch(error => {\n telemetry.warning('[order-template-lines] Unable remove items from the order template lines');\n telemetry.error(error);\n });\n } else {\n telemetry.warning(\n '[order-template-lines] Unable remove items from the order template lines user token or lineItemID was not found'\n );\n }\n }\n };\n\n private readonly _renameTemplate = async (_template: ProductList): Promise => {\n window.location.reload();\n return Promise.resolve();\n };\n\n private readonly _removeTemplate = () => {\n const { context, data, telemetry, resources } = this.props;\n const { orderTemplate } = data;\n\n if (context && context.actionContext) {\n const userToken = context.request.user.isAuthenticated && context.request.user.token;\n if (userToken && orderTemplate && orderTemplate.result) {\n deleteAsync({ callerContext: context.actionContext }, orderTemplate.result.productList)\n .then()\n .catch((error: string) => {\n telemetry.warning('[order-template] Unable to delete order template.');\n telemetry.error(error);\n this.setState({\n itemKey: orderTemplate.result?.productList.Id || '',\n userMessage: resources.deleteOrderTemplateFailedText,\n statusCssString: 'danger',\n messageGlyph: 'fas fa-exclamation-triangle',\n isOpen: true\n });\n });\n const newLink = getUrlSync('ordertemplatelist', this.props.context.actionContext);\n if (newLink) {\n window.location.assign(newLink);\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template. Order template was not found');\n }\n } else {\n telemetry.warning('[order-template] Failed to delete order template.');\n }\n };\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n }\n\n private readonly _getViewport = (): GridSize => {\n const { context } = this.props;\n\n // Always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n }\n return 'xl';\n }\n }\n\n return 'xs';\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n
\n
\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n
\n {paginationNextText}\n
\n );\n };\n}\n\nexport default OrderTemplateLines;\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 ProductPriceForSelectedProductsInput,\n validateCatalogId,\n getProductPriceForSelectedProducts\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 {\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 productPrices: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * ProductCollection component.\n */\nclass ProductCollection extends React.PureComponent, IProductComponentState> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n constructor(props: IProductCollectionProps) {\n super(props);\n this.productPrices = [];\n this.state = {\n products: this.props.config.productCollection.products || [],\n productPrices: this.productPrices || []\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 {\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 const discountIds = this.props.config.productCollection.discountIds;\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 productPrices = this.state.productPrices;\n\n const isCarousel = this.props.config.layout === layout.carousel;\n const headingLabel = heading ? heading.text : '';\n const headingComponent = heading && (\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(\n item,\n index,\n productPrices ? productPrices.find(p => p.ProductId === item.RecordId) : undefined\n );\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,\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 || discountIds) &&\n shouldDisplaySeeAllButton &&\n (ArrayExtensions.hasElements(updatedProducts) || this.props.config.productCollection.listType === 'promotional')\n ? this._getSeeAllButton(headingLabel, recommendation, discountIds)\n : undefined,\n resources: resources\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 => {\n const context = this.props.context as ICoreContext;\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,\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 let productPrices = this.state.productPrices;\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 if (this.props.config.productCollection.listType === 'promotional') {\n productPrices = await getProductPriceForSelectedProducts(\n new ProductPriceForSelectedProductsInput(products.filter(p => !p.IsMasterProduct).map(p => p.RecordId)),\n this.props.context.actionContext\n );\n\n this.setState({ productPrices: productPrices });\n }\n };\n\n private readonly _getProduct = (\n product: ProductSearchResult,\n index: number,\n productPrice?: ProductPrice\n ): 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 \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 => {\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 headingLabel - Heading label.\n * @param recommendation - Recommendation.\n * @param discountIds - Discount Ids.\n * @returns IProductComponentSeeAllViewProps - Product component see all view props.\n */\n private readonly _getSeeAllButton = (headingLabel: string, recommendation?: string, discountIds?: string[]): React.ReactNode => {\n if (!Msdyn365.msdyn365Commerce.isBrowser) {\n return null;\n }\n\n if (!recommendation && !discountIds) {\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\n if (discountIds) {\n // see all button for promotion page\n url.searchParams.set('discountIds', discountIds.toString());\n url.searchParams.set('title', headingLabel);\n url.searchParams.set('catalogid', `${catalogId}`);\n } else if (recommendation) {\n // See all button for recommendation\n url.searchParams.set('recommendation', recommendation);\n url.searchParams.set('title', headingLabel);\n url.searchParams.set('catalogid', `${catalogId}`);\n }\n\n return (\n \n {this.props.resources.seeAllButtonText}\n \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 { observable } from 'mobx';\n\n/**\n * State information related to what is needed to succesfully perform a autosuggest.\n */\nexport class SearchState {\n @observable public searchText?: string;\n\n @observable public defaultBasicSearchUrl?: string;\n\n @observable public searchQueryStringParameter?: string;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICreateActionContext\n} from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n ChannelInventoryConfiguration,\n ProductRefinerSource,\n ProductRefinerValue,\n ProductSearchCriteria,\n SearchSuggestion,\n SearchSuggestionCriteria\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n getInventoryConfigurationAsync,\n getSearchSuggestionsAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\n\nexport enum SuggestionType {\n Category = 'ScopedCategory',\n Keyword = 'Keyword',\n Product = 'Product',\n None = 'None'\n}\n\n/**\n * This setting defines inventory filtering options.\n */\nexport enum ProductListInventoryFilteringOptions {\n /**\n * Filter out all products out of stock.\n */\n HideOOS = 'hideOOS',\n\n /**\n * Sort products by availability, OOS goes last.\n */\n SortOOS = 'sortOOS',\n\n /**\n * No filtering selected.\n */\n Default = 'default'\n}\n\n/**\n * Input class for auto suggest search input.\n */\nexport class AutoSuggestInput implements IActionInput {\n public searchQuery?: string;\n\n public topResultsCount?: number;\n\n public suggestionType?: string;\n\n public hitPrefix?: string;\n\n public hitSuffix?: string;\n\n public constructor(searchText?: string, top?: number, suggestionType?: string, hitPrefix?: string, hitSuffix?: string) {\n this.searchQuery = searchText;\n this.topResultsCount = top;\n this.suggestionType = suggestionType;\n this.hitPrefix = hitPrefix;\n this.hitSuffix = hitSuffix;\n }\n\n public getCacheKey = () => 'AutoSuggestSearchSuggestions';\n\n public getCacheObjectType = () => 'AutoSuggestSearchSuggestions';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new AutoSuggestInput();\n};\n\n/**\n * Calls the Retail API and returns a auto-suggest suggestions.\n * @param input\n * @param ctx\n */\nexport async function getSearchSuggestionsAction(input: AutoSuggestInput, ctx: IActionContext): Promise {\n // If no input is provided fail out\n if (!input || !input.searchQuery) {\n throw new Error('[getSearchSuggestionsAction]No valid Input was provided, failing');\n }\n\n const autosuggest: Autosuggestions = {};\n\n const autoSuggestPromises = [_getAutoSuggest(input, autosuggest, ctx)];\n return Promise.all(autoSuggestPromises).then(() => {\n return autosuggest;\n });\n}\n\n/**\n * Returns inventory in stock sortable refiner value.\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\n * @param isInStock - The flag indicating whether is getting in-stock refiner or out-of-stock refiner.\n * @returns Refiners.\n */\nconst getInventorySortableRefinerValue = (\n channelInventoryConfiguration: ChannelInventoryConfiguration,\n isInStock: boolean\n): ProductRefinerValue | undefined => {\n if (channelInventoryConfiguration && channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId) {\n return {\n RefinerRecordId: channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId,\n DataTypeValue: AttributeDataType.TrueFalse,\n LeftValueBoundString: isInStock ? 'true' : 'false',\n RightValueBoundString: isInStock ? 'true' : 'false',\n UnitText: '',\n RowNumber: 0,\n Count: 0,\n ExtensionProperties: [],\n RefinerSourceValue: ProductRefinerSource.Attribute\n };\n }\n return undefined;\n};\n\nasync function _getAutoSuggest(input: AutoSuggestInput, autosuggest: Autosuggestions, ctx: IActionContext): Promise {\n const catalogId = getCatalogId(ctx.requestContext);\n let productSearchCriteria: ProductSearchCriteria = {\n SearchCondition: input.searchQuery && input.searchQuery.length > 0 ? input.searchQuery : '',\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n };\n\n if (ctx.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: ctx });\n const isInStockRefiner = true;\n const inventoryRefinerValue = getInventorySortableRefinerValue(channelInventoryConfiguration, isInStockRefiner);\n\n if (inventoryRefinerValue) {\n productSearchCriteria = {\n ...productSearchCriteria,\n Refinement: [inventoryRefinerValue]\n };\n }\n }\n\n const searchCriteria: SearchSuggestionCriteria = {\n ProductSearchCriteria: productSearchCriteria,\n HitPrefix: input.hitPrefix,\n HitSuffix: input.hitSuffix,\n SuggestionType: input.suggestionType\n };\n\n const searchSuggestions = await getSearchSuggestionsAsync(\n { callerContext: ctx, queryResultSettings: { Paging: { Top: input.topResultsCount } } },\n searchCriteria\n );\n\n if (searchSuggestions && searchSuggestions.length > 0) {\n // Generate image url\n searchSuggestions.map(\n (item: SearchSuggestion) =>\n (item.ImageUrl = item.ImageUrl ? generateImageUrl(item.ImageUrl, ctx.requestContext.apiSettings) : '')\n );\n\n autosuggest.AllSearchResults = searchSuggestions;\n } else {\n ctx.telemetry.error(\n `[getSearchSuggestionsAction] unable to get availabilites for search with suggestion type ${searchCriteria.SuggestionType}`\n );\n }\n}\n\nexport const getSearchSuggestionsActionDataAction = createObservableDataAction({\n id: '@msdyn365-commerce-modules/search/get-auto-suggest-suggestions',\n action: >getSearchSuggestionsAction,\n input: createInput\n});\n\nexport default getSearchSuggestionsActionDataAction;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { getRichTextHtml } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductRefinerValue, SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\nexport interface ISearchCategorySuggestProps {\n searchCategorySuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n searchRefiners: ProductRefiner[] | undefined;\n suggestions: SearchSuggestion[] | undefined;\n telemetryContent?: ITelemetryContent;\n shouldShowFullPath?: boolean;\n}\n\nexport interface ISearchCategoryViewProps {\n title: React.ReactNode;\n text: React.ReactNode[];\n}\n\nlet payLoad: IPayLoad;\n\n/**\n * CategorySuggestionsComponent.\n * @param props\n */\nexport const CategorySuggestionsComponent = (props: ISearchCategorySuggestProps): ISearchCategoryViewProps | undefined => {\n const {\n suggestions,\n searchText,\n autoSuggestProps: {\n resources: { categorySuggestionHeading }\n }\n } = props;\n\n const reactNodes: React.ReactNode[] = [];\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, props));\n });\n\n const titleNode = _renderTitle(categorySuggestionHeading, searchText);\n\n return { title: titleNode, text: reactNodes };\n};\n\nconst _renderTitle = (categorySuggestionHeading: string, searchText: string) => {\n const categoryAutoSuggestionHeading = categorySuggestionHeading\n ? format(categorySuggestionHeading, searchText)\n : `Search \"${searchText}\" in categories`;\n\n return
  • {categoryAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (item: SearchSuggestion, props: ISearchCategorySuggestProps) => {\n const { searchText, hitPrefix, hitSuffix, shouldShowFullPath } = props;\n\n const splitValue = shouldShowFullPath ? item.Value : item.Value && item.Value.split('|').pop();\n const ariaLabel = splitValue\n ? splitValue.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '')\n : item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n payLoad.contentAction.etext = item.Value;\n const attribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\n return (\n
  • \n \n {_generateLink(item, searchText, props) && _getHighlightedText(splitValue ? splitValue : '', hitPrefix, hitSuffix)}\n \n
  • \n );\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, searchText: string, props: ISearchCategorySuggestProps): string => {\n return suggestion && suggestion.Id ? _getCategoryLink(suggestion.Id, searchText, props) : '';\n};\n\nconst _getCategoryLink = (id: string, searchText: string, props: ISearchCategorySuggestProps): string => {\n const { searchPageURL, searchQsp, searchRefiners } = props;\n\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(searchPageURL, window.location.href);\n\n if (searchQsp && searchText) {\n queryUrl.searchParams.set(searchQsp, searchText);\n }\n\n const categoryRefiners = searchRefiners?.find(refiners => {\n return refiners.SourceValue === ProductRefinerSource.Category;\n });\n const refiner = categoryRefiners?.Values?.find(item => {\n return item.RefinerRecordId === Number.parseInt(id, 10);\n });\n\n const encodedRefiner = refiner && JSON.stringify(compressRefiners([refiner]));\n if (encodedRefiner) {\n queryUrl.searchParams.set('refiners', encodedRefiner);\n }\n\n return queryUrl.href;\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n // eslint-disable-next-line react/no-danger\n return ;\n};\n\n// TODO: This code is currently duplicated in categoryautosuggest need to either remove one of these files\n// or move this code to a common place\nconst compressedRefinerKeys = [\n 'DataTypeValue',\n 'LeftValueBoundString',\n 'RefinerRecordId',\n 'RefinerSourceValue',\n 'RightValueBoundString',\n 'UnitText'\n];\n\n/**\n * Compressed a list of refiners for use in URLs.\n * @param refiners The uncompressed refiners.\n */\nconst compressRefiners = (refiners: ProductRefinerValue[]) => {\n const compressedRefiners: (string | number)[][] = [];\n\n refiners.forEach(refiner => {\n const compressedRefiner: (string | number)[] = [];\n compressedRefinerKeys.forEach(refinerKey => {\n compressedRefiner.push(refiner[refinerKey]);\n });\n compressedRefiners.push(compressedRefiner);\n });\n\n return compressedRefiners;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface ISearchFormProps {\n hideSearchLabel: boolean | undefined;\n isSearchFormExpanded?: boolean | undefined;\n disableSubmitSearch: boolean | undefined;\n searchTextInput: React.RefObject;\n maxChars: number;\n searchQsp: string;\n searchPlaceholder: string;\n query: string;\n ariaLabelCancel: string;\n ariaLabelSearch: string;\n ariaLabelSubmit: string;\n handleCancelSearchChange(): void;\n handleInputChange(query: string): void;\n}\n\nexport interface ISearchFormViewProps {\n input: React.ReactNode;\n submitBtn: React.ReactNode;\n cancelBtn: React.ReactNode;\n}\n\n/**\n * On Input Change functionality.\n * @param handleInputChange -Input change function.\n * @returns Set updated input value.\n */\nconst onInputChangeFunction = (handleInputChange: (query: string) => void) => (event: React.ChangeEvent) => {\n handleInputChange(event.target.value || '');\n};\nexport const FormComponent = (props: ISearchFormProps): ISearchFormViewProps => {\n const {\n searchQsp,\n searchPlaceholder,\n hideSearchLabel,\n searchTextInput,\n handleInputChange,\n maxChars,\n disableSubmitSearch,\n handleCancelSearchChange,\n query,\n ariaLabelCancel,\n ariaLabelSearch,\n ariaLabelSubmit\n } = props;\n\n const onInputChange = onInputChangeFunction(handleInputChange);\n\n const inputNode = !hideSearchLabel ? (\n \n ) : (\n \n );\n\n const submitBtnNode = !disableSubmitSearch && \n
    \n );\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { getRichTextHtml, IActionContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { SearchSuggestion } from '@msdyn365-commerce/retail-proxy';\nimport { getProductPageUrlSync, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n INodeProps,\n IPayLoad,\n ITelemetryContent,\n NodeTag\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchData } from '../search.data';\nimport { ISearchProps } from '../search.props.autogenerated';\n\n/**\n * Search product suggest resources.\n */\nexport interface ISearchProductSuggestResources {\n freePriceText: string;\n}\n\nexport interface ISearchProductSuggestProps {\n searchProductSuggestClass: string;\n searchPageURL: string;\n searchQsp: string | undefined;\n hitPrefix: string;\n hitSuffix: string;\n autoSuggestProps: ISearchProps;\n searchText: string;\n suggestions: SearchSuggestion[] | undefined;\n telemetry: ITelemetry;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n resources?: ISearchProductSuggestResources;\n}\n\nexport interface ISearchProductViewProps {\n title: React.ReactNode;\n items: ISearchProductItemViewProps[];\n}\n\nexport interface ISearchProductItemViewProps {\n text: React.ReactNode;\n thumbnail: React.ReactNode;\n price: React.ReactNode;\n LiProduct: INodeProps;\n AProduct: INodeProps;\n id: string | undefined;\n}\n\nlet payLoad: IPayLoad;\nlet telemetryContent: ITelemetryContent | undefined;\n\n/**\n * ProductSuggestionsComponent.\n * @param props\n */\nexport const ProductSuggestionsComponent = (props: ISearchProductSuggestProps): ISearchProductViewProps | undefined => {\n const {\n suggestions,\n hitSuffix,\n hitPrefix,\n autoSuggestProps: {\n context: { actionContext },\n resources: { productSuggestionHeading }\n },\n moduleType,\n moduleId\n } = props;\n const reactNodes: ISearchProductItemViewProps[] = [];\n telemetryContent = props.telemetryContent;\n payLoad = getPayloadObject('click', props.telemetryContent!, '');\n\n suggestions?.map(item => {\n reactNodes.push(_assembleNode(item, hitPrefix, hitSuffix, actionContext, props, moduleType, moduleId));\n });\n\n const titleNode = _renderTitle(productSuggestionHeading);\n\n return { title: titleNode, items: reactNodes };\n};\n\nconst _renderTitle = (productSuggestionHeading: string) => {\n const productAutoSuggestionHeading = productSuggestionHeading ? productSuggestionHeading : 'Go to products';\n\n return
  • {productAutoSuggestionHeading}
  • ;\n};\n\nconst _assembleNode = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps,\n moduleType: string,\n moduleId: string\n): ISearchProductItemViewProps => {\n const altText =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n const price = item.Value3?.Value?.DecimalValue;\n return {\n text: _getHighlightedText(item.Value ? item.Value : '', hitPrefix, hitSuffix),\n thumbnail: _renderThumbnail(item, altText ? altText : '', props),\n price: !ObjectExtensions.isNullOrUndefined(price) && _renderPrice(price, price, moduleId, moduleType, props),\n LiProduct: _getLiWrapper(),\n AProduct: _getAWrapper(item, hitPrefix, hitSuffix, actionContext, props),\n id: item.Id\n };\n};\n\nconst _getLiWrapper = () => {\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'li' as NodeTag\n };\n};\n\nconst _getAWrapper = (\n item: SearchSuggestion,\n hitPrefix: string,\n hitSuffix: string,\n actionContext: IActionContext,\n props: ISearchProductSuggestProps\n) => {\n const {\n autoSuggestProps: { context }\n } = props;\n const ariaLabel =\n item.Value && item.Value.replace(new RegExp(`[${hitPrefix}]`, 'gi'), '').replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n payLoad.contentAction.recid = item.Id;\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n const productPrice = context.cultureFormatter.formatCurrency(item.Value3!.Value!.DecimalValue!);\n\n return {\n className: 'msc-autoSuggest__productResults-item',\n tag: 'a' as NodeTag,\n 'aria-label': `${ariaLabel!} ${productPrice}`,\n href: _generateLink(item, hitPrefix, hitSuffix, actionContext),\n ...attribute\n };\n};\n\nconst _generateLink = (suggestion: SearchSuggestion, hitPrefix: string, hitSuffix: string, actionContext: IActionContext) => {\n const formattedLink = (suggestion.Value as string)\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n return suggestion.Value && suggestion.Id\n ? getProductPageUrlSync(formattedLink, (suggestion.Id as unknown) as number, actionContext, undefined)\n : '';\n};\n\nconst _getHighlightedText = (suggestion: string, hitPrefix: string, hitSuffix: string): JSX.Element => {\n const formattedText = suggestion\n .replace(new RegExp(`[${hitPrefix}]`, 'gi'), '')\n .replace(new RegExp(`[${hitSuffix}]`, 'gi'), '');\n\n return (\n // eslint-disable-next-line react/no-danger\n \n );\n};\n\nconst _renderPrice = (\n adjustedPrice: number,\n basePrice: number,\n moduleId: string,\n moduleType: string,\n props: ISearchProductSuggestProps\n): JSX.Element | null => {\n const {\n autoSuggestProps: { context }\n } = props;\n\n return (\n \n );\n};\n\nconst _renderThumbnail = (suggestion: SearchSuggestion, altText: string, props: ISearchProductSuggestProps): JSX.Element | null => {\n const {\n autoSuggestProps: {\n context: {\n request: { gridSettings }\n },\n config: { imageSettings }\n }\n } = props;\n if (imageSettings) {\n imageSettings.cropFocalRegion = true;\n }\n\n if (!suggestion || !suggestion.ImageUrl) {\n props.telemetry.error('Search suggestion content is empty, module wont render.');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n lg: { q: 'w=40&h=40&m=6', w: 0, h: 0 },\n xl: { q: 'w=40&h=40&m=6', w: 0, h: 0 }\n },\n lazyload: true,\n cropFocalRegion: true\n };\n\n return (\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 { Autosuggestions } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, getUrlSync } from '@msdyn365-commerce/core';\nimport { ProductRefiner, ProductRefinerSource, ProductsDataActions } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, ObjectExtensions, Random, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\nimport { createSearchStateInput } from '@msdyn365-commerce-modules/search-utilities';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent, KeyCodes } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport { Spinner, SpinnerSize } from 'office-ui-fabric-react';\nimport * as React from 'react';\n\nimport getSearchSuggestionsAction, { AutoSuggestInput, SuggestionType } from './actions/get-auto-suggest-suggestions';\nimport {\n CategorySuggestionsComponent,\n FormComponent,\n ISearchCategoryViewProps,\n ISearchKeywordViewProps,\n ISearchProductViewProps,\n KeywordSuggestionsComponent,\n LabelComponent,\n ProductSuggestionsComponent\n} from './components';\nimport { ISearchData } from './search.data';\nimport { ISearchProps, ISuggestionTypeCriterionData, SuggestionTypeCriterionSuggestionType } from './search.props.autogenerated';\n\nexport interface ISearchState {\n isSearchFormExpanded: boolean;\n searchText: string;\n searchKeywordSuggestClass: string;\n searchProductSuggestClass: string;\n searchCategorySuggestClass: string;\n suggestions: Autosuggestions | undefined;\n searchRefiners?: ProductRefiner[] | undefined;\n autoSuggestAriaLabel: string;\n isInitialState: boolean;\n isLoadingAutoSuggest?: boolean;\n}\n\nexport interface ISearchViewProps extends ISearchProps {\n Search: IModuleProps;\n AutoSuggestAriaLabel: INodeProps;\n AutoSuggestAriaLabelText: string;\n searchText: string;\n AutoSuggest: INodeProps;\n KeywordSuggest: INodeProps;\n ProductSuggest: INodeProps;\n CategorySuggest: INodeProps;\n SearchForm: INodeProps;\n FormWrapper: INodeProps;\n UlKeyword: INodeProps;\n UlProduct: INodeProps;\n UlCategory: INodeProps;\n label: React.ReactNode;\n form: React.ReactNode;\n autosuggestKeyword?: ISearchKeywordViewProps;\n autosuggestProduct?: ISearchProductViewProps;\n autosuggestCategory?: ISearchCategoryViewProps;\n callbacks: {\n handleCancelSearchChange(): void;\n handleCancelSearchFocused?(): void;\n };\n isSearchFormExpanded: boolean;\n isLoadingAutoSuggest?: boolean;\n isLoadingNode?: React.ReactNode;\n}\n\n/**\n *\n * Search module.\n * @extends {React.Component, ISearchState>}\n */\nclass Search extends React.Component, ISearchState> {\n private readonly searchTextInput: React.RefObject;\n\n private readonly searchCollapsedLabel: React.RefObject;\n\n private readonly formReference: React.RefObject;\n\n private readonly maxChars: number;\n\n private readonly topResultsCount?: number;\n\n private readonly hitPrefix: string = '{';\n\n private readonly hitSuffix: string = '}';\n\n private readonly waitTime: number = 500;\n\n private readonly autoSuggestResultScreenReaderDiv: React.RefObject;\n\n private readonly autoSuggestResultDiv: React.RefObject;\n\n private readonly searchFormClass: string;\n\n private readonly searchLabelClass: string;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private loadSuggestionsRequestId?: string;\n\n private inputSuggestionType: ISuggestionTypeCriterionData[];\n\n // @ts-expect-error\n private cancellabelDebounce: debounce;\n\n public constructor(props: ISearchProps) {\n super(props);\n this.searchTextInput = React.createRef();\n this.searchCollapsedLabel = React.createRef();\n this.autoSuggestResultScreenReaderDiv = React.createRef();\n this.autoSuggestResultDiv = React.createRef();\n this.formReference = React.createRef();\n this.state = {\n isSearchFormExpanded: false,\n searchText: '',\n searchKeywordSuggestClass: 'ms-search__autoSuggest__keyword',\n searchProductSuggestClass: 'ms-search__autoSuggest__product',\n searchCategorySuggestClass: 'ms-search__autoSuggest__category',\n suggestions: undefined,\n searchRefiners: undefined,\n autoSuggestAriaLabel: '',\n isInitialState: true,\n isLoadingAutoSuggest: false\n };\n this.maxChars =\n (this.props.context &&\n this.props.context.app &&\n this.props.context.app.config &&\n this.props.context.app.config.searchInputMaxLength) ||\n 50;\n\n this.inputSuggestionType = [];\n this.topResultsCount = this.props.config && this.props.config.topResultsCount ? this.props.config.topResultsCount : 5;\n this.searchFormClass = 'ms-search__form';\n this.searchLabelClass = 'ms-search__label';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n\n this._initSuggestionTypes();\n }\n\n public async componentDidMount(): Promise {\n document.body && document.body.addEventListener('mousedown', this._focusOutTarget);\n window && window.addEventListener('keyup', this._keyup);\n }\n\n public componentWillUnmount(): void {\n document.body && document.body.removeEventListener('mousedown', this._focusOutTarget, false);\n window && window.removeEventListener('keyup', this._keyup, false);\n }\n\n public componentDidUpdate(): void {\n const {\n config: { hideSearchLabel }\n } = this.props;\n const { isSearchFormExpanded, isInitialState } = this.state;\n\n if (!this.props.context.request.params.isEditor) {\n if (!hideSearchLabel && isSearchFormExpanded) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else if (!isInitialState) {\n this.searchCollapsedLabel && this.searchCollapsedLabel.current && this.searchCollapsedLabel.current.focus();\n }\n }\n }\n\n public shouldComponentUpdate(nextProps: ISearchProps, nextState: ISearchState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n // eslint-disable-next-line complexity -- ignore complexity.\n public render(): JSX.Element {\n const {\n context,\n resources: { searchtext, searchLabelArialLabel, cancelBtnAriaLabel, searchBtnAriaLabel, submitBtnAriaLabel },\n config: { hideSearchLabel, disableSubmitSearch, searchplaceholderText, shouldShowFullCategoryPath, className = '' }\n } = this.props;\n\n const {\n isSearchFormExpanded,\n searchText,\n searchKeywordSuggestClass,\n searchProductSuggestClass,\n searchCategorySuggestClass,\n suggestions,\n searchRefiners,\n isLoadingAutoSuggest\n } = this.state;\n\n const searchQsp = (context && context.app && context.app.config && context.app.config.searchQueryStringParameter) || 'q';\n const searchPageURL = getUrlSync('search', context && context.actionContext) || '';\n const searchURL = this._appendQueryParams(searchPageURL, searchText, searchQsp);\n const searchPlaceholder = searchplaceholderText && searchplaceholderText.length > 0 ? searchplaceholderText : 'Search in Fabrikam';\n\n const keywordSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Keyword || suggestion.SuggestionType === SuggestionType.None\n );\n const productSuggestions = suggestions?.AllSearchResults?.filter(\n suggestion => suggestion.SuggestionType === SuggestionType.Product\n );\n const categoryRefiners = searchRefiners?.find(refiner => {\n return refiner.SourceValue === ProductRefinerSource.Category;\n });\n const categorySuggestions = suggestions?.AllSearchResults?.filter(suggestion => {\n if (suggestion.SuggestionType !== SuggestionType.Category) {\n return false;\n }\n const refiner = categoryRefiners?.Values?.find(item => {\n return `${item.RefinerRecordId ?? 0}` === suggestion.Id;\n });\n\n return !ObjectExtensions.isNullOrUndefined(refiner);\n });\n\n const viewProps: ISearchViewProps = {\n ...(this.props as ISearchProps),\n\n Search: {\n moduleProps: this.props,\n className: `${classnames('ms-search', className)} ${disableSubmitSearch ? 'no-submit' : 'with-submit'}`\n },\n AutoSuggestAriaLabel: {\n tag: 'div',\n className: 'msc-autoSuggest__screen-reader',\n 'aria-live': 'assertive',\n ref: this.autoSuggestResultScreenReaderDiv\n },\n AutoSuggestAriaLabelText: this.state.autoSuggestAriaLabel,\n searchText: this.state.searchText,\n AutoSuggest: {\n ref: this.autoSuggestResultDiv,\n className: 'ms-search__autoSuggest'\n },\n KeywordSuggest: {\n className: searchKeywordSuggestClass\n },\n ProductSuggest: {\n className: searchProductSuggestClass\n },\n CategorySuggest: {\n className: searchCategorySuggestClass\n },\n SearchForm: {\n className: `${this.searchFormClass} ${isSearchFormExpanded ? 'bx-show' : 'bx-hide'}`\n },\n FormWrapper: {\n tag: 'form',\n ref: this.formReference,\n className: 'ms-search__searchForm',\n 'aria-label': 'Search',\n name: 'searchForm',\n role: 'search',\n action: searchURL,\n autoComplete: 'off',\n onSubmit: this._handleSubmit\n },\n UlKeyword: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__keywordResults-items', className)\n },\n UlProduct: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__productResults-items', className)\n },\n UlCategory: {\n tag: 'ul',\n className: classnames('msc-autoSuggest__categoryResults-items', className)\n },\n label: LabelComponent({\n isSearchFormExpanded,\n searchLabelClass: `${this.searchLabelClass} ${isSearchFormExpanded ? 'bx-hide' : 'bx-show'}`,\n searchtext,\n searchLabelArialLabel,\n searchCollapsedLabel: this.searchCollapsedLabel,\n hideSearchLabel,\n handleCancelSearchChange: this._handleCancelSearchChange,\n telemetryContent: this.telemetryContent\n }),\n form: FormComponent({\n ariaLabelCancel: cancelBtnAriaLabel,\n ariaLabelSearch: searchBtnAriaLabel,\n ariaLabelSubmit: submitBtnAriaLabel,\n hideSearchLabel,\n searchTextInput: this.searchTextInput,\n disableSubmitSearch,\n handleInputChange: this._handleInputChange,\n handleCancelSearchChange: this._handleCancelSearchChange,\n maxChars: this.maxChars,\n searchQsp,\n searchPlaceholder,\n query: searchText\n }),\n autosuggestKeyword:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (keywordSuggestions && ArrayExtensions.hasElements(keywordSuggestions)))\n ? KeywordSuggestionsComponent({\n searchKeywordSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: keywordSuggestions,\n telemetryContent: this.telemetryContent\n })\n : undefined,\n autosuggestProduct:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (productSuggestions && ArrayExtensions.hasElements(productSuggestions)))\n ? ProductSuggestionsComponent({\n searchProductSuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: productSuggestions,\n telemetry: this.props.telemetry,\n moduleType: this.props.typeName,\n moduleId: this.props.id,\n telemetryContent: this.telemetryContent,\n resources: this.props.resources\n })\n : undefined,\n autosuggestCategory:\n searchText &&\n searchText.length > 0 &&\n (isLoadingAutoSuggest || (categorySuggestions && ArrayExtensions.hasElements(categorySuggestions)))\n ? CategorySuggestionsComponent({\n searchCategorySuggestClass,\n searchPageURL,\n searchQsp,\n hitPrefix: this.hitPrefix,\n hitSuffix: this.hitSuffix,\n autoSuggestProps: this.props,\n searchText,\n suggestions: categorySuggestions,\n searchRefiners,\n telemetryContent: this.telemetryContent,\n shouldShowFullPath: shouldShowFullCategoryPath\n })\n : undefined,\n callbacks: {\n handleCancelSearchChange: this._handleCancelSearchChange,\n handleCancelSearchFocused: this._handleCancelSearchFocused\n },\n isSearchFormExpanded: this.state.isSearchFormExpanded,\n isLoadingAutoSuggest,\n isLoadingNode: this._isLoadingNode()\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _initSuggestionTypes() {\n const suggestionTypes = this.props.config.suggestionTypeCriterion;\n\n const suggestions = ArrayExtensions.unique(ArrayExtensions.validValues(suggestionTypes));\n if (!ArrayExtensions.hasElements(suggestions)) {\n this.inputSuggestionType = [\n { SuggestionType: SuggestionTypeCriterionSuggestionType.keyword },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.product },\n { SuggestionType: SuggestionTypeCriterionSuggestionType.scopedCategory }\n ];\n return;\n }\n\n const validSuggestions = suggestions.filter(suggestion => suggestion.SuggestionType);\n if (ArrayExtensions.hasElements(validSuggestions)) {\n this.inputSuggestionType = validSuggestions;\n return;\n }\n\n this.inputSuggestionType = [];\n }\n\n /**\n * Function to create the ReactNode for loading Autosuggest result.\n * @returns ReachNode for loading Autosuggest result.\n */\n private readonly _isLoadingNode = (): React.ReactNode => {\n const loadingText = this.props.resources.autoSuggestResultLoadingMessage;\n return ;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly _focusOutTarget = (e: any): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.target.closest('.ms-search') === null) {\n this._clearAutoSuggestState();\n }\n };\n\n private readonly _keyup = (e: KeyboardEvent): void => {\n const { suggestions } = this.state;\n\n if (suggestions && suggestions.AllSearchResults && e.keyCode === KeyCodes.Escape) {\n this._clearAutoSuggestState();\n } else if (this.state.isSearchFormExpanded && e.keyCode === KeyCodes.Escape) {\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n\n if (\n !(\n (this.formReference.current && this.formReference.current.contains((e.target as unknown) as Node)) ||\n (this.autoSuggestResultDiv.current && this.autoSuggestResultDiv.current.contains((e.target as unknown) as Node))\n )\n ) {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n\n if (this.state.isSearchFormExpanded) {\n this.setState({ isSearchFormExpanded: false });\n }\n }\n };\n\n private readonly _clearAutoSuggestState = (): void => {\n const {\n context: { actionContext },\n data: { searchState }\n } = this.props;\n\n if (this.searchTextInput.current && this.searchTextInput.current.value.length > 0) {\n searchState.searchText = '';\n searchState.defaultBasicSearchUrl = '';\n searchState.searchQueryStringParameter = '';\n actionContext ? actionContext.update(createSearchStateInput(searchState), searchState) : null;\n this.searchTextInput.current.value = '';\n }\n\n this.setState({ searchText: '', suggestions: undefined, searchRefiners: undefined });\n };\n\n private async _getSearchSuggestions(loadSuggestionsRequestId: string, query: string) {\n try {\n const searchSuggestions = await getSearchSuggestionsAction(\n new AutoSuggestInput(query, this.topResultsCount, this._getSuggestionType(), this.hitPrefix, this.hitSuffix),\n this.props.context.actionContext\n );\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n return searchSuggestions;\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return undefined;\n }\n this.setState({ suggestions: undefined, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount() });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get auto suggest results');\n return undefined;\n }\n }\n\n private async _updateSearchRefiners(loadSuggestionsRequestId: string, query: string, suggestions: Autosuggestions | undefined) {\n try {\n const refiners = await this._getSearchRefiners(query);\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({\n suggestions,\n searchRefiners: refiners,\n autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions),\n isLoadingAutoSuggest: false\n });\n } catch (error) {\n if (loadSuggestionsRequestId !== this.loadSuggestionsRequestId) {\n return;\n }\n this.setState({ suggestions, searchRefiners: undefined, autoSuggestAriaLabel: this._setAutoSuggestResultCount(suggestions) });\n this.props.telemetry.exception(error);\n this.props.telemetry.debug('Unable to get refiners results');\n }\n }\n\n private _loadSuggestions(query: string) {\n this.cancellabelDebounce = debounce(async () => {\n this.setState({ isLoadingAutoSuggest: true });\n const loadSuggestionsRequestId = Random.Guid.generateGuid();\n this.loadSuggestionsRequestId = loadSuggestionsRequestId;\n const searchSuggestions = await this._getSearchSuggestions(loadSuggestionsRequestId, query);\n await this._updateSearchRefiners(loadSuggestionsRequestId, query, searchSuggestions);\n }, this.waitTime);\n\n setTimeout(() => {\n this.cancellabelDebounce();\n }, 0);\n }\n\n private readonly _handleInputChange = (query: string): void => {\n if (!query || query.length <= this.maxChars) {\n this.setState({ searchText: query });\n }\n\n if (this.cancellabelDebounce) {\n this.cancellabelDebounce.cancel();\n }\n\n const {\n context,\n data: { searchState }\n } = this.props;\n\n if (context) {\n if (query && query.length > 0) {\n if (query.length > this.maxChars) {\n return;\n }\n\n if (ArrayExtensions.hasElements(this.inputSuggestionType)) {\n this._loadSuggestions(query);\n }\n\n searchState.searchText = query;\n } else {\n this.setState({ suggestions: undefined, searchRefiners: undefined });\n searchState.searchText = '';\n }\n context.actionContext.update(createSearchStateInput(searchState), searchState);\n }\n };\n\n private _getSuggestionType(): string {\n const distinctSuggestionTypes: string[] = this.inputSuggestionType.map(\n suggestionTypeItem => suggestionTypeItem.SuggestionType!.charAt(0).toUpperCase() + suggestionTypeItem.SuggestionType!.slice(1)\n );\n return distinctSuggestionTypes.join(',');\n }\n\n private async _getSearchRefiners(searchText: string): Promise {\n const { actionContext: ctx } = this.props.context;\n const catalogId = getCatalogId(ctx.requestContext);\n validateCatalogId(catalogId);\n return ProductsDataActions.getProductSearchRefinersAsync(\n { callerContext: ctx },\n {\n SearchCondition: searchText,\n Context: {\n ChannelId: +ctx.requestContext.apiSettings.channelId,\n CatalogId: catalogId\n }\n }\n );\n }\n\n private readonly _handleSubmit = (\n e: React.MouseEvent | React.KeyboardEvent | React.FormEvent\n ): void => {\n const {\n config: { disableSubmitSearch },\n context: {\n actionContext,\n app: {\n config: { searchQueryStringParameter }\n }\n }\n } = this.props;\n\n const query = this.searchTextInput.current && this.searchTextInput.current.value;\n e.preventDefault();\n\n if (!query || (query && query.length === 0) || disableSubmitSearch) {\n this.searchTextInput && this.searchTextInput.current && this.searchTextInput.current.focus();\n } else {\n const searchQsp = searchQueryStringParameter || 'q';\n const searchURL = this._appendQueryParams(getUrlSync('search', actionContext) || '', query, searchQsp);\n document.location.href = searchURL;\n }\n };\n\n private readonly _handleCancelSearchChange = (): void => {\n const { isSearchFormExpanded, suggestions } = this.state;\n\n if (!isSearchFormExpanded) {\n this.setState({\n isSearchFormExpanded: true,\n searchText: '',\n isInitialState: false\n });\n } else {\n if (suggestions && suggestions.AllSearchResults) {\n this._clearAutoSuggestState();\n }\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _handleCancelSearchFocused = (): void => {\n const { suggestions } = this.state;\n if (!(suggestions && suggestions.AllSearchResults)) {\n this._clearAutoSuggestState();\n this.setState({ isSearchFormExpanded: false });\n }\n };\n\n private readonly _appendQueryParams = (route: string, query: string, qsp: string): string => {\n if (!MsDyn365.isBrowser) {\n return '';\n }\n\n const queryUrl = new URL(route, window.location.href);\n if (qsp && query) {\n queryUrl.searchParams.set(qsp, query);\n }\n\n return queryUrl.href;\n };\n\n private readonly _setAutoSuggestResultCount = (result?: Autosuggestions) => {\n if (this.autoSuggestResultScreenReaderDiv.current !== null) {\n const ariaLiveRegion = this.autoSuggestResultScreenReaderDiv.current;\n const suggestResultString = this.props.resources.autoSuggestFoundMessage;\n const emptyResultString = this.props.resources.noAutoSuggestionMessage;\n ariaLiveRegion.innerText =\n result && result.AllSearchResults && result.AllSearchResults.length > 0 ? suggestResultString : emptyResultString;\n ariaLiveRegion.setAttribute('aria-live', 'assertive');\n return ariaLiveRegion.innerText;\n }\n return '';\n };\n}\n\nexport default Search;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ITelemetry } from '@msdyn365-commerce/core';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { DimensionTypes } from '@msdyn365-commerce-modules/retail-actions';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\n/**\n * Types of product refiner values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerValueDataTypeValue {\n /**\n * Range slider is used for selections like price.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Range = 1,\n\n /**\n * Range input is a different way to specify ranges and can be expressed with input boxes\n * as well as a set of discrete single-select type values.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n RangeInput = 4,\n\n /**\n * This is a discrete list item, either multi-select or single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n List = 5,\n\n /**\n * Boolean types allows only single-select.\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Boolean = 6\n}\n\n/**\n * Types of product refiners.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerTypeValue {\n /**\n * Refiner values are single-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Single = 0,\n\n /**\n * Refiner values are multi-select.\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Multi = 1\n}\n\n/**\n * ProductRefinerSource enum type.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\nexport enum ProductRefinerSource {\n /**\n * The None member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n None = 0,\n\n /**\n * The Attribute member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Attribute = 1,\n\n /**\n * The Category member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Category = 2,\n\n /**\n * The Price member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Price = 3,\n\n /**\n * The Rating member.\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\n * @example\n * ```\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\n * ```\n */\n Rating = 4\n}\n\nexport interface IRefineItemData {\n sourceValue?: number;\n swatchImageUrl?: string;\n swatchColorHexCode?: string;\n refinerItemId: number;\n dataTypeValue?: number;\n name: string;\n label: string;\n count?: number;\n isChecked: boolean;\n refineItemUrl?: string;\n minValue?: string;\n maxValue?: string;\n dimensionType?: DimensionTypes;\n rowNumber?: number;\n unitText?: string;\n updatedSliderMaxValue?: string;\n updatedSliderMinValue?: string;\n}\n/**\n * Checks if the data type value corresponds to a slider.\n * @param dataTypeValue\n */\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\n return dataTypeValue === AttributeDataType.Currency || dataTypeValue === AttributeDataType.Decimal;\n}\n\n/**\n * Checks if the data type value corresponds to a range type integer.\n * @param dataTypeValue\n */\nexport function isRangeTypeForInteger(dataTypeValue: number | undefined): boolean {\n return (\n dataTypeValue === AttributeDataType.Currency ||\n dataTypeValue === AttributeDataType.Decimal ||\n dataTypeValue === AttributeDataType.Integer\n );\n}\n\n/**\n * Checks if the data type value corresponds to a custom input box Range.\n * @param dataTypeValue\n */\nexport function isCustomRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy\n): boolean {\n return (\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion?.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n );\n}\n\n/**\n * Checks if the selectedRefinementCriterion is siingle type with API va;ues or custom type.\n * If custom type then RowNumber is null\n * @param dataTypeValue\n */\nexport function isSingleSelectRangeTypeIntegerSelected(\n selectedRefinementCriterion: ProductRefinerValue,\n productRefinerValue: ProductRefinerValue\n): boolean {\n return (\n productRefinerValue.LeftValueBoundString === selectedRefinementCriterion?.LeftValueBoundString &&\n productRefinerValue.RightValueBoundString === selectedRefinementCriterion?.RightValueBoundString &&\n selectedRefinementCriterion?.RowNumber !== undefined &&\n selectedRefinementCriterion?.RowNumber !== null &&\n selectedRefinementCriterion !== undefined\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n */\nexport function findMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue | undefined {\n // If the value is a range, then match only on data type value; otherwise match on item string\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\n );\n}\n\n/**\n * Find the refinement criterion associated with this product refiner value.\n * @param productRefinerValue Product refiner value to match.\n * @param refinementCriteria Selected refinement criteria.\n * @param refinementCriterion\n */\nexport function isMatchingRefinementCriterion(\n productRefinerValue: ProductRefinerValue,\n refinementCriterion: ProductRefinerValue,\n parent?: IProductRefinerHierarchy\n): boolean {\n // If the value is a range, then match only on data type value; otherwise match on item string\n // Distinguish by displaytype also\n return (\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\n ((parent?.DisplayTemplateValue === DisplayTemplate.Range\n ? isRangeType(refinementCriterion.DataTypeValue)\n : isRangeTypeForInteger(refinementCriterion.DataTypeValue)) ||\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\n );\n}\n\nexport function getIntegerRangeName(productRefinerValue: ProductRefinerValue): string {\n let rangeValue = '';\n\n if (productRefinerValue.LeftValueBoundString === '' && productRefinerValue.RightValueBoundString !== '') {\n rangeValue = `< ${productRefinerValue.RightValueBoundLocalizedString || productRefinerValue.RightValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString === '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `> ${productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString}`;\n } else if (productRefinerValue.RightValueBoundString !== '' && productRefinerValue.LeftValueBoundString !== '') {\n rangeValue = `${productRefinerValue.LeftValueBoundLocalizedString ||\n productRefinerValue.LeftValueBoundString} - ${productRefinerValue.RightValueBoundString ||\n productRefinerValue.RightValueBoundString}`;\n }\n return rangeValue;\n}\n\n/**\n * Get input without formatting.\n * @param input - Input string.\n * @returns - Returns number.\n */\nexport function getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNumber = Number(input);\n if (!Number.isNaN(inputAsNumber)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n // const reverseLookupResult = formattedPriceReverseLookup.get(input);\n // return reverseLookupResult || input;\n return input;\n}\n\nexport function getUpdatedRefinementCriteria(\n itemToggleNotification: IRefineItemToggleNotification,\n currentRefinementCriteria: ProductRefinerValue[]\n): ProductRefinerValue[] {\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\n let toggledItemFound = false;\n\n // Keeping only itemToggled value for integer-range type in currentRefinementCriteria\n if (\n itemToggleNotification.parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n itemToggleNotification.parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n currentRefinementCriteria = currentRefinementCriteria.filter(r => {\n return r.RefinerRecordId !== itemToggleNotification.productRefinerValue.RefinerRecordId;\n });\n }\n\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\n if (\n isMatchingRefinementCriterion(\n itemToggleNotification.productRefinerValue,\n selectedCriterion,\n itemToggleNotification.parentProductRefinerHierarchy\n )\n ) {\n toggledItemFound = true;\n if (itemToggleNotification.isSelecting) {\n const next = {\n ...selectedCriterion,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n selectedCriterion.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n selectedCriterion.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n } // Else the item is being de-selected, so omit it from the refinement criteria\n } else {\n // Keep existing criterion because it is not in the item toggle notification\n updatedRefinementCriteria.push(selectedCriterion);\n }\n });\n\n if (!toggledItemFound) {\n const next = {\n ...itemToggleNotification.productRefinerValue,\n LeftValueBoundString:\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\n RightValueBoundString:\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\n itemToggleNotification.productRefinerValue.RightValueBoundString\n };\n updatedRefinementCriteria.push(next);\n\n // If single select, then deselect any others in the parent refiner group\n if (\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\n ) {\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\n // Do nothing\n } else {\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\n isMatchingRefinementCriterion(child, criterion, itemToggleNotification.parentProductRefinerHierarchy)\n );\n if (matchingIndex > -1) {\n updatedRefinementCriteria.splice(matchingIndex, 1);\n }\n }\n });\n }\n }\n\n return updatedRefinementCriteria;\n}\n\nexport function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string | undefined,\n telemetry: ITelemetry\n): string {\n if (!amount || !currency) {\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\n return amount || '';\n }\n const priceAmount = (amount && Number(amount)) || 0;\n let result: string;\n\n try {\n result = new Intl.NumberFormat(locale, {\n style: 'currency',\n currencyDisplay: 'symbol',\n currency,\n minimumFractionDigits: 0\n }).format(priceAmount);\n } catch (error) {\n result = `${priceAmount} ${currency}`;\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { AttributeDataType, DisplayTemplate, ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { ProductListInventoryFilteringOptions } from '../actions';\nimport { IChoiceSummaryProps } from './choice-summary.props';\nimport { getIntegerRangeName, isMatchingRefinementCriterion, isRangeType } from './utilities';\n\ninterface IRefinerMap {\n key: string;\n value: ProductRefinerValue;\n rangeDisplayType?: number | undefined;\n}\n\n/**\n * ChoiceSummary component.\n */\n@observer\nexport default class ChoiceSummary extends React.PureComponent {\n private readonly closeButtonGlyph: string = 'msi-close-btn';\n\n private readonly payLoad: IPayLoad;\n\n @computed get selectedRefinersMap(): IRefinerMap[] {\n let { selectedChoices } = this.props;\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\n selectedChoices = selectedChoices.filter(choice => {\n const parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\n );\n return parent && parent.RecordId !== channelInventoryConfigurationId;\n });\n }\n return selectedChoices.map((selectedRefiner: ProductRefinerValue, index) => {\n const rangeParentDisplay = refinerHierarchy.filter(p => p.RecordId === selectedRefiner.RefinerRecordId);\n return {\n key: this._getKeyForRefinerValue(selectedRefiner, index.toString()),\n value: selectedRefiner,\n // parameter to store Display Template type\n rangeDisplayType: rangeParentDisplay[0]?.DisplayTemplateValue || undefined\n } as IRefinerMap;\n });\n }\n\n constructor(props: Readonly) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public render(): JSX.Element {\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\n const items = this.selectedRefinersMap;\n this.payLoad.contentAction.etext = clearAllText;\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n return (\n
    \n {items.length > 0 && label && {label}}\n
      \n {items.map((item: IRefinerMap) => {\n this.payLoad.contentAction.etext = item.key;\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n // Get range value for Range display and integer type only (not for Integer with TextBox(4) display)\n const rangeInteger =\n item.value.DataTypeValue === AttributeDataType.Integer &&\n item.rangeDisplayType &&\n item.rangeDisplayType === DisplayTemplate.Range &&\n item.value.RefinerRecordId !== 0;\n const newIntRange = rangeInteger\n ? item.key\n : item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\n ? item.value.LeftValueBoundString\n : (item.value.LeftValueBoundLocalizedString || item.value.LeftValueBoundLocalizedString === undefined) &&\n item.value.RefinerRecordId === 0\n ? item.key\n : item.value.LeftValueBoundString;\n return (\n
    • \n \n {newIntRange}\n \n \n
    • \n );\n })}\n
    \n {items.length > 0 && clearAllText && (\n \n {clearAllText}\n \n )}\n
    \n );\n }\n\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue, index: string): string {\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\n const overallFormat = choiceFormat || '{1}';\n const rangeFormat = choiceRangeValueFormat;\n let refinerName = '';\n let parent: IProductRefinerHierarchy | undefined;\n if (refinerHierarchy && refinerHierarchy.find) {\n parent = refinerHierarchy.find(\n (hierarchy: IProductRefinerHierarchy) =>\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\n );\n\n if (!parent) {\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\n } else {\n refinerName = parent.KeyName || '';\n }\n }\n\n let refinerValueName: string;\n if (isRangeType(productRefinerValue.DataTypeValue)) {\n refinerValueName = rangeFormat\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\n } else if (productRefinerValue.RefinerRecordId === 0) {\n const filterValue = refinerValues?.Values.find(\n refiner => refiner.LeftValueBoundString === productRefinerValue.LeftValueBoundString\n );\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\n } else {\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n }\n\n if (refinerName === 'Rating' || refinerName === 'Price') {\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\n }\n // Adding integer range format\n if (\n productRefinerValue.DataTypeValue === AttributeDataType.Integer &&\n parent?.DisplayTemplateValue === DisplayTemplate.Range &&\n productRefinerValue.RefinerRecordId !== 0\n ) {\n refinerValueName = getIntegerRangeName(productRefinerValue);\n return refinerValueName;\n }\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}_${index}`);\n }\n\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\n if (!amount || !currency) {\n this.props.telemetry.trace('[choice-summary] could not format price');\n return amount || '';\n }\n let result = amount;\n\n try {\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\n } catch (error) {\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\n }\n\n return result;\n }\n\n private readonly _onClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget as HTMLElement;\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\n\n if (this.props.onChoiceClicked) {\n this.props.onChoiceClicked({\n clearAll,\n itemClicked: target,\n choiceClicked: selectedRefiner,\n nextItemToFocus: target.nextSibling as HTMLElement\n });\n }\n };\n\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\n return (result && result.value) || undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface IErrorMessage {\n text?: string;\n}\n\nexport const ErrorMessage: React.FC = ({ text }) => {\n return (\n \n
    \n {` `}\n {text}\n {` `}\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 { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\n\ninterface IFeatureSearchResultItem {\n product: SimpleProduct | null;\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n telemetryContent?: ITelemetryContent;\n recommendation?: string;\n}\n\nexport const FeatureSearchResultItem: React.FC = ({\n product,\n context,\n imageSettings,\n resources,\n telemetryContent,\n recommendation\n}) => {\n if (product === null) {\n return null;\n }\n\n const productName = product.Name;\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\n const fallbackImage = getFallbackImageUrl(\n product.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n );\n const heading =\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\n\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\n\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n
    \n \n
    \n {renderProductPlacementImage(\n imageSettings,\n context.request.gridSettings,\n product.PrimaryImageUrl,\n product.Name,\n fallbackImage,\n context.actionContext.requestContext\n )}\n
    \n \n
    \n

    {heading}

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

    {title}

    ;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ILink {\n className?: string;\n text?: string;\n href?: string;\n ariaLabel?: string;\n}\n\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\n \n {' '}\n {text}{' '}\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, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\nimport React from 'react';\n\nexport interface ISearchResultModalViewProps {\n modal: React.ReactElement;\n modalHeader: React.ReactElement;\n modalFooter: React.ReactElement;\n modalBody: React.ReactElement;\n}\n\ninterface IModalToggleProps {\n innerRef: React.RefObject | undefined;\n id: string;\n text: string;\n ariaLabel: string;\n onClick(): void;\n}\n\nexport interface ISearchResultModalResources {\n modalTitle: string;\n modalCloseButtonText: string;\n}\n\nexport interface ISearchResultModalProps {\n resources: ISearchResultModalResources;\n isOpen: boolean;\n returnRef: React.RefObject | undefined;\n onModalToggle(): void;\n}\n\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\n const { text, onClick, ariaLabel, innerRef, id } = props;\n return (\n \n );\n};\n\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\n return {\n modal: modalNode(props),\n modalHeader: modalHeaderNode(props),\n modalFooter: modalFooterNode(props),\n modalBody: \n };\n};\n\nconst modalNode = (props: ISearchResultModalProps) => {\n return (\n \n );\n};\n\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\n return {props.resources.modalTitle};\n};\n\nconst modalFooterNode = (props: ISearchResultModalProps) => {\n return (\n \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 { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultContainerResources } from '../search-result-container.props.autogenerated';\n\ninterface IProductSearchResultItems {\n products: ProductSearchResult[];\n context: ICoreContext;\n resources: ISearchResultContainerResources;\n imageSettings?: IImageSettings;\n moduleType: string;\n moduleId: string;\n allowBackNavigation?: boolean;\n telemetryContent: ITelemetryContent;\n quickviewSlot?: {} | null | undefined;\n productComparisonButton?: {} | null | undefined;\n channelInventoryConfigurationId?: number;\n isPriceMinMaxEnabled?: boolean;\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\n/**\n * Returns the product inventory label.\n * @param channelInventoryConfigurationId - The channel configuration Id.\n * @param product - The product.\n * @returns The inventory label.\n */\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\n return undefined;\n }\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\n if (inventoryAttribute) {\n return inventoryAttribute.TextValue;\n }\n return undefined;\n}\n\nexport const ProductSearchResultItems: React.FC = ({\n products,\n context,\n imageSettings,\n resources,\n moduleType,\n moduleId,\n allowBackNavigation,\n telemetryContent,\n quickviewSlot,\n productComparisonButton,\n channelInventoryConfigurationId,\n isPriceMinMaxEnabled,\n productsDimensionAvailabilities\n}) => {\n const priceResources: IPriceComponentResources = {\n priceRangeSeparator: resources.priceRangeSeparator\n };\n return (\n
      \n {products.map((product: ProductSearchResult, index: number) => (\n
    • \n \n ArrayExtensions.hasElements(dimensionAvailability) &&\n dimensionAvailability[0].masterProductId === product.MasterProductId\n )}\n />\n
    • \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 { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\nimport debounce from 'lodash/debounce';\nimport { computed } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\n\ntype InputType = 'Min' | 'Max';\n\nexport type RangeRefineItemType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemProps extends IRefineItemProps {\n rangeType: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n sliderKey?: string;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n touchedMin: boolean;\n touchedMax: boolean;\n sliderId: string;\n minValue: string | undefined;\n maxValue: string | undefined;\n labels: ISliderLabel[];\n sliderThumbs: ISliderThumbProps[];\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItem extends React.Component {\n private readonly _formattedPriceReverseLookup: Map = new Map();\n\n private readonly minInput: React.RefObject;\n\n private readonly maxInput: React.RefObject;\n\n @computed get currencyCode(): string {\n return this.props.productRefinerValue.UnitText || '';\n }\n\n public constructor(props: IRangeRefineItemProps) {\n super(props);\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\n this._changeMin = this._changeMin.bind(this);\n this._changeMax = this._changeMax.bind(this);\n this._finishChangeMin = this._finishChangeMin.bind(this);\n this._finishChangeMax = this._finishChangeMax.bind(this);\n\n this.minInput = React.createRef();\n this.maxInput = React.createRef();\n\n const { selectedRefinementCriterion } = this.props;\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.state = {\n isChecked: false,\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n touchedMin: false,\n touchedMax: false,\n sliderId,\n minValue,\n maxValue,\n labels,\n sliderThumbs\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\n if (previousProps !== this.props) {\n this.updateSliderProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\n refineItemCommonProps.telemetry.error(\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\n );\n return undefined;\n }\n\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n\n return this._renderSlider();\n }\n\n /**\n * Function to update slider props.\n */\n private updateSliderProps(): void {\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\n this.props.productRefinerValue.RefinerRecordId\n )}`;\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\n const minPrice = this._formatPrice(minValue);\n const maxPrice = this._formatPrice(maxValue);\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\n const selectedMin =\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\n const selectedMax =\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\n this.props.productRefinerValue.RightValueBoundString ??\n maxValue;\n const selectedMinPrice = this._formatPrice(selectedMin);\n const selectedMaxPrice = this._formatPrice(selectedMax);\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\n sliderId,\n sliderKeyString,\n selectedMin,\n selectedMinPrice,\n selectedMax,\n selectedMaxPrice,\n maxPrice\n );\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\n }\n\n /**\n * Function to create the labels for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param minPrice - Slider min value.\n * @param maxPrice - Slider max value.\n * @returns Array labels.\n */\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\n return [\n {\n labelId: `${sliderId}_start`,\n labelString: `${minPrice}`,\n labelPositioning: 'start'\n },\n {\n labelId: `${sliderId}_end`,\n labelString: `${maxPrice}`,\n labelPositioning: 'end'\n }\n ];\n };\n\n /**\n * Function to create the slider thumbs for slider.\n * @param sliderId - Slider element id for the DOM.\n * @param sliderKey - Unique key for slider.\n * @param selectedMin - Slider selected min value.\n * @param selectedMinPrice - Slider selected min price.\n * @param selectedMax - Slider selected max value.\n * @param selectedMaxPrice - Slider selected max price..\n * @param maxPrice - Slider max price..\n * @returns Slider Thumb Props.\n */\n private readonly getSliderThumbs = (\n sliderId: string,\n sliderKey: string,\n selectedMin: string,\n selectedMinPrice: string,\n selectedMax: string | undefined,\n selectedMaxPrice: string,\n maxPrice: string\n ): ISliderThumbProps[] => {\n const sliderThumbDefaultValue = 0;\n return [\n {\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMinPrice}`\n },\n {\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\n value: Number(selectedMax) || Number(maxPrice),\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\n ariaValueText: `${selectedMaxPrice}`\n }\n ];\n };\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n // To enable price formatting of selected fields, this is the approach:\n // initial value: min=0 formatted as price, max=undefined\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\n // onBlur: validate and format entered value as price\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\n return (\n
    \n \n \n {validationErrorMin && (\n \n {validationErrorMin}\n \n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n \n {validationErrorMax}\n \n )}\n
    \n );\n }\n\n private _renderSlider(): JSX.Element | undefined {\n const { isDisabled, sliderKey } = this.props;\n const ariaAttributes = {\n 'aria-disabled': isDisabled\n };\n\n return (\n \n );\n }\n\n private _changeMin(event: React.FocusEvent): void {\n this._changeValue(event, 'Min');\n }\n\n private _changeMax(event: React.FocusEvent): void {\n this._changeValue(event, 'Max');\n }\n\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\n const selectedKey = `selected${inputType}`;\n const touchedKey = `touched${inputType}`;\n this.setState({\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\n [touchedKey]: true\n });\n }\n\n private _finishChangeMin(event: React.FocusEvent): boolean {\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\n\n const maxNum = max ? Number(max) : undefined;\n\n if (isNaN(minInput)) {\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\n this._focus('Min');\n return false;\n }\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minInput,\n rangeEnd: maxNum\n });\n return true;\n }\n this._focus('Min');\n\n return false;\n }\n\n private _finishChangeMax(event: React.FocusEvent): boolean {\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\n this.setState({\n selectedMax: selectedMaxValue,\n maxTouched: false\n });\n const maxInput = Number(selectedMaxValue);\n const {\n onToggle,\n parentProductRefinerHierarchy,\n productRefinerValue,\n refineItemCommonProps,\n selectedRefinementCriterion\n } = this.props;\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\n\n const minNum = Number(min);\n\n if (isNaN(maxInput)) {\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\n this._focus('Max');\n return false;\n }\n\n if (this._validateRange(minNum, maxInput)) {\n if (productRefinerValue) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: minNum,\n rangeEnd: maxInput\n });\n } else {\n this._focus('Max');\n }\n return true;\n }\n\n return false;\n }\n\n private _focus(inputType: InputType): void {\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\n\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.focus();\n }\n }, 50);\n }\n\n private _getFormattedSelectedValue(\n selected: string | undefined,\n touched: boolean,\n validationError: string | undefined\n ): string | undefined {\n if (touched || validationError || selected === undefined) {\n return selected;\n }\n return this._formatPrice(selected);\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _formatPrice(amount: string | undefined): string {\n if (this.props.productRefinerValue.RefinerRecordId === 0) {\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\n return result;\n }\n return amount || '';\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n\n // NOTE: Fix types once Shared Components build pipeline bug fixed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdate(sliderChangeNotification: any): void {\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\n if (sliderChangeNotification.eventType !== 'mousemove') {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\n if (productRefinerValue && sliderChangeNotification) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true,\n rangeStart: sliderChangeNotification.firstThumbValue,\n rangeEnd: sliderChangeNotification.secondThumbValue\n });\n\n this._focusOnSliderThumb(sliderChangeNotification);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\n if (sliderChangeNotification.id) {\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\n if (element) {\n setTimeout(() => {\n element.focus();\n }, 0);\n }\n }\n }\n\n private _handleRangeTooltipText(tooltip: number): string {\n return this._formatPrice(`${tooltip}`);\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { getIntegerRangeName, isSingleSelectRangeTypeIntegerSelected } from './utilities';\n\n/**\n * RefineItem properties.\n */\nexport interface IRefineItemProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n productRefinerValue: ProductRefinerValue;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n selectedRefinerValues?: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n context: ICoreContext>;\n moduleId: string;\n moduleTypeName: string;\n index?: number;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobileView?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onToggle(notfication: Readonly): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine item state.\n */\nexport interface IRefineItemState extends React.ComponentState {\n isChecked: boolean;\n renderingError?: object;\n}\n\n/**\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\n */\nexport default class RefineItem extends React.Component {\n private readonly anchorType: React.RefObject;\n\n private readonly payLoad: IPayLoad;\n\n public constructor(props: IRefineItemProps) {\n super(props);\n this._onClick = this._onClick.bind(this);\n this.state = {\n isChecked: !!this.props.selectedRefinementCriterion\n };\n this.anchorType = React.createRef();\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\n }\n\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | undefined {\n const {\n isDisabled,\n refineItemCommonProps,\n parentProductRefinerHierarchy,\n productRefinerValue,\n selectedRefinementCriterion,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n index,\n children,\n onToggle,\n context,\n telemetryContent,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n ...attrs\n } = this.props;\n if (!productRefinerValue) {\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\n return undefined;\n }\n if (!productRefinerValue.LeftValueBoundString) {\n refineItemCommonProps.telemetry.warning(\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\n );\n }\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\n const isChecked = !!selectedRefinementCriterion;\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\n return this._renderRating(\n productRefinerValue,\n parentProductRefinerHierarchy,\n isChecked,\n context,\n index,\n telemetryContent,\n productCountAriaLabel,\n singleProductCountAriaLabel\n );\n }\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const productCount = productRefinerValue.Count || 0;\n let refineMenuItemAriaLabel;\n if (productCount === 1) {\n refineMenuItemAriaLabel = refineItemAriaLabel\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\n : '';\n } else {\n refineMenuItemAriaLabel = refineItemsAriaLabel\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\n : '';\n }\n\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\n const shouldDisplayAsSwatch = this._getShouldDisplayAsSwatch(dimensionType);\n\n let className = 'ms-refine-submenu-item';\n if (shouldDisplayAsSwatch) {\n className = classnames(className, `ms-refine-submenu-item__dimension__${dimensionType}`);\n }\n\n // If the swatch has no color or image specified, it should be displayed as text.\n // We don't use swatch logic to display the number of the results found together with the text.\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\n const hasContentSwatch = hasColor || hasImage;\n if (\n parentProductRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n parentProductRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n const rangeValue = getIntegerRangeName(productRefinerValue);\n return (\n
  • \n \n \n \n
  • \n );\n } else {\n return (\n
  • \n \n {hasContentSwatch && shouldDisplayAsSwatch && this._renderSwatch(dimensionType)}\n \n \n
  • \n );\n }\n }\n\n private _getShouldDisplayAsSwatch(dimensionType: DimensionTypes) {\n const shouldDisplayAsSwatch = checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\n return shouldDisplayAsSwatch;\n }\n\n private _renderSwatch(dimensionType: DimensionTypes): JSX.Element | null {\n const productRefinerValue = this.props.productRefinerValue;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\n const swatchItems = [\n {\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\n value: text,\n dimensionType,\n colorHexCode: productRefinerValue.SwatchColorHexCode,\n imageUrl: productRefinerValue.SwatchImageUrl\n }\n ];\n\n return (\n \n );\n }\n\n private _getRefinerUrl(): string {\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n\n if (productRefinerValue) {\n return urlBuilder({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n }\n\n return '';\n }\n\n private readonly _onClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\n if (productRefinerValue) {\n this.props.onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: !selectedRefinementCriterion\n });\n\n setTimeout(() => {\n this.anchorType.current && this.anchorType.current.focus();\n }, 0);\n }\n };\n\n private _renderRating(\n productRefinerValue: ProductRefinerValue,\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\n isChecked: boolean,\n context: ICoreContext,\n index?: number,\n telemetryContent?: ITelemetryContent,\n ratingUserCountAriaLabel?: string,\n ratingSingleUserCountAriaLabel?: string\n ): JSX.Element | undefined {\n if (productRefinerValue.LeftValueBoundString) {\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\n const ratingRefiner = this.props.selectedRefinerValues?.find(\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\n );\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\n const defaultChkProductCount = 1;\n let ratingComponentClass: string = 'ms-rating-component';\n if (refinerRating > selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__up`;\n } else if (refinerRating < selectedRating) {\n ratingComponentClass = `${ratingComponentClass}__down`;\n } else {\n ratingComponentClass = `${ratingComponentClass}__current`;\n }\n const productCountAriaLabelValue =\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\n return (\n \n \n \n \n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\n \n \n \n );\n }\n return undefined;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport { isUndefined } from 'lodash';\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\nimport { Button } from '@msdyn365-commerce-modules/utilities';\nimport { IRefineItemState } from './refine-item';\nimport { isCustomRangeTypeIntegerSelected } from './utilities';\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\n\nexport type RangeRefineItemInputType = 'slider' | 'input';\n\n/**\n * Range refine item properties.\n */\nexport interface IRangeRefineItemInputProps {\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinementCriterion: ProductRefinerValue | undefined;\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n rangeType: RangeRefineItemInputType;\n\n /**\n * The telemetry content\n */\n onToggle(notfication: Readonly): void;\n}\n\n/**\n * Range refine item state.\n */\nexport interface IRangeRefineItemInputState extends IRefineItemState {\n validationErrorMin: string | undefined;\n validationErrorMax: string | undefined;\n selectedMin: string | undefined;\n selectedMax: string | undefined;\n invalidData: boolean | undefined;\n}\n\n/**\n * RangeRefineItem component (controlled by RefineSubmenu).\n */\n@observer\nexport default class RangeRefineItemInput extends React.Component {\n private readonly _formattedPriceReverseLookup: Map = new Map();\n\n private readonly minInput: React.RefObject;\n\n private readonly maxInput: React.RefObject;\n\n public constructor(props: IRangeRefineItemInputProps) {\n super(props);\n this._changeMinInputRange = this._changeMinInputRange.bind(this);\n this._changeMaxInputRange = this._changeMaxInputRange.bind(this);\n this._applyCustom = this._applyCustom.bind(this);\n\n this.minInput = React.createRef();\n this.maxInput = React.createRef();\n let initialMin = '';\n let initialMax = '';\n const { selectedRefinementCriterion, parentProductRefinerHierarchy } = this.props;\n if (selectedRefinementCriterion) {\n initialMin = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.LeftValueBoundString || '';\n initialMax = isCustomRangeTypeIntegerSelected(selectedRefinementCriterion, parentProductRefinerHierarchy)\n ? ''\n : selectedRefinementCriterion?.RightValueBoundString || '';\n }\n\n this.state = {\n validationErrorMin: undefined,\n validationErrorMax: undefined,\n selectedMin: initialMin,\n selectedMax: initialMax,\n invalidData: !(initialMin && initialMax),\n isChecked: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IRangeRefineItemInputProps, nextState: IRangeRefineItemInputState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n nextState.invalidData = !(nextState.selectedMin && nextState.selectedMax);\n return true;\n }\n\n public componentDidUpdate(previousProps: IRangeRefineItemInputProps): void {\n if (previousProps !== this.props) {\n this.updateInputRangerProps();\n }\n }\n\n public render(): JSX.Element | undefined {\n if (this.props.rangeType === 'input') {\n return this._renderInputFields();\n }\n return undefined;\n }\n\n // /**\n // * Function to update slider props.\n // */\n private updateInputRangerProps(): void {\n const selectedMin = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.LeftValueBoundString;\n const selectedMax = !isUndefined(this.props.selectedRefinementCriterion?.RowNumber)\n ? ''\n : this.props.selectedRefinementCriterion?.RightValueBoundString;\n this.setState({ selectedMin, selectedMax });\n }\n\n private _renderInputFields(): JSX.Element | undefined {\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\n const { validationErrorMin, validationErrorMax } = this.state;\n\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\n const formAttrs = {\n 'aria-label': rangeAriaLabel,\n 'aria-disabled': isDisabled\n };\n\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\n }`;\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\n }`;\n return (\n
  • \n
    \n
    \n \n {' - '}\n \n {validationErrorMin && (\n \n {validationErrorMin}\n \n )}\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\n \n {validationErrorMax}\n \n )}\n
    \n
    \n \n
    \n
    \n
  • \n );\n }\n\n private _applyCustom(event: React.MouseEvent): void {\n const selectedMinValue = this._getInputWithoutFormatting(this.state.selectedMin || '');\n this.setState({\n selectedMin: selectedMinValue,\n minTouched: false\n });\n const minInput = Number(selectedMinValue);\n const { onToggle, parentProductRefinerHierarchy } = this.props;\n const max = this.state.selectedMax;\n\n const maxNum = max ? Number(max) : undefined;\n const productRefinerValue: ProductRefinerValue = {\n RefinerRecordId: parentProductRefinerHierarchy.Values[0].RefinerRecordId,\n LeftValueBoundString: this.state.selectedMin,\n RightValueBoundString: this.state.selectedMax,\n DataTypeValue: parentProductRefinerHierarchy.DataTypeValue,\n RefinerSourceValue: parentProductRefinerHierarchy.Values[0].RefinerSourceValue\n };\n\n if (this._validateRange(minInput, maxNum)) {\n onToggle({\n parentProductRefinerHierarchy,\n productRefinerValue,\n isSelecting: true\n });\n }\n }\n\n private _changeMinInputRange(event: React.ChangeEvent): void {\n this.setState({\n selectedMin: event.target.value.trim()\n });\n }\n\n private _changeMaxInputRange(event: React.ChangeEvent): void {\n this.setState({\n selectedMax: event.target.value.trim()\n });\n }\n\n private _validateRange(min: number, max: number | undefined): boolean {\n const { refineItemCommonProps } = this.props;\n if (max === undefined) {\n return true;\n }\n\n if (min > max) {\n this.setState({\n validationErrorMin: refineItemCommonProps.validationErrorRange,\n validationErrorMax: refineItemCommonProps.validationErrorRange\n });\n return false;\n }\n\n return true;\n }\n\n private _getInputWithoutFormatting(input: string): string {\n // First try to cast raw input to a number\n const inputAsNum = Number(input);\n if (!isNaN(inputAsNum)) {\n return input;\n }\n\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\n return reverseLookupResult || input;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\nimport {\n AttributeDataType,\n DisplayTemplate,\n ProductRefinerSource,\n ProductRefinerValue,\n RefinerType\n} from '@msdyn365-commerce/retail-proxy';\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\nimport RefineItem from './refine-item';\nimport { IRefineItemCommonProps } from './refine-item.props.common';\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\nimport { findMatchingRefinementCriterion, isRangeTypeForInteger } from './utilities';\nimport RangeRefineItemInput from './range-refine-item-input';\n\n/**\n * Properties associated with the RefineSubmenu component.\n */\nexport interface IRefineSubmenuProps {\n tempRangeTypeTODO: RangeRefineItemType;\n minValueSliderThumbAriaLabel?: string;\n maxValueSliderThumbAriaLabel?: string;\n productRefinerHierarchy: IProductRefinerHierarchy;\n selectedRefinerValues: ProductRefinerValue[];\n refineItemCommonProps: IRefineItemCommonProps;\n isDisabled: boolean;\n isExpandedOnInitialLoad: boolean;\n context: ICoreContext>;\n moduleId: string;\n moduleTypeName: string;\n productCountAriaLabel?: string;\n singleProductCountAriaLabel?: string;\n refineItemAriaLabel?: string;\n refineItemsAriaLabel?: string;\n isMobile?: boolean;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n onUpdateRefiners(notfication: Readonly): void;\n urlBuilder(refiner: IRefineItemToggleNotification): string;\n}\n\n/**\n * Refine submenu state.\n */\nexport interface IRefineSubmenuState extends React.ComponentState {\n expanded: boolean;\n}\n\n/**\n *\n * The RefineSubmenu component renders the submenu category and child items.\n * This computed observes the stateful category hierarchy object.\n * @extends {React.PureComponent}\n */\nclass RefineSubmenu extends React.Component {\n constructor(props: IRefineSubmenuProps) {\n super(props);\n\n this._onToggleItem = this._onToggleItem.bind(this);\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\n\n const isExpanded = this.props.isExpandedOnInitialLoad;\n\n this.state = {\n expanded: isExpanded\n };\n }\n\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\n if (this.state === nextState && this.props === nextProps) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element | null {\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\n\n if (!productRefinerHierarchy) {\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\n }\n\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\n return null;\n }\n\n const className = classnames(\n 'ms-refine-submenu',\n 'list-group',\n productRefinerHierarchy.KeyName // Deprecated because of the localization issues. Leaving for backward compatibility reasons.\n );\n\n return (\n
    \n \n {productRefinerHierarchy.KeyName}\n \n \n {this._renderChildItems(productRefinerHierarchy)}\n \n
    \n );\n }\n\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n if (\n productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range\n ) {\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n // Check if is of integer range type\n if (isRangeTypeForInteger(productRefinerHierarchy.DataTypeValue)) {\n return this._renderRange(productRefinerHierarchy);\n }\n return this._renderSingleMultiSelect(productRefinerHierarchy);\n }\n\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n productCountAriaLabel,\n singleProductCountAriaLabel,\n refineItemAriaLabel,\n refineItemsAriaLabel,\n isMobile\n } = this.props;\n const isSingleSelect =\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\n let selectedRefinementCriterion: ProductRefinerValue | undefined = {};\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n return (\n \n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\n )}\n refineItemCommonProps={refineItemCommonProps}\n onToggle={this._onToggleItem}\n urlBuilder={this.props.urlBuilder}\n isDisabled={isDisabled}\n key={index}\n index={index}\n context={context}\n moduleId={this.props.moduleId}\n moduleTypeName={this.props.moduleTypeName}\n telemetryContent={this.props.telemetryContent}\n productCountAriaLabel={productCountAriaLabel}\n refineItemAriaLabel={refineItemAriaLabel}\n refineItemsAriaLabel={refineItemsAriaLabel}\n singleProductCountAriaLabel={singleProductCountAriaLabel}\n isMobileView={isMobile}\n />\n );\n });\n return (\n \n {listItems}\n {productRefinerHierarchy.DataTypeValue === AttributeDataType.Integer &&\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range && (\n \n )}\n \n );\n }\n\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\n if (\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\n ) {\n return 'slider';\n }\n return 'input';\n }\n\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\n const {\n isDisabled,\n refineItemCommonProps,\n selectedRefinerValues,\n context,\n minValueSliderThumbAriaLabel,\n maxValueSliderThumbAriaLabel\n } = this.props;\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\n const refinerValuesList = productRefinerHierarchy.Values || [];\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\n if (!child) {\n refineItemCommonProps.telemetry.error(\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\n );\n return null;\n }\n\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\n\n const rangeType = this._getRangeType(productRefinerHierarchy);\n const key = selectedRefinementCriterion\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\n : `not-selected-${index}`;\n return (\n
  • \n \n
  • \n );\n });\n return
      {listItems}
    ;\n }\n\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\n this.props.onUpdateRefiners(itemToggleNotification);\n }\n\n private _onToggleSubmenu(): void {\n this.setState(prevState => ({\n expanded: !prevState.expanded\n }));\n }\n}\n\nexport default RefineSubmenu;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\ninterface ISeparator {\n separator: string;\n}\n\nexport const Separator: React.FC = ({ separator }) => (\n \n {` `}\n {separator}\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 * as React from 'react';\n\ninterface ITitle {\n className: string;\n text: string;\n}\n\nexport const Title: React.FC = ({ text, className }) => (\n \n {` `}\n {text}\n {` `}\n \n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CategoryHierarchy as CategoryHierarchyData,\n IProductRefinerHierarchy,\n IProductsDimensionsAvailabilities\n} from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\nimport {\n ChannelInventoryConfiguration,\n format,\n ProductPrice,\n ProductRefinerValue,\n SortColumn,\n StoreOperationsDataActions,\n TextValueTranslation\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n DimensionAvailabilitiesForProductSearchResultInput,\n DimensionTypes,\n DimensionSwatchDisplayTypes,\n getDimensionAvailabilitiesForProductSearchResultAction,\n getPriceForProductSearchResult,\n IDimensionsApp,\n PriceForProductSearchResultInput,\n ObjectExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getTelemetryObject,\n ILabeledDropdownOnChangeNotification,\n ILabeledDropdownOption,\n IModuleProps,\n INodeProps,\n isMobile,\n ITelemetryContent,\n LabeledDropdown,\n UncontrolledPagination,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { action, computed, observable, reaction, transaction } from 'mobx';\nimport { observer } from 'mobx-react';\nimport * as React from 'react';\n\nimport {\n buildListPageUrl,\n getCollectionProducts,\n getCollectionRefinersAction,\n getCurrentUrl,\n GetFullProductsByCollectionInput,\n IFullProductsSearchResultsWithCount,\n parseQueryParam,\n ProductListInventoryFilteringOptions,\n RefinersByCollectionInput,\n sortOptions\n} from './actions';\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\nimport {\n ErrorMessage,\n FeatureSearchResultItem,\n getUpdatedRefinementCriteria,\n IChoiceSummaryClickNotification,\n IRefineItemCommonProps,\n IRefineItemToggleNotification,\n ISearchResultModalViewProps,\n isMatchingRefinementCriterion,\n Link,\n ModalToggle,\n ProductSearchResultItems,\n SearchResultModal,\n Separator,\n Title\n} from './components';\nimport ChoiceSummary from './components/choice-summary';\nimport RefineSubmenu from './components/refine-submenu';\nimport { ListPageState } from './list-page-state';\nimport { ISearchResultContainerData } from './search-result-container.data';\nimport { expandRefinersCount, ISearchResultContainerProps } from './search-result-container.props.autogenerated';\n\nexport interface ISearchResultContainerViewProps extends ISearchResultContainerProps {\n products?: React.ReactNode;\n className?: string;\n SearchResultContainer: IModuleProps;\n TitleViewProps: ITitleViewProps;\n categoryHierarchy: ICategoryHierarchyViewProps;\n pagination?: React.ReactNode;\n ProductsContainer: INodeProps;\n ProductSectionContainer: INodeProps;\n refineMenu: IRefineMenuViewProps;\n sortByOptions: ISortByViewProps;\n choiceSummary?: React.ReactNode;\n modalToggle: React.ReactNode;\n searchResultModal: ISearchResultModalViewProps;\n isMobile: boolean;\n CategoryNavContainer: INodeProps;\n RefineAndProductSectionContainer: INodeProps;\n errorMessage: React.ReactNode;\n FeatureSearchContainer: INodeProps;\n similarLookProduct?: React.ReactNode;\n productPrices?: ProductPrice[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n}\n\nexport interface ITitleViewProps {\n TitleContainer: INodeProps;\n title: ISearchResultTitle;\n}\n\nexport interface IRefineMenuViewProps {\n RefineMenuContainer: INodeProps;\n RefinerSectionContainer: INodeProps;\n refiners?: React.ReactNode[];\n}\n\nexport interface ICategoryHierarchyViewProps {\n categoryHierarchyList?: React.ReactNode[];\n categoryHierarchySeparator?: React.ReactNode;\n CategoryHierarchyContainer: INodeProps;\n}\n\nexport interface ISortByViewProps {\n SortingContainer: INodeProps;\n sortByDropDown?: React.ReactNode;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Title component for search result container.\n */\nexport interface ISearchResultTitle {\n titlePrefix?: React.ReactNode;\n titleText?: React.ReactNode;\n titleCount?: React.ReactNode;\n}\n\nexport interface ISearchResultContainerState {\n sortingState: ISortByCollectionState;\n modalIsOpen: boolean;\n refiners: IProductRefinerHierarchy[];\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\n channelInventoryConfiguration?: ChannelInventoryConfiguration;\n}\n\ninterface ISortByCollectionState {\n selectedSortByOption: ILabeledDropdownOption;\n pending: boolean;\n}\n\n/**\n *\n * SearchResultContainer component.\n * @extends {React.PureComponent>}\n */\n@observer\nexport default class SearchResultContainer extends React.PureComponent<\n ISearchResultContainerProps,\n ISearchResultContainerState\n> {\n @computed get isMobile(): boolean {\n return this._viewport === 'xs' || this._viewport === 'sm';\n }\n\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\n ];\n\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\n\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\n\n @observable\n private _viewport: GridSize = 'lg';\n\n private readonly _modalToggleRef: React.RefObject;\n\n private readonly _sortAndFilterContainerRef: React.RefObject;\n\n private expandrefinerCount: number | undefined = 0;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly productPrices: ProductPrice[];\n\n private readonly defaultPageNumber = 0;\n\n private readonly catalogId = getCatalogId(this.props.context.request);\n\n private isListPageStateUpdated: boolean = false;\n\n private _isMounted: boolean = false;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation?.Text;\n }\n\n public constructor(props: ISearchResultContainerProps, state: ISearchResultContainerState) {\n super(props);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\n this._modalToggleRef = React.createRef();\n this._sortAndFilterContainerRef = React.createRef();\n this._toggleModal = this._toggleModal.bind(this);\n this._updateViewport = this._updateViewport.bind(this);\n this.productPrices = [];\n this.state = {\n sortingState: {\n pending: false,\n selectedSortByOption: this.sortByDropdownOptions[0]\n },\n modalIsOpen: false,\n refiners: [],\n channelInventoryConfiguration: undefined\n };\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\n\n const locale = this.props.context.request.locale;\n const telemetry = this.props.telemetry;\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\n const validationErrorRange = this.props.resources.validationErrorNotRange;\n this._refineItemCommonProps = {\n telemetry,\n locale,\n placeholderTextMax,\n minLabel,\n maxLabel,\n rangeNameFormat,\n validationErrorNaN,\n validationErrorRange\n };\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this._updateViewport();\n }\n public async componentDidMount(): Promise {\n this._isMounted = true;\n if (MsDyn365.isBrowser && window.addEventListener) {\n window.addEventListener('resize', this._updateViewport);\n this._updateViewport();\n }\n\n const listPageState = await this.props.data.listPageState;\n const products = await this.props.data.products;\n const channelInventoryConfiguration = await StoreOperationsDataActions.getInventoryConfigurationAsync({\n callerContext: this.props.context.actionContext\n });\n if (this._isMounted) {\n this.setState({ channelInventoryConfiguration });\n }\n\n this._updateListPageState(listPageState, products);\n\n // Initialize reaction based on listPageState properties\n reaction(\n () => {\n return [\n listPageState.activeFilters?.length,\n listPageState.currentPageNumber,\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\n ];\n },\n async () => {\n const newListPageState = await this.props.data.listPageState;\n const input = new GetFullProductsByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n\n // eslint-disable-next-line max-len -- existing code\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : JSON.stringify({\n ProductId: this.props.context.request.query?.productId,\n Recommendation: this.props.context.request.query?.recommendation\n }),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\n !!this.props?.config?.includeAttributes,\n this.props.config.updateRefinerPanel,\n this.props.context.request.locale,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\n newListPageState.totalProductCount = productResults.count;\n newListPageState.activeProducts = productResults.products;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\n if (\n this.props.config.enableAffiliationBasedPricing &&\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n\n await this._updateVariantAvailability();\n\n if (this.props.config.updateRefinerPanel) {\n const refinerInput = new RefinersByCollectionInput(\n newListPageState.pageType,\n this.props.context.request.apiSettings,\n {\n Paging: {\n Top: this.props.config.itemsPerPage,\n Skip: Math.max(\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\n this.defaultPageNumber\n )\n },\n count: true,\n Sorting: newListPageState.sortingCritera ?? {}\n },\n newListPageState.activeFilters ?? [],\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\n +(this.props.context.request.urlTokens.recordId || 0),\n this.props.context.request.query?.q\n ? this.props.context.request.query.q\n : this.props.context.request.query?.productId,\n false,\n this.props.config.updateRefinerPanel,\n undefined,\n this.catalogId,\n channelInventoryConfiguration\n );\n\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\n this.setState({ refiners });\n }\n }\n );\n\n if (\n this.props.config.enableAffiliationBasedPricing &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\n this._getActivePrice();\n }\n await this._updateVariantAvailability();\n }\n\n public componentWillUnmount(): void {\n this._isMounted = false;\n if (MsDyn365.isBrowser && window.removeEventListener) {\n window.removeEventListener('resize', this._updateViewport);\n }\n }\n\n public render(): JSX.Element {\n const {\n config: { imageSettings, className },\n resources,\n data: { listPageState, products: productCollection, featureProduct }\n } = this.props;\n\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\n this._updateListPageState(listPageState.result, productCollection.result);\n this.isListPageStateUpdated = true;\n }\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\n let errorText = '';\n if (!ArrayExtensions.hasElements(products)) {\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\n }\n const productsComponent = this._getProducts();\n const featureComponent = (\n \n );\n\n const searchResultContainerViewProps = {\n ...this.props,\n products: productsComponent,\n TitleViewProps: this._getCollectionTitle(),\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\n refineMenu: this._getRefineMenu(),\n className: classnames('ms-search-result-container', className),\n SearchResultContainer: {\n moduleProps: this.props,\n className: classnames('ms-search-result-container', className)\n },\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\n pagination: this._getPagination(),\n ProductsContainer: { className: 'ms-search-result-container__Products' },\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\n choiceSummary: this._getChoiceSummary(),\n modalToggle:\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\n \n ) : null,\n searchResultModal: this._getSearchResultModal(),\n isMobile: this.isMobile,\n errorMessage: errorText && ,\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\n similarLookProduct: searchProduct ? featureComponent : null,\n productPrices: this.productPrices,\n productsDimensionAvailabilities: this.state.productsDimensionAvailabilities\n };\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\n }\n\n /**\n * Get products variants dimension availabilities.\n * @returns Void.\n */\n private readonly _updateVariantAvailability = async (): Promise => {\n const context = this.props.context as ICoreContext;\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\n if (\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\n this.props.config.includeAttributes\n ) {\n await this._getProductsDimensionsAvailabilities();\n }\n };\n\n /**\n * Update the list page state with initial data.\n * @param listPageState -- List page State.\n * @param products -- Products.\n */\n @action\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\n let querySorting: SortColumn[] = [];\n const defaultPageNumber: number = 10;\n\n if (this._pageType === 'Category') {\n listPageState.pageType = 'Category';\n } else {\n listPageState.pageType = 'Search';\n }\n\n if (this.props.context.request.query?.sorting) {\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\n }\n\n listPageState.currentPageNumber =\n (this.props.context.request.query?.skip &&\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\n 0;\n listPageState.sortingCritera = { Columns: querySorting };\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\n listPageState.activeProducts = products.products;\n listPageState.totalProductCount = products.count;\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request) || [];\n if (this.props.context.request.query?.productId) {\n const featureProduct = this.props.data.featureProduct.result;\n if (featureProduct) {\n listPageState.featureProduct = featureProduct;\n }\n }\n };\n\n /**\n * Get products dimension availabilities.\n * @returns Void.\n */\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\n new DimensionAvailabilitiesForProductSearchResultInput(\n productsList,\n this.props.context as ICoreContext,\n DimensionSwatchDisplayTypes.productCard\n ),\n this.props.context.actionContext\n );\n\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\n this.setState({ productsDimensionAvailabilities });\n }\n };\n\n /**\n * Get the active price for the products.\n */\n private readonly _getActivePrice = async (): Promise => {\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\n const products = await getPriceForProductSearchResult(\n new PriceForProductSearchResultInput(productsList),\n this.props.context.actionContext\n );\n\n const listPageState = await this.props.data.listPageState;\n listPageState.activeProducts = products;\n };\n\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\n const { resources } = this.props;\n return SearchResultModal({\n resources: {\n modalCloseButtonText: resources.modalCloseButtonText,\n modalTitle: resources.modalTitle\n },\n isOpen: this.state.modalIsOpen,\n returnRef: this._modalToggleRef,\n onModalToggle: this._toggleModal\n });\n };\n\n private readonly _getCollectionTitle = (): ITitleViewProps => {\n const { data, context, resources } = this.props;\n\n let collectionTitle: string | undefined = '';\n if (context && context.request && context.request.query && context.request.query.q) {\n collectionTitle = `\"${context.request.query.q}\"`;\n } else {\n collectionTitle =\n (data.category.result &&\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\n (data.category.result && data.category.result.Name) ||\n this.props.context.request.query?.title ||\n '';\n }\n let productCountText = '';\n let productCountNumber: number | undefined;\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\n productCountNumber = data.listPageState.result.totalProductCount;\n } else if (data.products && data.products.result) {\n productCountNumber = data.products.result.count;\n }\n\n if (productCountNumber && productCountNumber !== 0) {\n productCountText =\n productCountNumber !== 1\n ? format(this.props.resources.numberOfProducts, productCountNumber)\n : this.props.resources.oneProduct;\n } else {\n productCountText = format(this.props.resources.numberOfProducts, 0);\n }\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\n const titlePrefix = ;\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\n\n return {\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\n title: {\n titlePrefix,\n titleText,\n titleCount\n }\n };\n };\n\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\n const { data } = this.props;\n const categoryHierarchy = data.categoryHierarchy.result;\n const categoryLinks =\n categoryHierarchy &&\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\n return (\n <Link\n key={index}\n text={value.Name}\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\n href={value.Url}\n />\n );\n });\n const categoryLinkSeparator = <Separator separator='/' />;\n\n return {\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\n categoryHierarchyList: categoryLinks,\n categoryHierarchySeparator: categoryLinkSeparator\n };\n };\n\n private readonly _getSortingDropDown = (): ISortByViewProps => {\n const { resources } = this.props;\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\n let dropdownOptions = this._getAllSortByOptions();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\n if (this.props.context.app.config.hideRating) {\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\n }\n\n const dropdown = (\n <LabeledDropdown\n labelClassname='reviews-list-sort-by'\n labelText={resources.sortByDropdownLabel}\n dropdownId='categorySortByDropdown'\n dropdownClassname='reviews-list-dropdown'\n toggleColor='link'\n dropdownOptions={dropdownOptions}\n selectedOption={activeDropdown}\n onSelectOption={this._updateSortByDropdown}\n ref={this._sortAndFilterContainerRef}\n />\n );\n return {\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\n sortByDropDown: dropdown\n };\n };\n\n private readonly _getPagination = (): React.ReactNode => {\n const { config, context, data, resources } = this.props;\n const listPageState = data.listPageState.result;\n const fullUrl = getCurrentUrl(context.request);\n const itemsPerPage = config.itemsPerPage || 10;\n // eslint-disable-next-line max-len -- existing code\n const skipCount = !ObjectExtensions.isNullOrUndefined(listPageState?.currentPageNumber)\n ? listPageState!.currentPageNumber * (this.props.config.itemsPerPage || 10)\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\n const totalItems = listPageState?.totalProductCount || 0;\n const previousText = resources.flipperPrevious;\n const nextText = resources.flipperNext;\n\n if (totalItems <= itemsPerPage) {\n return null;\n }\n return (\n <UncontrolledPagination\n className='ms-search-result-container__pagination'\n role='navigation'\n aria-label={resources.paginationAriaLabel}\n url={fullUrl.href}\n qsp='skip'\n items={totalItems}\n itemsPerPage={itemsPerPage}\n startingItem={skipCount}\n previousText={this._renderPrev(previousText)}\n nextText={this._renderNext(nextText)}\n previousAriaLabel={previousText}\n nextAriaLabel={nextText}\n telemetryContent={this.telemetryContent}\n />\n );\n };\n\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\n const { data, context, config } = this.props;\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\n const validRefiners =\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\n ? this.state.refiners.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n })\n : data.refiners.result &&\n data.refiners.result.filter(refiner => {\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\n });\n\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\n const expandedRefiners = this.expandrefinerCount;\n const subMenus =\n validRefiners &&\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\n return (\n <RefineSubmenu\n productRefinerHierarchy={productRefinerHierarchy}\n selectedRefinerValues={activeRefiners}\n refineItemCommonProps={this._refineItemCommonProps}\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\n key={index}\n onUpdateRefiners={this._onUpdateRefiners}\n urlBuilder={this._buildRefinerUrl}\n isDisabled={false}\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\n tempRangeTypeTODO={tempRangeTypeTODO}\n context={context}\n moduleId={this.props.id}\n moduleTypeName={this.props.typeName}\n telemetryContent={this.telemetryContent}\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\n isMobile={this.isMobile}\n />\n );\n });\n\n return {\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\n refiners: subMenus\n };\n };\n\n /**\n * Should hide from refiners.\n * @param refiner - The refiner.\n * @returns ShouldHideFromRefiners.\n */\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\n const { channelInventoryConfiguration } = this.state;\n const isInventorySortableAttribute =\n (this.props.data.products.result?.inventoryAwareSortableAttributeId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId) ||\n (channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.ProductAvailabilitySortableAttributeRecordId);\n\n const isInventoryProductAttribute =\n (this.props.data.products.result?.channelInventoryConfigurationId !== 0 &&\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||\n (channelInventoryConfiguration?.InventoryProductAttributeRecordId !== 0 &&\n refiner.RecordId === channelInventoryConfiguration?.InventoryProductAttributeRecordId);\n\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\n return (\n isInventorySortableAttribute ||\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\n isInventoryProductAttribute)\n );\n };\n\n private readonly _getChoiceSummary = (): React.ReactNode => {\n const { resources, data, telemetry } = this.props;\n const { channelInventoryConfiguration } = this.state;\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n const refinerValueName = this.props.data.refiners.result?.find(rating => rating.KeyName === 'Rating');\n return (\n <ChoiceSummary\n classNames='ms-choice-summary-by-category'\n clearAllText={resources.clearAllText}\n label={resources.choiceSummaryLabel}\n closeAriaLabel={resources.closeAriaLabel}\n selectedChoices={selectedRefiners}\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\n refinerHierarchy={data.refiners.result}\n choiceFormat={resources.choiceFormat}\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\n telemetry={telemetry}\n onChoiceClicked={this._onChoiceClicked}\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\n choiceAriaLabel={resources.choiceAriaLabel}\n telemetryContent={this.telemetryContent}\n context={this.props.context}\n channelInventoryConfigurationId={channelInventoryConfiguration?.InventoryProductAttributeRecordId}\n refinerValues={refinerValueName}\n />\n );\n };\n\n /**\n * Get Active products.\n * @returns - JSX Elements.\n */\n private readonly _getProducts = (): JSX.Element => {\n const {\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\n } = this.props;\n const { resources } = this.props;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\n\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\n const quickviewSlot = this.props.slots?.quickview?.[0];\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\n ? this.props.slots.productComparisonButton[0]\n : null;\n\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\n );\n return (\n <ProductSearchResultItems\n products={products}\n context={this.props.context}\n imageSettings={imageSettings}\n resources={resources}\n moduleType={this.props.typeName}\n moduleId={this.props.id}\n allowBackNavigation={shouldAllowBack}\n telemetryContent={this.telemetryContent}\n quickviewSlot={quickviewSlot}\n productComparisonButton={productComparisonButton}\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\n />\n );\n };\n\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n // eslint-disable-next-line max-len -- existing code\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\n !actionContext ? 'actionContext ' : ''\n } could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n window.history.pushState(\n {},\n '',\n buildListPageUrl(\n getCurrentUrl(this.props.context.request),\n undefined,\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\n undefined\n )\n );\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.sortingCritera = {\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\n };\n });\n };\n\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\n const { data } = this.props;\n\n if (!data.searchConfiguration.result) {\n return {};\n }\n\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\n return searchConfiguration.key === option.key;\n });\n\n if (mappedConfiguration) {\n return mappedConfiguration.sortColumn;\n }\n\n return {};\n };\n\n /**\n * Retrieves current sort criteria.\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\n */\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\n return sortCriteria!.Columns[0];\n }\n\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\n if (ArrayExtensions.hasElements(queryColumns)) {\n return queryColumns[0];\n }\n\n return undefined;\n };\n\n /**\n * Retrieves dropdown options.\n * @returns All dropdown options.\n */\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!searchConfiguration) {\n return [];\n }\n\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\n );\n\n return ArrayExtensions.validValues(mappedSearchConfiguration);\n };\n\n /**\n * Retrieves current selected dropdown option based on the sort criteria.\n * @returns Current dropdown option.\n */\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\n const activeSortColumn = this._getSortCriteriaColumn();\n\n const searchConfiguration = this.props.data.searchConfiguration.result;\n\n if (!activeSortColumn || !searchConfiguration) {\n return undefined;\n }\n\n const activeMappedConfig = searchConfiguration.find(\n mappedSearchConfig =>\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\n );\n if (!activeMappedConfig) {\n return undefined;\n }\n\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\n };\n\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\n const {\n context: { request: requestContext, actionContext }\n } = this.props;\n\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\n const error = `Refine menu cannot refine search criteria: \n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\n this.props.telemetry.warning(error);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result?.activeFilters || []\n );\n\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\n transaction(() => {\n this.props.data.listPageState.result!.currentPageNumber = 0;\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\n });\n };\n\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\n if (this.props.data.listPageState.result) {\n const newRefinementCriteria = getUpdatedRefinementCriteria(\n itemToggleNotification,\n this.props.data.listPageState.result.activeFilters || []\n );\n\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\n }\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\n return '';\n };\n\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\n const { data, telemetry } = this.props;\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\n return;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!notification.clearAll) {\n const selectedChoice = notification.choiceClicked;\n if (!selectedChoice) {\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\n return;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n\n // Set focus to sort and filter\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\n setTimeout(() => {\n dropdownElement && dropdownElement.focus();\n }, 50);\n }\n\n const fullUrl = getCurrentUrl(this.props.context.request);\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\n data.listPageState.result.currentPageNumber = 0;\n data.listPageState.result.activeFilters = currentRefinementCriteria;\n };\n\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\n const { data, telemetry } = this.props;\n const fullUrl = getCurrentUrl(this.props.context.request);\n\n if (!data.listPageState.result) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\n return fullUrl.href;\n }\n\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\n\n if (!isClearAll) {\n if (!selectedRefiner) {\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\n return fullUrl.href;\n }\n currentRefinementCriteria = currentRefinementCriteria.filter(\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\n );\n } else {\n currentRefinementCriteria = [];\n }\n\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\n };\n\n private _getViewport(): GridSize {\n if (MsDyn365.isBrowser) {\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\n }\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\n }\n\n private _toggleModal(): void {\n this.setState({\n modalIsOpen: !this.state.modalIsOpen\n });\n }\n\n private _updateViewport(): void {\n this._viewport = this._getViewport();\n\n if (this.state.modalIsOpen && !this.isMobile) {\n this._toggleModal();\n }\n }\n\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\n switch (refinerCount) {\n case expandRefinersCount.all:\n this.expandrefinerCount = validRefiners;\n break;\n case expandRefinersCount.one:\n this.expandrefinerCount = 1;\n break;\n case expandRefinersCount.two:\n this.expandrefinerCount = 2;\n break;\n case expandRefinersCount.three:\n this.expandrefinerCount = 3;\n break;\n case expandRefinersCount.four:\n this.expandrefinerCount = 4;\n break;\n default:\n this.expandrefinerCount = 0;\n }\n };\n\n /**\n * Renders a Pagination previous text.\n * @param paginationPreviousText - Pagination previous text from resources.\n * @returns Previous text and flipper icon.\n */\n private readonly _renderPrev = (paginationPreviousText: string) => {\n return (\n <div className='msc-pagination__prev'>\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\n <span className='prev-text'>{paginationPreviousText}</span>\n </div>\n );\n };\n\n /**\n * Renders a Pagination next text.\n * @param paginationNextText - Pagination next text from resources.\n * @returns Next text and flipper icon.\n */\n private readonly _renderNext = (paginationNextText: string) => {\n return (\n <div className='msc-pagination__next'>\n <span className='next-text'>{paginationNextText}</span>\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\n </div>\n );\n };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IAdditionalContentData, ILinksData } from '../video-player.props.autogenerated';\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Component props.\n */\nexport interface IVideoPlayerAdditionalContentProps {\n requestContext: Msdyn365.IRequestContext;\n additionalContent: IAdditionalContentData | undefined;\n handleAdditionalTextChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalParagraphChange(event: Msdyn365.ContentEditableEvent): void;\n handleAdditionalLinkTextChange(linkIndex: number, event: Msdyn365.ContentEditableEvent): void;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content view props.\n */\nexport interface IVideoPlayerAdditionalContentViewProps {\n additionalContentNode: INodeProps;\n additionalContentItems?: IVideoPlayerAdditionalContentItemViewProps;\n}\n\n/**\n * IVideoPlayerAdditionalContentProps: Interface for\n * Video Player Additional Content Item view props.\n */\nexport interface IVideoPlayerAdditionalContentItemViewProps {\n heading: React.ReactNode;\n text: React.ReactNode;\n links: React.ReactNode;\n additionalContentItemContainer: INodeProps;\n additionalContentItemLinks: INodeProps;\n}\n\n/**\n * Renders additional content heading.\n * @param additionalContentHeading - Additional content heading.\n * @param props - Video Player Additional content component props.\n * @returns Heading Node.\n */\nconst renderHeading = (additionalContentHeading: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentHeading}\n tag='p'\n className='ms-video-player__details__additional-content__text'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalTextChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param additionalContentParagraphText - Additional content paragraph text.\n * @param props - Video Player Additional content component props.\n * @returns Paragraph Node.\n */\nconst renderParagraph = (additionalContentParagraphText: string, props: IVideoPlayerAdditionalContentProps) => {\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Text\n text={additionalContentParagraphText}\n tag='p'\n className='ms-video-player__details__additional-content__paragraph'\n editProps={{\n /**\n * On edit event for heading text change.\n * @param event - Change event.\n */\n onEdit: event => {\n props.handleAdditionalParagraphChange(event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Renders additional content heading.\n * @param ctaLink - Additional content link.\n * @param props - Video Player Additional content component props.\n * @param linkIndex - Additional content link index.\n * @returns Link Node.\n */\nconst renderLinks = (ctaLink: ILinksData, props: IVideoPlayerAdditionalContentProps, linkIndex: number) => {\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: ctaLink.ariaLabel,\n className: 'ms-video-player__details__additional-content__cta__links',\n linkText: ctaLink.linkText,\n linkUrl: ctaLink.linkUrl.destinationUrl,\n openInNewTab: ctaLink.openInNewTab,\n role: 'link'\n };\n const requestContext = props.requestContext;\n return (\n <Msdyn365.Link\n key={linkIndex}\n link={editableLink}\n editProps={{\n /**\n * Handle additional Link Text change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n props.handleAdditionalLinkTextChange(linkIndex, event);\n },\n requestContext\n }}\n />\n );\n};\n\n/**\n * Create node for each additonal content item.\n * @param item - Video Player additonal content item props.\n * @param props - Video Player Additional content component props.\n * @returns IVideoPlayerAdditionalContentItemViewProps.\n */\nconst getAdditionalContentItems = (\n item: IAdditionalContentData,\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentItemViewProps => {\n const headingNode = item.heading && renderHeading(item.heading, props);\n const paragraphNode = item.subtext && renderParagraph(item.subtext, props);\n const linksNode = item.links?.map((ctaLink: ILinksData, index: number) => {\n return renderLinks(ctaLink, props, index);\n });\n\n return {\n heading: headingNode,\n text: paragraphNode,\n links: linksNode,\n additionalContentItemContainer: { className: 'ms-video-player__details__additional-content__container' },\n additionalContentItemLinks: { className: 'ms-video-player__details__additional-content__cta' }\n };\n};\n\n/**\n * VideoPlayerAdditionalContent component.\n * @param props - Video Player Additional content component props.\n * @returns Video Player Additional content view props.\n */\nexport const videoPlayerAdditionalContent = (\n props: IVideoPlayerAdditionalContentProps\n): IVideoPlayerAdditionalContentViewProps | undefined => {\n const { additionalContent } = props;\n if (!additionalContent) {\n return undefined;\n }\n\n const reactNodes: IVideoPlayerAdditionalContentItemViewProps = getAdditionalContentItems(additionalContent, props);\n return {\n additionalContentNode: { className: 'ms-video-player__details__additional-content' },\n additionalContentItems: reactNodes\n };\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IPlayerData, IPlayerOptions, IPlayerResources, IVideoMetadata, Player } from '@msdyn365-commerce/components';\nimport * as MsDyn365 from '@msdyn365-commerce/core';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n INodeProps,\n isMobile,\n ITelemetryContent,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, videoPlayerAdditionalContent } from './components/additional-content';\nimport { ILinksData, IVideoPlayerConfig, IVideoPlayerProps } from './video-player.props.autogenerated';\n\nexport interface IVideoPlayerViewProps extends IVideoPlayerProps<{}> {\n player: React.ReactNode;\n title?: React.ReactNode;\n text?: React.ReactNode;\n links?: React.ReactNode;\n detailsContainer?: INodeProps;\n detailsContainerCta?: INodeProps;\n additionalContent?: IVideoPlayerAdditionalContentViewProps;\n handleText?(): void;\n handleParagraph?(): void;\n handleAdditionalText?(): void;\n handleAdditionalParagraph?(): void;\n handleLink?(): void;\n handleAdditionalLink?(): void;\n}\n\n/**\n *\n * VideoPlayer component.\n * @extends {React.PureComponent<IVideoPlayerProps<IVideoPlayerData>>}\n */\nclass VideoPlayer extends React.PureComponent<IVideoPlayerProps<IVideoPlayerConfig>> {\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly isMobileDevice: boolean;\n\n public constructor(props: IVideoPlayerProps<IVideoPlayerConfig>) {\n super(props);\n this.isMobileDevice = isMobile({ variant: VariantType.Viewport, context: this.props.context.request }) === 'xs';\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n }\n\n public render(): JSX.Element {\n const options = {\n ...this.props.config,\n isMobileDevice: this.isMobileDevice\n };\n const video: MsDyn365.IVideoData = this.props.config.video;\n const playerResources: IPlayerResources = {\n playAriaLabel: this.props.resources.playLabel,\n pauseAriaLabel: this.props.resources.pauseLabel,\n playingAriaLabel: this.props.resources.playingLabel,\n pausedAriaLabel: this.props.resources.pausedLabel,\n muteAriaLabel: this.props.resources.muteLabel,\n unMuteAriaLabel: this.props.resources.unMuteLabel,\n fullScreenAriaLabel: this.props.resources.fullScreenLabel,\n exitFullScreenAriaLabel: this.props.resources.exitFullScreenLabel,\n seekBarLabel: this.props.resources.seekBarLabel,\n videoTimeDurationLabel: this.props.resources.videoTimeDurationLabel,\n closedCaptionLabel: this.props.resources.closedCaptionLabel\n };\n const videoMetaData: IVideoMetadata = {};\n\n if (video) {\n videoMetaData.videoId = video.id;\n videoMetaData.title = video.title;\n videoMetaData.duration = video.playTime;\n\n if (video.thumbnail) {\n videoMetaData.posterframeUrl = video.thumbnail.src;\n }\n\n if (video._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = video._links.binaryReferences;\n }\n }\n const videoPlayerData: IPlayerData = { options: options as IPlayerOptions, metaData: videoMetaData };\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n\n player: (\n <MsDyn365.Video className='' editProps={{ key: this.props.config.video, requestContext: this.props.context.request }}>\n <Player\n playerData={videoPlayerData}\n playerResources={playerResources}\n telemetryContent={this.telemetryContent}\n isEditor={this.props.context.request.params.isEditor}\n />\n </MsDyn365.Video>\n ),\n title: this._getVideoDetailsHeading(),\n text: this._getVideoDetailsParagraph(),\n links: this._getVideoDetailsLinks(),\n detailsContainer: { className: 'ms-video-player__details' },\n detailsContainerCTA: { className: 'ms-video-player__details__cta' },\n additionalContent: videoPlayerAdditionalContent({\n requestContext: this.props.context.request,\n additionalContent: this.props.config.additionalContent,\n handleAdditionalTextChange: this.handleAdditionalTextChange,\n handleAdditionalParagraphChange: this.handleAdditionalParagraphChange,\n handleAdditionalLinkTextChange: this.handleAdditionalLinkTextChange\n }),\n handleText: this.handleTextChange,\n handleParagraph: this.handleParagraphChange,\n handleAdditionalText: this.handleAdditionalTextChange,\n handleAdditionalParagraph: this.handleAdditionalParagraphChange,\n handleLink: this.handleLinkTextChange,\n handleAdditionalLink: this.handleAdditionalTextChange\n };\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n /**\n * Handle link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.links && this.props.config.links[Number(linkIndex)]) {\n this.props.config.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleTextChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.heading!.text = event.target.value;\n };\n\n /**\n * Handle paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleParagraphChange = (event: MsDyn365.ContentEditableEvent): void => {\n this.props.config.paragraph = event.target.value;\n };\n\n /**\n * Handle additional text change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalTextChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.heading = event.target.value;\n }\n }\n\n /**\n * Handle additional link text change.\n * @param linkIndex - The link index.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalLinkTextChange(linkIndex: number, event: MsDyn365.ContentEditableEvent): void {\n const additionalContent = this.props.config.additionalContent ?? {};\n if (additionalContent.links) {\n additionalContent.links[Number(linkIndex)].linkText = event.target.value;\n }\n }\n\n /**\n * Handle additional paragraph change.\n * @param event - The dialog that is allowed to remain open.\n */\n public handleAdditionalParagraphChange(event: MsDyn365.ContentEditableEvent): void {\n if (this.props.config.additionalContent) {\n this.props.config.additionalContent.subtext = event.target.value;\n }\n }\n\n /**\n * Get video details links.\n * @returns - React node.\n */\n private _getVideoDetailsLinks(): React.ReactNode[] | undefined {\n const { links } = this.props.config;\n const payLoad = getPayloadObject('click', this.telemetryContent, '');\n\n return links?.map((linkData: ILinksData, index: number) => {\n payLoad.contentAction.etext = linkData.linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, payLoad);\n const linkId = index;\n const editableLink: MsDyn365.ILinksData = {\n ariaLabel: linkData.ariaLabel,\n className: 'ms-video-player__details__cta__link',\n linkText: linkData.linkText,\n linkUrl: linkData.linkUrl.destinationUrl,\n openInNewTab: linkData.openInNewTab,\n role: 'button',\n additionalProperties: attributes\n };\n\n return (\n <MsDyn365.Link\n key={linkId}\n link={editableLink}\n editProps={{\n /**\n * Handle additional paragraph change.\n * @param event - The keyboard event.\n */\n onTextChange: event => {\n this.handleLinkTextChange(index, event);\n },\n requestContext: this.props.context.request\n }}\n />\n );\n });\n }\n\n private _getVideoDetailsHeading(): React.ReactNode | undefined {\n const { heading } = this.props.config;\n\n return (\n heading && (\n <MsDyn365.Text\n className='ms-video-player__details__title'\n tag={heading.tag ?? 'h1'}\n text={heading.text}\n editProps={{ onEdit: this.handleTextChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n\n private _getVideoDetailsParagraph(): React.ReactNode | undefined {\n const { paragraph } = this.props.config;\n\n return (\n paragraph && (\n <MsDyn365.RichTextComponent\n text={paragraph}\n className='ms-video-player__details__text'\n editProps={{ onEdit: this.handleParagraphChange, requestContext: this.props.context.request }}\n />\n )\n );\n }\n}\n\nexport default VideoPlayer;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * 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 const productImage =\n Name &&\n _renderProductImage(\n context,\n product.Name!,\n PrimaryImageUrl === undefined ? fallbackImage : PrimaryImageUrl,\n fallbackImage,\n imageSettings\n );\n return {\n key: `${RecordId}-item`,\n productImage,\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\n if (!isOrderQuantityLimitsFeatureEnabledInHq) {\n return false;\n }\n\n const useSiteBuilderSettings = this.props.data.featureState.result?.find(\n featureState => featureState.Name === 'RevertToSiteBuilderOrderQuantityLimitsSettings'\n )?.IsEnabled;\n\n if (useSiteBuilderSettings) {\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 isOrderQuantityLimitsFeatureEnabledInSiteSettings;\n } else {\n const cartConfiguration = this.props.data.cartConfiguration?.result;\n return !(cartConfiguration?.IgnoreOrderSettings ?? false);\n }\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","/*!\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\nimport { GiftWithPurchaseType, IGiftWithPurchaseViewProps } from './gift-with-purchase';\r\nimport { Modal, ModalBody, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport ProductComponent from '../../themes/venchi/views/components/product.component';\r\n\r\nconst GiftWithPurchaseView: React.FC<IGiftWithPurchaseViewProps> = (props: IGiftWithPurchaseViewProps) => {\r\n const { promotionProps, modalVisible, context, config, resources } = props;\r\n if (!promotionProps) {\r\n return null;\r\n }\r\n const tempProducts = promotionProps && promotionProps.productSelection && promotionProps.productSelection.length > 0 && (\r\n <ul className='row'>\r\n {promotionProps.productSelection.map((product: ProductSearchResult, index: number) => (\r\n <li key={index}>\r\n {promotionProps.gwpType === GiftWithPurchaseType.AUTO ? (\r\n <p className='venchi-gwp__free-count-label'>\r\n +{promotionProps.numberProductsOfGift} {config.modalFreeLabel?.toUpperCase()}\r\n </p>\r\n ) : null}\r\n <div className='ms-product-search-result__item'>\r\n <ProductComponent\r\n context={context}\r\n imageSettings={config.imageSettings}\r\n allowBack={false}\r\n id='gwp__0'\r\n key={product.RecordId}\r\n typeName='product-collection'\r\n data={{ product }}\r\n resources={resources}\r\n />\r\n </div>\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n return (\r\n <Modal\r\n id={'gwpModal'}\r\n isOpen={modalVisible}\r\n autoFocus\r\n fade={false}\r\n verticalPosition='top'\r\n toggle={props.closePopupCallback}\r\n modalClassName='text-center venchi-gwp'\r\n >\r\n <ModalHeader toggle={props.closePopupCallback}>{config.modalHeader}</ModalHeader>\r\n <div className={'venchi_popup'}>\r\n <ModalBody>\r\n <div className='venchi-gwp__body'>\r\n <p>{config.modalMainText}</p>\r\n {tempProducts}\r\n </div>\r\n </ModalBody>\r\n </div>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default GiftWithPurchaseView;\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 { INodeProps, Module, Node, getTelemetryObject, NodeTag } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IProductCollectionViewProps, IProductComponentViewProps } from '@msdyn365-commerce-modules/product-collection';\r\n\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { ProductComponent } from './components/product.component';\r\n\r\nimport { ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { IProductCollectionProps } from '../definition-extensions/product-collection.ext.props.autogenerated';\r\n\r\nimport { trackViewItemList } from '../utilities/datalayer/index';\r\n\r\nconst ProductCollectionView: React.FC<IProductCollectionViewProps & IProductCollectionProps<{}>> = props => {\r\n const {\r\n heading,\r\n ProductCollectionContainer,\r\n SingleSlideCarouselComponentProps,\r\n GridComponentProps,\r\n isCarousel,\r\n products,\r\n seeAllButton\r\n } = props;\r\n\r\n const [isViewItemTracked, setIsViewItemTracked] = React.useState<boolean>(false);\r\n\r\n React.useEffect(() => {\r\n if (products && !isViewItemTracked) {\r\n setIsViewItemTracked(true);\r\n\r\n trackViewItemList(\r\n props.context,\r\n props.config?.productCollection?.products as SimpleProduct[],\r\n props.config?.heading?.text || '',\r\n ''\r\n );\r\n }\r\n }, [products]);\r\n\r\n if (!products) {\r\n props.context.telemetry.error('Product collection content is empty, module wont render.');\r\n\r\n return null;\r\n }\r\n\r\n return (\r\n <Module {...ProductCollectionContainer}>\r\n {heading}\r\n {seeAllButton}\r\n {isCarousel\r\n ? _renderCarousel(SingleSlideCarouselComponentProps, _getProductTiles(props))\r\n : _renderGrid(GridComponentProps, _getProductTiles(props))}\r\n </Module>\r\n );\r\n};\r\n\r\nconst _renderCarousel = (carouselContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return <Node {...carouselContainer}>{items && items.map(_renderProduct)}</Node>;\r\n};\r\n\r\nconst _renderGrid = (gridContainer: INodeProps, items: IProductComponentViewProps[]): JSX.Element => {\r\n return <Node {...gridContainer}>{items && items.map(_renderProduct)}</Node>;\r\n};\r\n\r\nconst _renderProduct = (product: IProductComponentViewProps): JSX.Element => {\r\n const { ProductContainer, productComponent } = product;\r\n\r\n return <Node {...ProductContainer}>{productComponent}</Node>;\r\n};\r\n\r\nconst _getProductTiles = (props: IProductCollectionViewProps & IProductCollectionProps<{}>): IProductComponentViewProps[] => {\r\n const updatedProducts = props.config?.productCollection?.products?.map((item: ProductSearchResult, index: number) => {\r\n const getProductData = _getProduct(props, item, index);\r\n return !ObjectExtensions.isNullOrUndefined(getProductData) ? getProductData : undefined;\r\n });\r\n\r\n // Filter out 'undefined' values. Now, 'products' is guaranteed to be of type IProductComponentViewProps[]\r\n const productsView: IProductComponentViewProps[] = updatedProducts.filter((item): item is IProductComponentViewProps => {\r\n return item !== undefined;\r\n });\r\n return productsView;\r\n};\r\n\r\nconst _getProduct = (\r\n props: IProductCollectionViewProps & IProductCollectionProps<{}>,\r\n product: ProductSearchResult,\r\n index: number\r\n): IProductComponentViewProps | null => {\r\n if (!product || !product.Name) {\r\n props.telemetry.trace('[product-collection] Product or product name is null');\r\n return null;\r\n }\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const { imageSettings, allowBackNavigation } = props.config;\r\n const resources = props.resources;\r\n const breaCrumbType = props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const quickviewSlot = props.slots && props.slots.quickview && props.slots.quickview.length > 0 ? props.slots.quickview[0] : null;\r\n const productComparisonButtonSlot = ArrayExtensions.hasElements(props.slots.productComparisonButton)\r\n ? 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 = 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 <ProductComponent\r\n context={props.context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n ratingCountAriaLabel={reviewCountAriaLabelValue}\r\n allowBack={allowBack}\r\n id={props.id}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewSlot}\r\n productComparisonButton={productComparisonButtonSlot}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled?.IsEnabled}\r\n priceResources={priceResources}\r\n //TODO removed the dimensionAvailabilities feature for now\r\n dimensionAvailabilities={undefined}\r\n productCategoryUserPath=''\r\n productListName={props.config.heading ? props.config.heading.text : ''}\r\n resources={resources}\r\n />\r\n )\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\nimport { Module, Node, getTelemetryObject } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ISearchResultModalViewProps } from '@msdyn365-commerce-modules/search-result-container';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps,\r\n ISearchResultContainerData,\r\n ISearchResultContainerResources\r\n} from '@msdyn365-commerce-modules/search-result-container';\r\n\r\nimport { addPickAndMixListAsInfocodes_CAPAsync } from '../../../actions/DataActionExtension.g';\r\nimport { ISearchResultContainerProps as ISearchResultContainerExtensionProps } from '../definition-extensions/search-result-container.ext.props.autogenerated';\r\nimport Container from 'reactstrap/lib/Container';\r\nimport Row from 'reactstrap/lib/Row';\r\n\r\nimport { getCartState } from '@msdyn365-commerce/global-state';\r\nimport { ICartViewProps } from '@msdyn365-commerce-modules/cart';\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { CartLine, CommerceProperty, ProductRefinerValue, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport ProductComponent from './components/product.component';\r\n\r\nimport { getCategoryPageString, getSearchPageString } from '../utilities/datalayer/helpers';\r\nimport { trackAddToCartFromListing, trackAddVenchiMix, trackViewItemList, trackClickFilter } from '../utilities/datalayer/index';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps &\r\n ICartViewProps &\r\n ISearchResultContainerExtensionProps<ISearchResultContainerData>> = props => {\r\n const {\r\n SearchResultContainer,\r\n products,\r\n pagination,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n // isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n config,\r\n data\r\n } = props;\r\n\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n const catPage =\r\n props.context &&\r\n props.context.request &&\r\n props.context.request.urlTokens &&\r\n props.context.request.urlTokens.categories &&\r\n props.context.request.urlTokens.categories[0];\r\n const { categoryH1Title, isSearchPage, displayTitle } = config;\r\n\r\n const refinerStatusCount =\r\n props.data.listPageState.result && props.data.listPageState.result.activeFilters?.length\r\n ? props.data.listPageState.result.activeFilters?.length\r\n : null;\r\n\r\n const categoryNamesArray = data.categoryHierarchy.result\r\n ?.map(category => category.Name)\r\n .filter(name => name !== undefined)\r\n .concat(Array(5).fill(''))\r\n .slice(0, 5) as string[];\r\n const categoryUserPathString = categoryNamesArray.join('|');\r\n const listName = props.config.isSearchPage\r\n ? getSearchPageString()\r\n : data.categoryHierarchy.result?.[data.categoryHierarchy.result?.length - 1]?.Name ?? getCategoryPageString();\r\n\r\n React.useEffect(() => {\r\n const products = (data.listPageState.result && data.listPageState.result.activeProducts) || [];\r\n\r\n trackViewItemList(props.context, products.filter(p => p) as SimpleProduct[], listName, categoryUserPathString);\r\n }, []);\r\n\r\n const currentFilterCount = props.data.listPageState.result?.activeFilters?.length || 0;\r\n\r\n const [isFilterSeen, setIsFilterSeen] = React.useState<boolean>(false);\r\n const [prevFilterCount, setPrevFilterCount] = React.useState<number>(currentFilterCount);\r\n const [prevFilters, setPrevFilters] = React.useState<ProductRefinerValue[]>(props.data.listPageState.result?.activeFilters || []);\r\n\r\n React.useEffect(() => {\r\n if (isFilterSeen) {\r\n if (props.data.listPageState.result?.activeFilters?.length && props.data.refiners.result) {\r\n const currentFilterCount = props.data.listPageState.result?.activeFilters?.length;\r\n\r\n if (currentFilterCount > prevFilterCount) {\r\n const set1 = new Set(props.data.listPageState.result?.activeFilters.map(a => JSON.stringify(a)));\r\n const set2 = new Set(prevFilters.map(a => JSON.stringify(a)));\r\n\r\n const difference = new Set([...set1].filter(x => !set2.has(x)));\r\n\r\n if (difference.size === 1) {\r\n const uniqueString = difference.values().next().value;\r\n const currentFilter = props.data.listPageState.result?.activeFilters.find(a => JSON.stringify(a) === uniqueString);\r\n\r\n if (currentFilter?.LeftValueBoundString) {\r\n for (let item of props.data.refiners.result) {\r\n if (item.RecordId === currentFilter?.RefinerRecordId) {\r\n if (item.RecordId === 0) {\r\n if (item.Values[0].UnitText) {\r\n trackClickFilter(item.KeyName, '', {\r\n min: Number(currentFilter?.LeftValueBoundString),\r\n max: Number(currentFilter?.RightValueBoundString)\r\n });\r\n }\r\n } else {\r\n trackClickFilter(item.KeyName, currentFilter.LeftValueBoundString);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } else if (currentFilterCount === prevFilterCount) {\r\n // Price filter change\r\n const currentFilter = props.data.listPageState.result?.activeFilters.find(a => a.UnitText);\r\n\r\n for (let item of props.data.refiners.result) {\r\n if (item.RecordId === currentFilter?.RefinerRecordId) {\r\n if (item.RecordId === 0) {\r\n if (item.Values[0].UnitText) {\r\n trackClickFilter(item.KeyName, '', {\r\n min: Number(currentFilter?.LeftValueBoundString),\r\n max: Number(currentFilter?.RightValueBoundString)\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n setPrevFilterCount(currentFilterCount);\r\n setPrevFilters(props.data.listPageState.result?.activeFilters);\r\n }\r\n } else {\r\n setIsFilterSeen(true);\r\n }\r\n }, [props.data.listPageState.result?.activeFilters?.length]);\r\n\r\n /**\r\n * Get Active products.\r\n * @returns - JSX Elements.\r\n */\r\n const _getProducts = (): JSX.Element => {\r\n const {\r\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\r\n } = props;\r\n const { resources } = 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 = props.context.app.config.breadcrumbType;\r\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n\r\n const products = (data.listPageState.result && data.listPageState.result.activeProducts) || [];\r\n const quickviewSlot = props.slots?.quickview?.[0];\r\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\r\n ? props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n const isPriceMinMaxFeatureState = 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={props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={props.typeName}\r\n moduleId={props.id}\r\n allowBackNavigation={shouldAllowBack}\r\n telemetryContent={getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry)}\r\n quickviewSlot={quickviewSlot}\r\n productComparisonButton={productComparisonButton}\r\n channelInventoryConfigurationId={props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n //DISABLED FOR NOW\r\n productsDimensionAvailabilities={undefined}\r\n //DATALAYER INFO\r\n productCategoryUserPath={isSearchPage ? undefined : categoryUserPathString}\r\n productListName={listName}\r\n />\r\n );\r\n };\r\n\r\n if (catPage === 'pick-mix') {\r\n React.useEffect(() => {\r\n const introCtn = document.getElementsByClassName('category-intro__ctn')?.[0];\r\n const intro = document.getElementsByClassName('category-intro')?.[0];\r\n if (introCtn && intro) {\r\n introCtn?.appendChild(intro);\r\n }\r\n }, []);\r\n const localPm = typeof window !== 'undefined' && localStorage.getItem('pm_products');\r\n const localPmProds = localPm && localPm !== null ? localPm : JSON.stringify({});\r\n\r\n const pmProductsList = JSON.parse(localPmProds);\r\n //const cookiePmProducts = cookies.get('pm_products') === undefined ? {} : cookies.get('pm_products');\r\n // @ts-ignore\r\n props.context.pmProducts = pmProductsList;\r\n const [pmProducts, setPmProducts] = React.useState(pmProductsList);\r\n // @ts-ignore\r\n const initialTotalItems: number = Object.values(pmProducts).reduce((t, { Qty }) => Number(t) + Number(Qty), 0);\r\n // @ts-ignore\r\n const totalProducts = Object.values(pmProducts).map(tp => tp.Qty * tp.Price);\r\n const initialTotalPrice: number = Number(totalProducts.reduce((tp, qp) => tp + qp, 0));\r\n const [totalPrice, setTotalPrice] = React.useState(initialTotalPrice);\r\n const [totalItems, setTotalItems] = React.useState<number>(initialTotalItems);\r\n const [pmCartMessage, setPmCartMessage] = React.useState({\r\n status: 'empty',\r\n message: props.resources.productSelectionSpaceText\r\n });\r\n const [openPmCart, setOpenPmCart] = React.useState(false);\r\n\r\n const cookiePMset = () => {\r\n typeof window !== 'undefined' && localStorage.setItem('pm_products', JSON.stringify(pmProducts));\r\n const localPm = localStorage && localStorage.getItem('pm_products');\r\n const localPmProds = localPm && localPm !== null ? localPm : JSON.stringify({});\r\n const pmProductsList = JSON.parse(localPmProds);\r\n setPmProducts(pmProductsList);\r\n };\r\n\r\n const updatePmCart = () => {\r\n setPmProducts(pmProductsList);\r\n };\r\n\r\n React.useEffect(() => {\r\n const wrapper = document.getElementsByClassName('ms-search-result-container__Products')[0];\r\n // @ts-ignore\r\n const handleButtonClick = event => {\r\n const isButton = event.target.nodeName === 'BUTTON';\r\n if (!isButton) {\r\n return;\r\n }\r\n const timer = setTimeout(() => {\r\n updatePmCart();\r\n }, 100);\r\n return () => {\r\n clearTimeout(timer);\r\n };\r\n };\r\n wrapper.addEventListener('click', handleButtonClick);\r\n return () => wrapper.removeEventListener('click', handleButtonClick);\r\n });\r\n\r\n function removeProductFromPmCart(RecordId: number | string): void {\r\n if (typeof RecordId === 'number') {\r\n setPmCartMessage({ status: 'empty', message: props.resources.productSelectionSpaceText });\r\n delete pmProducts[RecordId];\r\n cookiePMset();\r\n } else {\r\n typeof window !== 'undefined' && localStorage.setItem('pm_products', JSON.stringify({}));\r\n setPmCartMessage({ status: 'empty', message: props.resources.productSelectionSpaceText });\r\n setPmProducts({});\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n // @ts-ignore\r\n setTotalItems(Object.values(pmProducts).reduce((t, { Qty }) => Number(t) + Number(Qty), 0));\r\n // @ts-ignore\r\n const totalNewProducts = Object.values(pmProducts).map(tp => tp.Qty * tp.Price);\r\n setTotalPrice(totalNewProducts.reduce((tp, qp) => tp + qp, 0));\r\n }, [pmProducts]);\r\n\r\n const _addToCart = async () => {\r\n const currentCartState = await getCartState(props.context?.actionContext);\r\n const pickAndMixItems = Object.values(pmProducts);\r\n const productsInfo: {\r\n name: string;\r\n id: string;\r\n price: string;\r\n quantity: string;\r\n // dimension12: string;\r\n list: string;\r\n category: string;\r\n }[] = [];\r\n\r\n if (pickAndMixItems.length >= 1) {\r\n pickAndMixItems.forEach(data => {\r\n // @ts-ignore\r\n const dataPrice = parseFloat(data.Price).toFixed(2);\r\n productsInfo.push({\r\n //@ts-ignore\r\n name: data.Item,\r\n //@ts-ignore\r\n id: data.Description,\r\n price: dataPrice,\r\n //@ts-ignore\r\n quantity: data.Qty,\r\n //@ts-ignore\r\n // 'dimension12': data.Id,\r\n list: 'Pick&Mix',\r\n category: 'Pick&Mix'\r\n });\r\n //@ts-ignore\r\n localStorage.setItem(data.Id ?? '', 'Pick&Mix' + ';' + 'Pick&Mix');\r\n });\r\n }\r\n\r\n trackAddToCartFromListing(\r\n props.context,\r\n {\r\n RecordId: 0,\r\n ItemId: '199000',\r\n Name: 'My Venchi Mix',\r\n BasePrice: totalPrice,\r\n Price: totalPrice,\r\n AdjustedPrice: totalPrice,\r\n ProductTypeValue: 0\r\n },\r\n categoryUserPathString,\r\n listName\r\n );\r\n\r\n trackAddVenchiMix(\r\n productsInfo.map(p => ({\r\n category: p.name,\r\n action: Number(p.quantity),\r\n label: Number(p.price)\r\n }))\r\n );\r\n\r\n pickAndMixItems.forEach(v => {\r\n // @ts-ignore\r\n delete v.PrimaryImageUrl;\r\n });\r\n //finally\r\n addPickAndMixListAsInfocodes_CAPAsync(\r\n { callerContext: props.context?.actionContext },\r\n JSON.stringify(pickAndMixItems),\r\n currentCartState.cart\r\n ).then(async res => {\r\n await currentCartState.refreshCart({});\r\n const cartLinesToPatch: CartLine[] | undefined = currentCartState.cart.CartLines?.filter(\r\n c =>\r\n c.ItemId === '199000' &&\r\n !c.ExtensionProperties?.filter(e => e.Key === 'venchiProductCategoryHierarchy')[0] &&\r\n !c.ExtensionProperties?.filter(e => e.Key === 'venchiProductListName')[0]\r\n );\r\n const cartLinesUpdated: CartLine[] = cartLinesToPatch\r\n ? cartLinesToPatch?.map(c => {\r\n let commerceProperties: CommerceProperty[] = c.ExtensionProperties ? c.ExtensionProperties : [];\r\n commerceProperties = [];\r\n commerceProperties.push(\r\n {\r\n Key: 'venchiProductListName',\r\n Value: { StringValue: listName }\r\n },\r\n {\r\n Key: 'venchiProductCategoryHierarchy',\r\n Value: { StringValue: categoryUserPathString }\r\n }\r\n );\r\n return {\r\n ...c,\r\n ExtensionProperties: commerceProperties\r\n };\r\n })\r\n : [];\r\n if (cartLinesUpdated.length) {\r\n await currentCartState.updateCartLines({\r\n updatedCartLinesObject: cartLinesUpdated\r\n });\r\n }\r\n });\r\n\r\n removeProductFromPmCart('reset');\r\n setPmCartMessage({ status: 'success', message: props.resources.pmSuccessAddedToCartMessage });\r\n setTimeout(() => {\r\n setPmCartMessage({ status: 'empty', message: props.resources.productSelectionSpaceText });\r\n }, 4000);\r\n };\r\n // @ts-ignore\r\n const AddToCartButtons = ({ total }) => {\r\n if (total === 0) {\r\n return (\r\n <>\r\n <button disabled className={'solid-button add-to-cart'}>\r\n {props.resources.addToCartButtonText}\r\n </button>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n\r\n <div className={`${pmCartMessage.status} empty_cart__text`}>{pmCartMessage.message}</div>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <button onClick={_addToCart} className={'solid-button add-to-cart'}>\r\n {props.resources.addToCartButtonText}\r\n </button>\r\n {/* tslint:disable-next-line:jsx-no-lambda react-this-binding-issue */}\r\n <button className={'hyperlink reset'} onClick={() => removeProductFromPmCart('reset')}>\r\n {props.resources.removeAllButtonText}\r\n </button>\r\n </>\r\n );\r\n };\r\n\r\n function mobileTriggerPmCart(): void {\r\n // tslint:disable-next-line:no-shadowed-variable\r\n setOpenPmCart(openPmCart => !openPmCart);\r\n openPmCart === true ? document.body.classList.remove('no-scroll-pick-mix') : document.body.classList.add('no-scroll-pick-mix');\r\n }\r\n return (\r\n <div className={'row pick-mix'}>\r\n <div className={'col-lg-7'}>\r\n <div className={'category-intro__ctn'} />\r\n <Node {...ProductsContainer}>{products}</Node>\r\n </div>\r\n <div className={'pm-cart--outer col-lg-4 offset-lg-1'}>\r\n <div className={'pm-cart--ctn'}>\r\n <h3>{props.resources.pickAndMixCartTitle}</h3>\r\n <Node className={'pm-cart'}>\r\n <>\r\n <div className={'pm-cart--top'} data-show_pm_cart={openPmCart}>\r\n <div className={'pm-cart--total'}>\r\n <div className={'pm-cart--total-items'}>\r\n <span className={'icon-pm-cart icon'} />\r\n <span className={'text'}>{totalItems}</span>\r\n </div>\r\n <div className={'pm-cart--total-price'}>\r\n {props?.context.cultureFormatter.formatCurrency(totalPrice)}\r\n </div>\r\n <button\r\n data-show_pm_cart={openPmCart}\r\n className={'mobile_open-cart'}\r\n onClick={mobileTriggerPmCart}\r\n />\r\n </div>\r\n <AddToCartButtons total={totalItems} />\r\n </div>\r\n <div className={'pm-cart--product-list'} data-show_pm_cart={openPmCart}>\r\n {Object.keys(pmProducts).map((keyName, i) => {\r\n return (\r\n <div className='pm-product' key={i}>\r\n <div className={'image'}>\r\n <img\r\n alt={pmProducts[keyName].Item}\r\n src={`${pmProducts[keyName].PrimaryImageUrl}&w=64&h=64&q=80&m=6&f=jpg`}\r\n />\r\n </div>\r\n <div className={'product-info'}>\r\n <div className={'name'}>{pmProducts[keyName]?.Item}</div>\r\n <div className={'quantity'}>Quantity: {pmProducts[keyName]?.Qty}</div>\r\n <div className={'price'}>\r\n {props?.context.cultureFormatter.formatCurrency(pmProducts[keyName]?.Price)}\r\n </div>\r\n <div className={'msc-product__extra-data'}>\r\n <span className={'data-product-id'}>{pmProducts[keyName]?.Id}</span>\r\n <span className={'data-product-sku'}>{pmProducts[keyName]?.Description}</span>\r\n </div>\r\n </div>\r\n {/* tslint:disable-next-line:jsx-no-lambda */}\r\n <button\r\n className={'remove-from-pmcart'}\r\n onClick={() => removeProductFromPmCart(Number(keyName))}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </>\r\n </Node>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n // if (isMobile) {\r\n // return (\r\n // <Module {...SearchResultContainer}>\r\n // {renderCategoryHierarchy(categoryHierarchy)}\r\n // {renderTitle(TitleViewProps)}\r\n // {choiceSummary}\r\n // {modalToggle}\r\n // {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n // <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n // <Node {...ProductsContainer}>\r\n // {errorMessage}\r\n // {products}\r\n // </Node>\r\n // {pagination}\r\n // </Module>\r\n // );\r\n // }\r\n // return (\r\n // <Module {...SearchResultContainer}>\r\n // <Node {...CategoryNavContainer}>\r\n // {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n // {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n // </Node>\r\n // <Node {...RefineAndProductSectionContainer}>\r\n // {refineMenu && renderRefiner(refineMenu)}\r\n // <Node {...ProductSectionContainer}>\r\n // {TitleViewProps && renderTitle(TitleViewProps)}\r\n // {choiceSummary}\r\n // {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n // <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n // <Node {...ProductsContainer}>\r\n // {errorMessage}\r\n // {products}\r\n // </Node>\r\n // {pagination}\r\n // </Node>\r\n // </Node>\r\n // </Module>\r\n // );\r\n\r\n React.useEffect(() => {\r\n let search_qParam = 'fallback_empty_search';\r\n if (props.context.request.query && props.context.request.query.q) {\r\n search_qParam = props.context.request.query.q;\r\n // Saving the user's expectations -- What were they actually searching for?\r\n }\r\n\r\n // @ts-ignore\r\n if (products && products.props.products.length === 0) {\r\n if (window.dataLayer) {\r\n window.dataLayer?.push?.({\r\n event: 'gaEvent',\r\n eventCategory: 'site_search',\r\n eventAction: 'unexpected_behaviour',\r\n eventLabel: search_qParam\r\n });\r\n }\r\n }\r\n }, []); // Empty dependency list = this only gets executed once\r\n /*\r\n Bing:\r\n\r\n The useEffect hook in React is designed to run after every render of the component.\r\n However, if you pass an empty array [] as the second argument to useEffect, it will only run once after the initial render,\r\n similar to the componentDidMount lifecycle method in class components.\r\n This is because the second argument to useEffect is an array of dependencies, and the effect will only re-run if one of the dependencies changes.\r\n By passing an empty array, you are telling React that the effect has no dependencies and should not re-run after the initial render2.\r\n */\r\n\r\n return (\r\n <>\r\n {/* TODO invert conditions */}\r\n {(displayTitle || false) && categoryHierarchy && (\r\n <Node {...CategoryNavContainer}>{renderCategoryHierarchy(categoryHierarchy, data, config.categoryH1Title)}</Node>\r\n )}\r\n {/* TODO change categorytitle */}\r\n {TitleViewProps && renderTitle(TitleViewProps, displayTitle || false, isSearchPage || false, categoryH1Title)}\r\n\r\n <Row fluid className='ms-search-result__sticky-top-bar'>\r\n <Container className='mobile-refiners-row'>\r\n <div className='mobile-refiners-row__button'>\r\n {modalToggle}\r\n {refinerStatusCount ? <div className='mobile-refiners-row__refiners-count'>{refinerStatusCount}</div> : null}\r\n </div>\r\n <div className='mobile-refiners-row__count'>{TitleViewProps.title.titleCount}</div>\r\n </Container>\r\n </Row>\r\n <Module {...SearchResultContainer}>\r\n {createSearchResultModal(searchResultModal, refineMenu, choiceSummary, sortByOptions, isRecoSearchPage)}\r\n <Node {...RefineAndProductSectionContainer}>\r\n <div className='desktop-refiners-left-container'>{refineMenu && renderRefiner(refineMenu)}</div>\r\n <Node {...ProductSectionContainer}>\r\n <Row fluid className='desktop_products_top_bar'>\r\n {TitleViewProps.title.titleCount}\r\n <div className='ms-search-result-wrapper-sort-by-category'>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </Row>\r\n <div className='desktop_choice-summary'>{choiceSummary}</div>\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {_getProducts()}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Node>\r\n </Module>\r\n </>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n choiceSummary_element: React.ReactNode,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, choiceSummary_element, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n choiceSummary_element: React.ReactNode,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(\r\n props.modalBody,\r\n {},\r\n renderSort(sortByDropDown, isRecoSearchPage),\r\n choiceSummary_element,\r\n renderRefiner(refineMenu)\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\nconst renderCategoryHierarchy = (\r\n props: ICategoryHierarchyViewProps,\r\n dataObj: ISearchResultContainerData,\r\n titleOvverride?: string\r\n): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n const currentCategory = dataObj.categoryHierarchy.result;\r\n if (categoryHierarchyList && categoryHierarchyList.length > 1) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {!categoryHierarchyList[index + 1] && titleOvverride ? (\r\n <a\r\n key={index}\r\n href={currentCategory ? currentCategory[index]?.Url : ''}\r\n aria-label={titleOvverride || ''}\r\n aria-current='location'\r\n >\r\n {' '}\r\n {titleOvverride || ''}{' '}\r\n </a>\r\n ) : (\r\n category\r\n )}\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, displayTitle: boolean, renderPrefix: boolean, titleOvverride?: string): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title && displayTitle) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <h1>\r\n {renderPrefix ? title.titlePrefix : null}\r\n {titleOvverride ? titleOvverride : title.titleText}\r\n </h1>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n//IMPORTED PRODUCT COMPONENT USAGE TO ADD THE DATALAYER PROPS\r\n\r\ninterface ISearchResultContainerResourcesExtended extends ISearchResultContainerResources {\r\n addToCartText: string;\r\n omnibusRecentLowestPrice: string;\r\n outOfStockString: string;\r\n}\r\n\r\ninterface IProductSearchResultItemsExtended {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: ISearchResultContainerResourcesExtended;\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 productCategoryUserPath?: string;\r\n productListName?: string;\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nconst ProductSearchResultItems: React.FC<IProductSearchResultItemsExtended> = ({\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 productCategoryUserPath,\r\n productListName\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) => (\r\n <li className='ms-product-search-result__item' key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={allowBackNavigation}\r\n id={moduleId}\r\n key={product.RecordId}\r\n typeName={moduleType}\r\n data={{ product }}\r\n quickViewButton={quickviewSlot}\r\n productComparisonButton={productComparisonButton}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxEnabled}\r\n priceResources={priceResources}\r\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\r\n dimensionAvailabilities={productsDimensionAvailabilities?.find(\r\n dimensionAvailability =>\r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n productCategoryUserPath={productCategoryUserPath}\r\n productListName={productListName}\r\n resources={resources}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n );\r\n};\r\n\r\nexport default SearchResultContainerView;\r\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 { IActiveImageAdditionalContentViewProps } from '../active-image-utilities';\nimport { IActiveImageViewProps } from './active-image';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IActiveImageAdditionalContentViewProps) => {\n return (\n <Node {...additionalContent.additionalContentNode}>\n {additionalContent.heading}\n <Node {...additionalContent.additionalContentContainer}>\n {additionalContent.text}\n <Node {...additionalContent.additionalContentItemLinks}>{additionalContent.links}</Node>\n </Node>\n </Node>\n );\n};\n\n/**\n * Render View.\n * @param props - The view props.\n * @returns -The JSX Element.\n */\nexport const activeImageView: React.FC<IActiveImageViewProps> = props => {\n return (\n <Module {...props.activePointContainer}>\n <Node {...props.activePointDetailsContainer}>\n {props.imageMapper}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </Node>\n <Node\n className='msc-active-image-product-card-container'\n style={{ top: `${props.productCardtopPosition}px`, left: `${props.productCardleftPosition}px` }}\n >\n {props.overlay}\n {props.productCard}\n </Node>\n </Module>\n );\n};\n\nexport default activeImageView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport { Module } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { ICarouselViewProps } from './carousel';\n\n/**\n * Returns item slots.\n * @returns Array of item slots.\n * @param props -Props.\n */\nconst retrieveItems = (props: ICarouselViewProps): React.ReactNode[] => {\n let items = [];\n items = props.slots && props.slots.content && props.slots.content.length > 0 ? props.slots.content : [];\n return items;\n};\nconst CarouselView: React.FC<ICarouselViewProps> = props => (\n <Module {...props.carouselContainer} {...props.renderModuleAttributes(props)}>\n <Carousel\n className={classnames(props.closeAnimation)}\n activeIndex={props.activeIndex}\n next={props.next}\n previous={props.previous}\n pause={props.config.pauseOnHover ? 'hover' : false}\n ride={props.config.autoplay ? 'carousel' : undefined}\n autoplay={props.config.autoplay}\n interval={props.config.interval}\n transitionType={props.config.transitionType ? props.config.transitionType : undefined}\n items={retrieveItems(props)}\n hideFlipper={props.config.hideFlipper}\n dismissEnabled={props.config.dismissEnabled}\n onIndicatorsClickHandler={props.onIndicatorsClickHandler}\n handleDismissCarousel={props.handleDismissCarousel}\n dismissCarouselAriaText={props.resources && props.resources.ariaLabelForDismissButton}\n indicatorAriaText={props.resources && props.resources.ariaLabelForSlide}\n directionTextPrev={props.resources && props.resources.flipperPrevious}\n directionTextNext={props.resources && props.resources.flipperNext}\n handleOnExited={props.handleOnExited}\n handleOnExiting={props.handleOnExiting}\n telemetryContent={props.telemetryContent}\n keyboard={props.config.keyboard}\n />\n </Module>\n);\n\nexport default CarouselView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365 from '@msdyn365-commerce/core';\nimport { IInvoiceSummaryLines } from '@msdyn365-commerce-modules/invoice-payment-summary';\nimport { IOrderSummaryLines } from '@msdyn365-commerce-modules/order-summary-utilities';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport { INodeProps, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ICartViewProps, IOrderSummaryErrors } from './cart';\nimport { ICartlinesViewProps } from './components/cart-line-items';\nimport { ICartLineItemViewProps } from './components/cart-line-items-promotion';\n\nconst _renderCartlines = (\n cartLines: ICartlinesViewProps[] | undefined,\n cartEmptyText: string,\n CartlinesWrapper: INodeProps,\n storeSelector: React.ReactNode | undefined,\n backToShoppingButton: React.ReactNode,\n waitingComponent: React.ReactNode,\n cartLoadingStatus: string,\n cartDataResult: boolean\n): JSX.Element[] | JSX.Element => {\n if (cartLoadingStatus) {\n return <>{cartLoadingStatus}</>;\n }\n if (cartLines) {\n return cartLines.map(cartLine => {\n return (\n <div className='msc-cart-lines-item' key={`${cartLine.cartlineId ?? ''}-${MsDyn365.isBrowser.toString()}`}>\n {cartLine.cartline}\n {storeSelector && cartLine.pickUpInStore ? (\n <Node {...cartLine.pickUpInStore.ContainerProps}>{cartLine.pickUpInStore.defaultComponent}</Node>\n ) : null}\n {cartLine.addToOrderTemplate ? (\n <Node className='msc-cart-line__extra-actions'>\n {cartLine.remove}\n {cartLine.addToWishlist}\n {cartLine.addToOrderTemplate}\n </Node>\n ) : (\n <>\n {cartLine.remove}\n {cartLine.addToWishlist}\n </>\n )}\n </div>\n );\n });\n }\n return cartDataResult ? (\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>{cartEmptyText}</p>\n {backToShoppingButton}\n </div>\n ) : (\n <>{waitingComponent}</>\n );\n};\n\n/**\n * Method will render error block.\n * @param errorData -The order summary errors interface.\n * @returns Jsx element.\n */\nconst _renderErrorBlock = (errorData: IOrderSummaryErrors | undefined): JSX.Element | null => {\n if (!errorData || !ArrayExtensions.hasElements(errorData.errors)) {\n return null;\n }\n return (\n <Node {...errorData.Wrapper}>\n {errorData.header}\n {errorData.errors}\n </Node>\n );\n};\n\n/**\n * Method will render invoice summary lines.\n * @param invoiceSummaryLines -The invoicesummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderInvoiceSummarylines = (\n invoiceSummaryLines: IInvoiceSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!invoiceSummaryLines) {\n props.context.telemetry.error('InvoiceSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {invoiceSummaryLines.invoices}\n {invoiceSummaryLines.giftCard}\n {invoiceSummaryLines.loyalty}\n {invoiceSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render order summary lines.\n * @param orderSummaryLines -The ordersummary lines interface.\n * @param OrderSummaryItems -The order summary items props.\n * @param props -The cartview props.\n * @returns Jsx element.\n */\nconst _renderOrderSummarylines = (\n orderSummaryLines: IOrderSummaryLines | undefined,\n OrderSummaryItems: INodeProps,\n props: ICartViewProps\n): JSX.Element | null => {\n if (!orderSummaryLines) {\n props.context.telemetry.error('OrderSummary content is empty, module wont render');\n return null;\n }\n return (\n <Node {...OrderSummaryItems}>\n {props.promoCode}\n {orderSummaryLines.subtotal}\n {orderSummaryLines.shipping}\n {orderSummaryLines.otherCharge}\n {orderSummaryLines.tax}\n {orderSummaryLines.totalDiscounts ? orderSummaryLines.totalDiscounts : null}\n {orderSummaryLines.orderTotal}\n </Node>\n );\n};\n\n/**\n * Method will render cart promotions.\n * @param promotions -The cartline item view props.\n * @returns Jsx element.\n */\nconst _renderPromotions = (promotions: ICartLineItemViewProps): JSX.Element | undefined => {\n return (\n <>\n <Node {...promotions.promotionMessageWrapper}>\n {promotions.promotionMessage}\n {promotions.promotionSeeAllLink}\n {promotions.promotionDialog}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines group title.\n * @param cartLine -The cartline view props.\n * @param titleSeparate -The title separate.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupTitle = (cartLine: ICartlinesViewProps, titleSeparate: string) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n return (\n <>\n <Node className='msc-cart-lines-group-wraper__bopis-heading-title'>\n {isBopisSelected ? (\n <p className='msc-cart-lines-group-wraper__bopis-heading-title-st'>\n {cartLine.pickUpInStore?.deliveryOption}\n {titleSeparate}\n {cartLine.pickUpInStore?.orgUnitName}\n </p>\n ) : null}\n </Node>\n </>\n );\n};\n\n/**\n * Method will render cartlines groups header title.\n * @param pickUpText -The pickup text for group.\n * @param shippingText -The shipping text for group.\n * @param emailShippingText -The email shipping text for group.\n * @param titleSeparate -The title separator.\n * @param cartLine -The cartline view props.\n * @param emailDeliveryModeCode -The email delivery code from channel.\n * @returns Jsx element.\n */\nconst renderCartLinesGroupHeader = (\n pickUpText: string,\n shippingText: string,\n emailShippingText: string,\n titleSeparate: string,\n cartLine: ICartlinesViewProps,\n emailDeliveryModeCode?: string\n) => {\n const isBopisSelected: boolean | undefined = cartLine.pickUpInStore?.isBopisSelected;\n let groupTitle: string;\n\n groupTitle = isBopisSelected ? pickUpText : shippingText;\n if (!StringExtensions.isNullOrEmpty(emailDeliveryModeCode)) {\n groupTitle = cartLine.data && cartLine.data.cartline.DeliveryMode === emailDeliveryModeCode ? emailShippingText : groupTitle;\n }\n\n return (\n <>\n <div className='msc-cart-lines-group-wraper__bopis-heading'>\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}-icon`} />\n <p className={`msc-cart-lines-group-wraper__bopis-heading-${groupTitle.toLowerCase()}`}>{groupTitle}</p>\n {renderCartLinesGroupTitle(cartLine, titleSeparate)}\n </div>\n </>\n );\n};\n\n/**\n * Method will render cartlines in groups.\n * @param props -The cartline.\n * @returns Jsx element.\n */\nconst renderCartLinesGroup = (props: ICartViewProps): JSX.Element | undefined => {\n if (props.cartLinesGroup && ArrayExtensions.hasElements(props.cartLinesGroup)) {\n return (\n <div className='msc-cart-lines-group'>\n {props.cartLinesGroup.map(cartlines => {\n return (\n <div key={cartlines[0].cartlineId} className='msc-cart-lines-group-wraper'>\n {renderCartLinesGroupHeader(\n props.resources.pickUpText,\n props.resources.shippingText,\n props.resources.emailshippingText,\n props.resources.titleSeparate,\n cartlines[0],\n props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode\n )}\n {_renderCartlines(\n cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n </div>\n );\n })}\n </div>\n );\n }\n return props.cartDataResult ? (\n <div className='msc-cartline-wraper'>\n <div className='msc-cart__empty-cart'>\n <p className='msc-cart-line'>{props.resources.emptyCartText}</p>\n {props.backToShoppingButton}\n </div>\n </div>\n ) : (\n <>{props.waitingComponent}</>\n );\n};\n\nconst CartView: React.FC<ICartViewProps> = (props: ICartViewProps) => (\n <div className={props.className} id={props.id} {...props.renderModuleAttributes(props)}>\n {props.title}\n {!props.cart?.hasInvoiceLine && props.promotionOptions && _renderPromotions(props.promotionOptions)}\n {props.multiplePickUpEnabled ? (\n renderCartLinesGroup(props)\n ) : (\n <Node {...props.CartlinesWrapper}>\n {_renderCartlines(\n props.cartlines,\n props.resources.emptyCartText,\n props.CartlinesWrapper,\n props.storeSelector,\n props.backToShoppingButton,\n props.waitingComponent,\n props.cartLoadingStatus,\n props.cartDataResult\n )}\n </Node>\n )}\n {props.orderSummaryHeading && (\n <Node {...props.OrderSummaryWrapper}>\n {props.orderSummaryHeading}\n {props.cart?.hasInvoiceLine\n ? _renderInvoiceSummarylines(props.invoiceSummaryLineitems, props.OrderSummaryItems, props)\n : _renderOrderSummarylines(props.orderSummaryLineitems, props.OrderSummaryItems, props)}\n {_renderErrorBlock(props.OrderSummaryErrors)}\n {props.checkoutAsSignInUserButton}\n {props.checkoutAsGuestButton}\n {props.expressCheckoutButton && ArrayExtensions.hasElements(props.expressCheckoutButton) ? (\n <Node {...props.ExpressCheckoutSectionWrapper}>{props.expressCheckoutButton}</Node>\n ) : null}\n {props.backToShoppingButton}\n {props.createTemplateFromCartButton}\n </Node>\n )}\n {props.storeSelector}\n </div>\n);\n\nexport default CartView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IProductCollectionViewProps, IProductComponentViewProps } from './product-collection';\nimport { IProductCollectionResources } from './product-collection.props.autogenerated';\n\nconst ProductCollectionView: React.FC<IProductCollectionViewProps> = props => {\n const {\n heading,\n ProductCollectionContainer,\n products,\n SingleSlideCarouselComponentProps,\n GridComponentProps,\n isCarousel,\n seeAllButton,\n resources\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\n // If no products are retrieved and the list type is promotional, still render the module to keep the entry of promotion page\n if (props.config.productCollection.listType === 'promotional') {\n return (\n <Module {...ProductCollectionContainer}>\n {heading}\n {seeAllButton}\n {_renderNoProduct(resources)}\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 _renderNoProduct = (resources: IProductCollectionResources): JSX.Element => {\n return (\n <Node className={''}>\n <p>{resources.noProductToRenderText}</p>\n </Node>\n );\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 { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchResultModalViewProps } from './components';\nimport {\n ICategoryHierarchyViewProps,\n IRefineMenuViewProps,\n ISearchResultContainerViewProps,\n ISortByViewProps,\n ITitleViewProps\n} from './search-result-container';\n\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\n const {\n SearchResultContainer,\n products,\n pagination,\n ProductsContainer,\n ProductSectionContainer,\n choiceSummary,\n isMobile,\n modalToggle,\n searchResultModal,\n TitleViewProps,\n refineMenu,\n categoryHierarchy,\n sortByOptions,\n CategoryNavContainer,\n RefineAndProductSectionContainer,\n errorMessage,\n FeatureSearchContainer,\n similarLookProduct\n } = props;\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\n if (isMobile) {\n return (\n <Module {...SearchResultContainer}>\n {renderCategoryHierarchy(categoryHierarchy)}\n {renderTitle(TitleViewProps)}\n {choiceSummary}\n {modalToggle}\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Module>\n );\n }\n return (\n <Module {...SearchResultContainer}>\n <Node {...CategoryNavContainer}>\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\n {TitleViewProps && renderTitleCount(TitleViewProps)}\n </Node>\n <Node {...RefineAndProductSectionContainer}>\n {refineMenu && renderRefiner(refineMenu)}\n <Node {...ProductSectionContainer}>\n {TitleViewProps && renderTitle(TitleViewProps)}\n {choiceSummary}\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\n <Node {...ProductsContainer}>\n {errorMessage}\n {products}\n </Node>\n {pagination}\n </Node>\n </Node>\n </Module>\n );\n};\n\nconst createSearchResultModal = (\n modalProps: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element => {\n return React.cloneElement(\n modalProps.modal,\n {},\n modalProps.modalHeader,\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\n modalProps.modalFooter\n );\n};\n\nconst createModalBody = (\n props: ISearchResultModalViewProps,\n refineMenu: IRefineMenuViewProps,\n sortByDropDown: ISortByViewProps,\n isRecoSearchPage?: string\n): JSX.Element | null => {\n if (sortByDropDown) {\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefiner(refineMenu));\n }\n return null;\n};\n\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\n if (refiners) {\n return (\n <Node {...RefinerSectionContainer}>\n <Node {...RefineMenuContainer}>\n {refiners.map((submenu, index) => (\n <React.Fragment key={index}>{submenu}</React.Fragment>\n ))}\n </Node>\n </Node>\n );\n }\n return null;\n};\n\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\n const { SortingContainer, sortByDropDown } = props;\n if (sortByDropDown && !isRecoSearchPage) {\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\n }\n return null;\n};\n\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\n if (categoryHierarchyList) {\n return (\n <Node {...CategoryHierarchyContainer}>\n {categoryHierarchyList.map((category, index) => (\n <React.Fragment key={index}>\n {category}\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\n </React.Fragment>\n ))}\n </Node>\n );\n }\n\n return null;\n};\n\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h2>\n {title.titlePrefix}\n {title.titleText}\n </h2>\n </Node>\n );\n }\n return null;\n};\n\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\n const { title, TitleContainer } = props;\n if (title) {\n return (\n <Node {...TitleContainer}>\n <h5>{title.titleCount}</h5>\n </Node>\n );\n }\n return null;\n};\n\nexport default SearchResultContainerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INodeProps, Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ISearchCategoryViewProps, ISearchFormViewProps, ISearchKeywordViewProps, ISearchProductViewProps } from './components';\nimport { ISearchViewProps } from './search';\n\nconst SearchView: React.FC<ISearchViewProps> = props => {\n const {\n Search,\n AutoSuggestAriaLabel,\n AutoSuggestAriaLabelText,\n searchText,\n AutoSuggest,\n KeywordSuggest,\n ProductSuggest,\n CategorySuggest,\n UlKeyword,\n UlProduct,\n UlCategory,\n form,\n autosuggestCategory,\n autosuggestKeyword,\n autosuggestProduct,\n SearchForm,\n FormWrapper,\n label,\n isLoadingAutoSuggest,\n isLoadingNode\n } = props;\n\n return (\n <Module {...Search}>\n {label}\n {_renderForm(form as ISearchFormViewProps, SearchForm, FormWrapper)}\n <Node {...AutoSuggest}>\n {searchText && searchText.length > 0 ? <Node {...AutoSuggestAriaLabel}>{AutoSuggestAriaLabelText}</Node> : ''}\n {_renderKeywordSuggestions(KeywordSuggest, UlKeyword, autosuggestKeyword, isLoadingAutoSuggest, isLoadingNode)}\n {_renderProductSuggestions(ProductSuggest, UlProduct, autosuggestProduct, isLoadingAutoSuggest, isLoadingNode)}\n {_renderCategorySuggestions(CategorySuggest, UlCategory, autosuggestCategory, isLoadingAutoSuggest, isLoadingNode)}\n </Node>\n </Module>\n );\n};\n\nconst _renderForm = (form: ISearchFormViewProps, SearchForm: INodeProps, FormWrapper: INodeProps) => {\n return (\n <Node {...SearchForm}>\n <Node {...FormWrapper}>\n {form.input}\n {form.cancelBtn}\n {form.submitBtn}\n </Node>\n </Node>\n );\n};\n\nconst _renderKeywordSuggestions = (\n KeywordSuggest: INodeProps,\n UlKeyword: INodeProps,\n keywordSuggestions?: ISearchKeywordViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n keywordSuggestions && (\n <Node {...KeywordSuggest}>\n <Node {...UlKeyword}>\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n keywordSuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderProductSuggestions = (\n ProductSuggest: INodeProps,\n UlProduct: INodeProps,\n productSuggestions?: ISearchProductViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n productSuggestions && (\n <Node {...ProductSuggest}>\n <Node {...UlProduct}>\n {productSuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n productSuggestions.items.map((item, index) => {\n return (\n <Node {...item.LiProduct} key={item.id || index}>\n <Node {...item.AProduct}>\n {item.thumbnail}\n {item.text}\n {item.price}\n </Node>\n </Node>\n );\n })}\n </Node>\n </Node>\n )\n );\n};\n\nconst _renderCategorySuggestions = (\n CategorySuggest: INodeProps,\n UlCategory: INodeProps,\n categorySuggestions?: ISearchCategoryViewProps,\n isLoadingAutoSuggest?: boolean,\n isLoadingNode?: React.ReactNode\n) => {\n return (\n categorySuggestions && (\n <Node {...CategorySuggest}>\n <Node {...UlCategory}>\n {categorySuggestions.title}\n {isLoadingAutoSuggest && isLoadingNode}\n {!isLoadingAutoSuggest &&\n categorySuggestions.text.map(text => {\n return text;\n })}\n </Node>\n </Node>\n )\n );\n};\n\nexport default SearchView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IVideoPlayerAdditionalContentViewProps, IVideoPlayerViewProps } from './index';\n\n/**\n * Render Additional Content.\n * @param additionalContent - Additional content view props.\n * @returns JSX Element.\n */\nconst renderAdditionalContent = (additionalContent: IVideoPlayerAdditionalContentViewProps) => {\n if (additionalContent.additionalContentItems) {\n return (\n <Node {...additionalContent.additionalContentNode}>\n <>\n {additionalContent.additionalContentItems.heading}\n <Node {...additionalContent.additionalContentItems.additionalContentItemContainer}>\n {additionalContent.additionalContentItems.text}\n <Node {...additionalContent.additionalContentItems.additionalContentItemLinks}>\n {additionalContent.additionalContentItems.links}\n </Node>\n </Node>\n </>\n </Node>\n );\n }\n\n return null;\n};\n\nconst VideoPlayerView: React.FC<IVideoPlayerViewProps> = props => {\n return (\n <div id={props.id} className='ms-video-player' {...props.renderModuleAttributes(props)}>\n {props.player}\n <Node {...props.detailsContainer} className={props.detailsContainer ? props.detailsContainer.className : ''}>\n {props.title}\n {props.text}\n {props.additionalContent && renderAdditionalContent(props.additionalContent)}\n <Node {...props.detailsContainerCta} className={props.detailsContainerCta ? props.detailsContainerCta.className : ''}>\n {props.links}\n </Node>\n </Node>\n </div>\n );\n};\n\nexport default VideoPlayerView;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\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 { IImageData, IImageSettings, Image, Video } from '@msdyn365-commerce/core';\nimport {\n IMediaData,\n IMediaGalleryThumbnailItemViewProps,\n IMediaGalleryThumbnailsViewProps,\n IMediaGalleryViewProps,\n MediaType\n} from '@msdyn365-commerce-modules/media-gallery';\nimport { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { Button, KeyCodes, Module, Node, NodeTag } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { IPlayerData, IPlayerOptions, IVideoMetadata, Player } from '@msdyn365-commerce-modules/video-player-utilities';\n\ninterface IMediaGalleryItemsProps extends IMediaGalleryThumbnailItemViewProps {\n Video?: React.ReactElement;\n}\n\n/**\n * Render the thumbnail item images.\n * @param thumbnail - The carousel thumbnail line props.\n * @returns Return HTML having thumbnail container props with image.\n */\nconst renderThumbnailItem = (thumbnail: IMediaGalleryItemsProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailItemContainerProps, Picture, Video } = thumbnail;\n\n return <Node {...ThumbnailItemContainerProps}>{Video ? Video : Picture}</Node>;\n};\n\n/**\n * Gets the thumbnail item to display media gallery images.\n * @param image - The media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param imageId - Image id.\n * @param modifiedActiveIndex - Modified Index of the images when selection changes.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render images.\n */\nconst GetThumbnailItemComponent = (\n image: IImageData,\n imageSettings: IImageSettings,\n imageId: number,\n modifiedActiveIndex: number,\n props: IMediaGalleryViewProps,\n mediaTypeValue?: MediaType\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n /**\n * OnClick method of media gallery item.\n */\n const onClick = () => {\n props.callbackToggle?.();\n props.callbackThumbnailClick?.(imageId);\n props.state.activeIndex = imageId;\n };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n modifiedActiveIndex === imageId ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n /**\n * Keydown event of media gallery item.\n * @param event - React.KeyboardEvent.\n */\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.keyCode === KeyCodes.Enter) {\n event.preventDefault();\n onClick();\n }\n };\n const defaultIndex = 0;\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'listitem',\n key: imageId\n },\n Picture: (\n <Node className='ms-fullscreen-section'>\n <Button\n aria-label={image.altText}\n className='msc-ss-carousel-vert-button-wrapper'\n onClick={onClick}\n onKeyDown={handleKeyDown}\n >\n <Image\n requestContext={props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail'\n {...image}\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.config.thumbnailImageSettings ?? imageSettings}\n loadFailureBehavior='hide'\n imageFallbackOptimize={props.state.shouldUseOptimizedImage}\n fallBackSrc={\n props.context.request.app?.config?.OmniChannelMedia ? '' : imageId === defaultIndex ? fallbackImage : image.src\n }\n bypassHideOnFailure={imageId === defaultIndex}\n />\n </Button>\n <Node\n className={\n mediaTypeValue === MediaType.Video ? 'ms-fullscreen-section__video-overlay' : 'ms-fullscreen-section__overlay'\n }\n >\n <Button\n onKeyDown={handleKeyDown}\n title={\n mediaTypeValue === MediaType.Video ? props.resources.playVideoTitleText : props.resources.fullScreenTitleText\n }\n role='button'\n className={\n mediaTypeValue === MediaType.Video\n ? 'ms-fullscreen-section__video-play-icon'\n : 'ms-fullscreen-section__magnifying-glass-icon'\n }\n onClick={onClick}\n />\n </Node>\n </Node>\n )\n };\n};\n\n/**\n * Render the video player.\n * @param mediaData - Media Data\n * @param index - Index of the video\n * @param activeIndex - Active Index\n * @param imageSettings - Image settings\n * @param props - Media gallery view props\n * @returns - JSX.Element.\n */\nconst RenderVideo = (\n mediaData: IMediaData,\n index: number,\n activeIndex: number,\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryItemsProps => {\n const videoData = mediaData.videoData;\n if (videoData) {\n const options: IPlayerOptions = props.config as IPlayerOptions;\n const playerResources = props.resources;\n const videoMetaData: IVideoMetadata = {};\n videoMetaData.videoId = videoData.id;\n videoMetaData.title = videoData.title;\n videoMetaData.duration = videoData.playTime;\n if (videoData.thumbnail) {\n videoMetaData.posterframeUrl = videoData.thumbnail.src;\n }\n if (videoData._links?.binaryReferences) {\n videoMetaData.videoBinaryReferences = videoData._links.binaryReferences;\n }\n const videoPlayerData: IPlayerData = { options, metaData: videoMetaData };\n\n const classes = classnames(\n 'ms-media-gallery__thumbnail-item',\n index === activeIndex ? 'ms-media-gallery__thumbnail-item-active' : ''\n );\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: classes,\n role: 'listitem',\n key: index\n },\n Picture: <></>,\n Video: (\n <Video className='ms-media-gallery__player' editProps={{ key: videoData, requestContext: props.context.request }}>\n <Player\n playerData={videoPlayerData}\n isEditor={props.context.request.params.isEditor}\n playerResources={playerResources}\n />\n </Video>\n )\n };\n }\n return GetEmptyThumbnailItemComponent(imageSettings, props);\n};\n\n/**\n * Gets the empty thumbnail item to display media gallery images.\n * @param imageSettings - Image settings for the image gallery items.\n * @param props - The Media gallery view props from business layer.\n * @returns Return thumbnail view props which will be used to render empty images.\n */\nconst GetEmptyThumbnailItemComponent = (\n imageSettings: IImageSettings,\n props: IMediaGalleryViewProps\n): IMediaGalleryThumbnailItemViewProps => {\n let fallbackImage: string | undefined = '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\n const emptyPlaceHolderImage = props.context.app.config?.placeholderImageName as string;\n\n if (props.data.product.result) {\n fallbackImage = getFallbackImageUrl(\n props.data.product.result.ItemId,\n props.context.request.apiSettings,\n props.context.request.app?.config?.OmniChannelMedia\n );\n }\n if (emptyPlaceHolderImage && fallbackImage) {\n fallbackImage = `${fallbackImage},${emptyPlaceHolderImage}`;\n }\n\n return {\n ThumbnailItemContainerProps: {\n tag: 'li' as NodeTag,\n className: 'ms-media-gallery__thumbnail-item',\n role: 'listitem',\n tabIndex: 0,\n key: 0,\n 'aria-label': ''\n },\n Picture: (\n <Image\n requestContext={props.context.actionContext.requestContext}\n className='ms-media-gallery__thumbnail-item__image'\n src='empty'\n gridSettings={props.context.request.gridSettings!}\n imageSettings={props.config.thumbnailImageSettings ?? imageSettings}\n loadFailureBehavior='empty'\n imageFallbackOptimize={!!props.config.skipImageValidation}\n fallBackSrc={fallbackImage}\n />\n )\n };\n};\n\n/**\n * Update media gallery items method.\n * @param items - The media gallery thumbnail item view props.\n * @returns The IImageData array.\n */\nconst getMediaGalleryItems = (items?: IMediaData[]): IMediaData[] | undefined => {\n return items?.map(item => {\n return {\n displayOrder: item.displayOrder,\n mediaTypeValue: item.mediaTypeValue,\n altText: item.altText,\n src: item.src,\n videoData: item.videoData\n };\n });\n};\n\nconst defaultThumbnailImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 },\n xl: { q: 'w=295&h=295&q=80&m=6&f=jpg', w: 295, h: 295 }\n },\n lazyload: true,\n cropFocalRegion: true\n};\n\n/**\n * Render the Media gallery thumbnails to represent images in grid view.\n * @param thumbnails - The thumbnail view props.\n * @param props - The media gallery view props.\n * @returns - The single slide carousel component to render as media gallery image.\n */\nconst renderThumbnails = (thumbnails: IMediaGalleryThumbnailsViewProps, props: IMediaGalleryViewProps): JSX.Element => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { ThumbnailsContainerProps, SingleSlideCarouselComponentProps } = thumbnails;\n const { state } = props;\n const mediaGalleryItems = getMediaGalleryItems(state.mediaGalleryItems);\n\n const items: IMediaGalleryItemsProps[] | undefined =\n // eslint-disable-next-line multiline-ternary -- need multiline for easy code reading\n state.lastUpdate && ArrayExtensions.hasElements(mediaGalleryItems) && mediaGalleryItems[0].src === 'empty'\n ? [GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props)]\n : // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery\n mediaGalleryItems?.map((item: IMediaData, id: number) => {\n if (item.mediaTypeValue === MediaType.Video) {\n if (props.config.allowFullScreen) {\n const videoThumbnail = item.videoData?.thumbnail;\n if (videoThumbnail) {\n return GetThumbnailItemComponent(\n videoThumbnail,\n defaultThumbnailImageSettings,\n id,\n state.activeIndex,\n props,\n item.mediaTypeValue\n );\n } else {\n return GetEmptyThumbnailItemComponent(defaultThumbnailImageSettings, props);\n }\n } else {\n return RenderVideo(item, id, state.activeIndex, defaultThumbnailImageSettings, props);\n }\n } else {\n return GetThumbnailItemComponent(item, defaultThumbnailImageSettings, id, state.activeIndex, props);\n }\n });\n\n return (\n <Node {...ThumbnailsContainerProps}>\n <Node {...SingleSlideCarouselComponentProps}>{items?.map(renderThumbnailItem)}</Node>\n </Node>\n );\n};\n\n/**\n * Render the Media gallery items using viewprops.\n * @param props - The media gallery view props.\n * @returns The media gallery module wrapping up images node.\n */\nconst mediaGalleryView: React.FC<IMediaGalleryViewProps> = props => {\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Dependency from media-gallery.tsx file\n const { CarouselProps, Thumbnails, MediaGallery, Modal } = props;\n\n // The thumbnails in AW theme aren't used as tabs\n const NewSingleSlideCarouselComponentProps = { ...Thumbnails.SingleSlideCarouselComponentProps, useTabList: false };\n const NewThumbnails = { ...Thumbnails, SingleSlideCarouselComponentProps: NewSingleSlideCarouselComponentProps };\n\n return (\n <Module {...MediaGallery}>\n <Node {...CarouselProps} />\n {Modal}\n {renderThumbnails(NewThumbnails, props)}\n </Module>\n );\n};\n\nexport default mediaGalleryView;\n","import { ArrayExtensions, getFallbackImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent } from '@msdyn365-commerce/components';\r\nimport { IComponentProps, IGridSettings, IImageSettings, Image } from '@msdyn365-commerce/core';\r\nimport { ChannelDeliveryOptionConfiguration, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { CartLine, CommerceProperty, SalesLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport classNames from 'classnames';\r\nimport * as React from 'react';\r\nimport { Quantity } from '../../utilities/quantity';\r\n\r\n/**\r\n * ICartlineResourceString: Interface for specifying the\r\n * resource strings that the component needs\r\n */\r\nexport interface ICartlineResourceString {\r\n /** Display string for discount label */\r\n discountStringText: string;\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** String for amount key */\r\n amountString?: string;\r\n /** Display string for quantity label */\r\n quantityDisplayString: string;\r\n /** Display string for quantity label */\r\n inputQuantityAriaLabel: string;\r\n /** Aria label for the decrement button in quantity component */\r\n decrementButtonAriaLabel: string;\r\n /** Aria label for the increment button in quantity component */\r\n incrementButtonAriaLabel: string;\r\n /** original text screenreader */\r\n originalPriceText: string;\r\n /** current text screenreader */\r\n currentPriceText: string;\r\n /** shipping Charges Text */\r\n shippingChargesText: string;\r\n}\r\n\r\ninterface ICartLineData {\r\n cartLine: CartLine | SalesLine;\r\n product: SimpleProduct;\r\n}\r\n\r\n/**\r\n * ICartLineProps: The props required to render cartLineitem\r\n */\r\nexport interface ICartLineProps extends IComponentProps<ICartLineData> {\r\n /** The flag to change the quantity component from interactible to static */\r\n disableQuantityInteractivity?: boolean;\r\n /** The primary image url */\r\n primaryImageUrl?: string;\r\n /** The product url */\r\n productUrl?: string;\r\n /** GridSettings for the product image in cartLine */\r\n gridSettings: IGridSettings;\r\n /** ImageSettings for the product image in cartLine */\r\n imageSettings: IImageSettings;\r\n /** Boolean flag to indicate if the item is out of stock */\r\n isOutOfStock?: boolean;\r\n /** Flag to make quantity section editable */\r\n isQuantityEditable?: boolean;\r\n /** Max quantity for line item */\r\n maxQuantity?: number;\r\n /** Current quantity for line item */\r\n currentQuantity?: number;\r\n /** Resource string for the component */\r\n resources: ICartlineResourceString;\r\n /** SalesLine flag */\r\n isSalesLine?: boolean;\r\n /** Error message to show in place of quantity */\r\n errorMessage?: string;\r\n /** Inventory information label */\r\n inventoryInformationLabel?: string;\r\n /** Inventory information class name */\r\n inventoryLabelClassName?: string;\r\n /** Flag to show/hide shipping charges for line items */\r\n showShippingChargesForLineItems?: boolean;\r\n /** Boolean flag to indicate if cart state status is ready */\r\n isCartStateReady?: boolean;\r\n /** Chanel Delivery Option configuration is from api. */\r\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\r\n /** The telemetry content */\r\n telemetryContent?: ITelemetryContent;\r\n /** Quantity onChange callback */\r\n quantityOnChange?(cartLine: CartLine, newQuantity: number): boolean;\r\n}\r\n\r\ninterface IDimensionStrings {\r\n /** String for size key */\r\n sizeString: string;\r\n /** String for color key */\r\n colorString: string;\r\n /** String associated with the configuration product dimension */\r\n configString: string;\r\n /** String for style key */\r\n styleString: string;\r\n /** String for amount key */\r\n amountString?: string;\r\n}\r\n\r\nconst CartLineItemFunctions = {\r\n renderProductDimensions: (Product: SimpleProduct, DimensionStrings: IDimensionStrings) => {\r\n if (!Product || !Product.Dimensions) {\r\n return [];\r\n }\r\n\r\n return Product.Dimensions.map(productDimension => {\r\n if (productDimension.DimensionTypeValue === 1) {\r\n return (\r\n <div key={`${Product.RecordId}ProductDimensions1`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-color'>\r\n {DimensionStrings.colorString}:\r\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 2) {\r\n return (\r\n <div key={`${Product.RecordId}ProductDimensions2`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-configuration'>\r\n {DimensionStrings.configString}:\r\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 3) {\r\n return (\r\n <div key={`${Product.RecordId}ProductDimensions3`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-size'>\r\n {DimensionStrings.sizeString}:\r\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n if (productDimension.DimensionTypeValue === 4) {\r\n return (\r\n <div key={`${Product.RecordId}ProductDimensions4`} className='msc-cart-line__product-variant-item'>\r\n <span className='msc-cart-line__product-variant-style'>\r\n {Product.IsGiftCard ? DimensionStrings.amountString : DimensionStrings.styleString}:\r\n <span className='name'>{productDimension.DimensionValue && productDimension.DimensionValue.Value}</span>\r\n </span>\r\n </div>\r\n );\r\n }\r\n return null;\r\n });\r\n },\r\n renderDiscountLines: (props: ICartLineProps) => {\r\n if (!props.data.cartLine.DiscountLines || props.data.cartLine.DiscountLines.length === 0) {\r\n return null;\r\n }\r\n return props.data.cartLine.DiscountLines.filter(discountLine => {\r\n return (discountLine.EffectiveAmount ?? 0) > 0.01;\r\n }).map((discountLine, index) => {\r\n let offerName = '';\r\n try {\r\n const offerDescriptions = JSON.parse(discountLine.OfferDescription || '{}');\r\n const currentLanguage = props.context.request.locale; // Function to get the current language\r\n const fullOfferDescription = offerDescriptions[currentLanguage.toLowerCase()] || offerDescriptions['it'] || '';\r\n offerName = fullOfferDescription.split(':')[0]; // Split on colon and take the first part\r\n } catch (e) {\r\n // If JSON parsing fails, use the OfferDescription as is, split on the colon\r\n if (discountLine.OfferDescription) {\r\n offerName = discountLine.OfferDescription.split(':')[0];\r\n }\r\n }\r\n offerName = offerName || discountLine.OfferName || '';\r\n return (\r\n <div key={discountLine.OfferId || index} className='msc-cart-line-item-product-discount'>\r\n <span>\r\n {offerName}:{` ${props.resources.discountStringText || 'Discount'} `}\r\n </span>\r\n <span className={'cart-line-item-product-discount-price'}>\r\n <PriceComponent\r\n data={\r\n props.isSalesLine\r\n ? {\r\n price: {\r\n // @ts-ignore\r\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\r\n }\r\n }\r\n : {\r\n price: {\r\n CustomerContextualPrice: discountLine.EffectiveAmount,\r\n BasePrice: discountLine.EffectiveAmount\r\n }\r\n }\r\n }\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n />\r\n </span>\r\n {(discountLine.Percentage !== undefined && discountLine.Percentage > 0) && <span>{`(${discountLine.Percentage}%)`}</span>}\r\n </div>\r\n );\r\n });\r\n },\r\n renderInventoryLabel: (props: ICartLineProps) => {\r\n if (!props.inventoryInformationLabel) {\r\n return null;\r\n }\r\n const inventoryCssName = props.inventoryLabelClassName\r\n ? `msc-cart-line__product-inventory-label ${props.inventoryLabelClassName}`\r\n : 'msc-cart-line__product-inventory-label';\r\n return <span className={inventoryCssName}>{props.inventoryInformationLabel}</span>;\r\n },\r\n renderShippingLabel: (props: ICartLineProps) => {\r\n const pickupDeliveryModeCode = props.context.request.channel?.PickupDeliveryModeCode;\r\n const channelDeliveryOptionConfig = props.channelDeliveryOptionConfig;\r\n const cartline = props.data.cartLine;\r\n let hasShippingMethod = false;\r\n if (channelDeliveryOptionConfig !== undefined) {\r\n hasShippingMethod =\r\n !!cartline.DeliveryMode &&\r\n channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.some(deliveryMode => deliveryMode !== cartline.DeliveryMode)\r\n ? true\r\n : false;\r\n } else {\r\n hasShippingMethod = !!cartline.DeliveryMode && cartline.DeliveryMode !== pickupDeliveryModeCode ? true : false;\r\n }\r\n if (!hasShippingMethod) {\r\n return undefined;\r\n }\r\n\r\n const shippingChargeLines = (cartline.ChargeLines || []).filter(chargeLine => chargeLine.IsShipping);\r\n\r\n if (shippingChargeLines.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const freightFee = shippingChargeLines.reduce((chargeTotal, chargeLine) => {\r\n return chargeTotal + (chargeLine.CalculatedAmount || 0);\r\n }, 0);\r\n\r\n const priceComponent = (\r\n <PriceComponent\r\n data={{\r\n price: {\r\n // @ts-ignore\r\n CustomerContextualPrice: freightFee\r\n }\r\n }}\r\n freePriceText={'Free'}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__freight-actual'\r\n />\r\n );\r\n return (\r\n <>\r\n <label className='msc-cart-line__freight-label'>{`${props.resources.shippingChargesText}:`}</label>\r\n <span className='shipping-value'>{priceComponent}</span>\r\n </>\r\n );\r\n },\r\n renderOtherCharges: (props: ICartLineProps) => {\r\n const cartline = props.data.cartLine;\r\n const otherCharges = cartline.ChargeLines?.filter(chargeline => !chargeline.IsShipping);\r\n\r\n return (\r\n (otherCharges &&\r\n otherCharges.map((otherCharge, key) => {\r\n return otherCharge && otherCharge.CalculatedAmount ? (\r\n <div className='msc-cart-line__other-charges' key={key}>\r\n <label className='msc-cart-line__other-charges-label'>{`${otherCharge.Description}:`}</label>\r\n <span className='other-charge-value'>\r\n <PriceComponent\r\n data={{\r\n price: {\r\n // @ts-ignore\r\n CustomerContextualPrice: otherCharge.CalculatedAmount\r\n }\r\n }}\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__other-charges-actual'\r\n />\r\n </span>\r\n </div>\r\n ) : (\r\n ''\r\n );\r\n })) ||\r\n undefined\r\n );\r\n }\r\n};\r\n\r\n// tslint:disable-next-line:max-func-body-length\r\nconst CartLine: React.FC<ICartLineProps> = (props: ICartLineProps) => {\r\n const { isSalesLine, productUrl, resources } = props;\r\n const { product, cartLine } = props.data;\r\n\r\n const destructDimensionStrings = {\r\n sizeString: resources.sizeString,\r\n colorString: resources.colorString,\r\n styleString: resources.styleString,\r\n configString: resources.configString,\r\n amountString: resources.amountString\r\n };\r\n\r\n const fallbackImageUrl = product && getFallbackImageUrl(product.ItemId, props.context.actionContext.requestContext.apiSettings);\r\n const productDimensions = product && CartLineItemFunctions.renderProductDimensions(product, destructDimensionStrings);\r\n const imageSettings = props.imageSettings;\r\n if (imageSettings) {\r\n imageSettings.cropFocalRegion = true;\r\n }\r\n const renderDisountLines = CartLineItemFunctions.renderDiscountLines(props);\r\n const renderInventoryLabel = CartLineItemFunctions.renderInventoryLabel(props);\r\n const renderShippingLabel = CartLineItemFunctions.renderShippingLabel(props);\r\n const renderOtherCharges = CartLineItemFunctions.renderOtherCharges(props);\r\n const payLoad = getPayloadObject('click', props.telemetryContent!, '', product?.RecordId.toString());\r\n const prodAttribute = getTelemetryAttributes(props.telemetryContent!, payLoad);\r\n const productName = product?.Name || cartLine.Description;\r\n\r\n const onChange = (newValue: number): boolean => {\r\n if (props.quantityOnChange) {\r\n return props.quantityOnChange(props.data.cartLine, newValue);\r\n }\r\n return true;\r\n };\r\n\r\n const _generateErrorMessage = (): JSX.Element | null => {\r\n if (props.errorMessage) {\r\n return (\r\n <div className='msc-alert__header'>\r\n <span className='msi-exclamation-triangle' />\r\n <span>{props.errorMessage}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n const _generateQuantityandPrice = (): JSX.Element[] | null => {\r\n const nodes = [];\r\n if (props.isOutOfStock) {\r\n const errorMessage = _generateErrorMessage();\r\n\r\n if (errorMessage) {\r\n return [errorMessage];\r\n }\r\n\r\n return null;\r\n }\r\n const isItemGWPAddedAutomatically = cartLine.ExtensionProperties?.some(\r\n (prop: CommerceProperty) => prop.Key === 'GWPType' && prop.Value?.StringValue === 'AUTO'\r\n )\r\n ? true\r\n : false;\r\n const isItemFree = cartLine.TotalAmount === 0;\r\n if (props.isQuantityEditable && !(isItemGWPAddedAutomatically && isItemFree)) {\r\n nodes.push(\r\n <div className='msc-cart-line__product-quantity'>\r\n <div className='msc-cart-line__product-quantity-label'>{resources.quantityDisplayString}</div>\r\n {_generateErrorMessage()}\r\n\r\n <Quantity\r\n id={`msc-cart-line__quantity_${props.data.product?.RecordId}`}\r\n max={props.maxQuantity || 10}\r\n currentCount={props.currentQuantity}\r\n onChange={onChange}\r\n inputQuantityAriaLabel={resources.inputQuantityAriaLabel}\r\n decrementButtonAriaLabel={resources.decrementButtonAriaLabel}\r\n incrementButtonAriaLabel={resources.incrementButtonAriaLabel}\r\n key={props.data.cartLine.LineId}\r\n disabled={!props.isCartStateReady}\r\n isGiftCard={props.data.product.IsGiftCard}\r\n telemetryContent={props.telemetryContent}\r\n />\r\n </div>\r\n );\r\n } else {\r\n nodes.push(\r\n <div className={classNames('msc-cart-line__quantity', { 'single-quantity': props.data.cartLine.Quantity === 1 })}>\r\n <label className='quantity-label'>{resources.quantityDisplayString}:</label>\r\n\r\n {_generateErrorMessage()}\r\n\r\n <span className='quantity-value'>{props.data.cartLine.Quantity}</span>\r\n </div>\r\n );\r\n }\r\n\r\n nodes.push(\r\n <div className='msc-cart-line__product-savings'>\r\n <PriceComponent\r\n data={\r\n isSalesLine\r\n ? {\r\n price: {\r\n // prettier-ignore\r\n // @ts-ignore\r\n CustomerContextualPrice: props.context.request.locale !== 'en-US' ? props.data.cartLine.TotalAmount : props.data.cartLine.NetAmount,\r\n BasePrice: props.data.cartLine.Price\r\n }\r\n }\r\n : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.NetAmountWithoutTax,\r\n BasePrice: props.data.cartLine.NetPrice\r\n }\r\n }\r\n }\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__product-savings-actual'\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n />\r\n {(props.data.cartLine.DiscountAmount && props.data.cartLine.DiscountAmount > 0 && (\r\n <>\r\n <span className='msc-cart-line__product-savings-label'>{` ${props.resources.discountStringText ||\r\n 'Discount'} `}</span>\r\n <PriceComponent\r\n data={\r\n props.isSalesLine\r\n ? {\r\n price: {\r\n // @ts-ignore\r\n CustomerContextualPrice: props.data.cartLine.PeriodicDiscount\r\n }\r\n }\r\n : {\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.DiscountAmountWithoutTax,\r\n BasePrice: props.data.cartLine.DiscountAmount\r\n }\r\n }\r\n }\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='msc-cart-line__product-savings-text'\r\n />\r\n </>\r\n )) ||\r\n null}\r\n </div>\r\n );\r\n\r\n return nodes;\r\n };\r\n\r\n // prettier-ignore\r\n // @ts-ignore\r\n const pmProductsVal = props?.data?.cartLine?.ExtensionProperties?.filter((fieldVal: { Key: string }) => fieldVal.Key === 'PickMixProperty_CAP')[0]?.Value?.StringValue;\r\n const pmProducts = pmProductsVal?.split('</>');\r\n const pmProductsInfo: { name: string; qty: string; price: string }[] = [];\r\n if (pmProducts && pmProducts.length > 0) {\r\n pmProducts.map(pmProduct => {\r\n const info = pmProduct.split(';');\r\n const PMname = info[0];\r\n const PMqty = info[2];\r\n const PMprice = info[3];\r\n pmProductsInfo.push({ name: PMname, qty: PMqty, price: props?.context.cultureFormatter.formatCurrency(PMprice) });\r\n });\r\n }\r\n return (\r\n <div className={`msc-cart-line product-type__${pmProductsInfo && pmProductsInfo.length > 0 ? 'pick-mix' : 'default'}`}>\r\n <div className='msc-cart-line__product-image'>\r\n <Image\r\n src={props.primaryImageUrl || ''}\r\n fallBackSrc={fallbackImageUrl}\r\n altText={productName}\r\n gridSettings={props.gridSettings}\r\n imageSettings={imageSettings}\r\n loadFailureBehavior='empty'\r\n />\r\n </div>\r\n <div className='msc-cart-line__content'>\r\n <div className='msc-cart-line__product'>\r\n <div className='msc-cart-line__product-title'>\r\n <a href={productUrl} {...prodAttribute}>\r\n {productName}\r\n </a>\r\n {ArrayExtensions.hasElements(productDimensions) ? (\r\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\r\n ) : (\r\n ''\r\n )}\r\n {pmProductsInfo && pmProductsInfo.length > 0 ? (\r\n <ul>\r\n {pmProductsInfo.map(\r\n pmProduct =>\r\n pmProduct?.name !== '' && (\r\n <li className='subproduct--pm'>\r\n {pmProduct?.qty} x {pmProduct?.name}{' '}\r\n <span className='subproduct--pm_price'>{pmProduct?.price}</span>\r\n </li>\r\n )\r\n )}\r\n </ul>\r\n ) : (\r\n ''\r\n )}\r\n <div className={'msc-product__extra-data'}>\r\n <span className={'data-product-id'}>{props.data.cartLine.ProductId}</span>\r\n <span className={'data-product-sku'}>{props.data.cartLine.ItemId}</span>\r\n </div>\r\n </div>\r\n {productDimensions && productDimensions.length > 0 ? (\r\n <div className='msc-cart-line__product-variants'>{productDimensions}</div>\r\n ) : (\r\n ''\r\n )}\r\n <div className='msc-cart-line__product-price'>\r\n <PriceComponent\r\n data={{\r\n price: {\r\n CustomerContextualPrice: props.data.cartLine.Price,\r\n BasePrice: props.data.cartLine.Price\r\n }\r\n }}\r\n // isSalesLine\r\n // ? {\r\n // price: {\r\n // // prettier-ignore\r\n // // @ts-ignore\r\n // CustomerContextualPrice: props.context.request.locale !== 'en-US' ? Math.max(Math.abs(props.data.cartLine.NetAmountWithAllInclusiveTax || 0) || 0, props.data.cartLine.TotalAmount || 0) : props.data.cartLine.NetAmount,\r\n // BasePrice: props.data.cartLine.Price\r\n // }\r\n // }\r\n // : {\r\n // price: {\r\n // CustomerContextualPrice:\r\n // props.context.request.locale !== 'en-US'\r\n // ? props.data.cartLine.TotalAmount\r\n // : props.data.cartLine.NetAmountWithoutTax,\r\n // BasePrice:\r\n // props.context.request.locale !== 'en-US'\r\n // ? props.data.cartLine.Price\r\n // : props.data.cartLine.NetPrice\r\n // }\r\n // }\r\n // }\r\n\r\n context={props.context}\r\n id={props.id}\r\n typeName={props.typeName}\r\n className='discount-value'\r\n />\r\n </div>\r\n {renderDisountLines}\r\n {renderInventoryLabel}\r\n {props.showShippingChargesForLineItems && <div className='msc-cart-line__freight'>{renderShippingLabel}</div>}\r\n {renderOtherCharges}\r\n </div>\r\n {_generateQuantityandPrice()}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default CartLine;\r\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 { PriceComponent } from '@msdyn365-commerce/components';\nimport { IComponentProps } from '@msdyn365-commerce/core';\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n Button,\n format,\n getPayloadObject,\n getTelemetryAttributes,\n IPayLoad,\n ITelemetryContent,\n TelemetryConstant\n} from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoCodeProps extends IComponentProps<{}> {\n cart: ICartState | undefined;\n promoCodeHeadingText: string;\n appliedPromoCodeHeadingText: string;\n removePromoAriaLabelFormat: string;\n promoPlaceholderText: string;\n promoCodeApplyButtonText: string;\n collapseTimeOut: number;\n removePromoText: string;\n invalidPromoCodeErrorText: string;\n failedToAddPromoCodeErrorText: string;\n duplicatePromoCodeErrorText: string;\n failedToRemovePromoCodeErrorText: string;\n\n /**\n * The telemetry content\n */\n telemetryContent?: ITelemetryContent;\n promoCodeApplyCallback?(): void;\n}\n\ninterface IPromoCodeState {\n isCollapseOpen: boolean;\n promoCodeInputValue: string;\n error: string;\n canApply: boolean;\n}\n\n/**\n *\n * The PromoCode component renders the promocode section.\n * @extends {React.PureComponent<IRefineSubmenuProps>}\n */\nclass PromoCode extends React.Component<IPromoCodeProps, IPromoCodeState> {\n private readonly payLoad: IPayLoad;\n\n constructor(props: IPromoCodeProps, state: IPromoCodeState) {\n super(props);\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, TelemetryConstant.ApplyPromoCode);\n this.state = {\n isCollapseOpen: false,\n promoCodeInputValue: '',\n error: '',\n canApply: false\n };\n }\n\n public shouldComponentUpdate(nextProps: IPromoCodeProps, nextState: IPromoCodeState): boolean {\n if (this.state === nextState && this.props.data === nextProps.data) {\n return false;\n }\n return true;\n }\n\n public render(): JSX.Element {\n return (\n <div>\n <div className='msc-promo-code-heading'>{this.props.promoCodeHeadingText}</div>\n {this._renderForm(this.props.promoPlaceholderText, this.props.promoCodeApplyButtonText, this.props.cart)}\n <p className={this.state.error ? 'msc-alert-danger' : ''} aria-live='assertive'>\n {this.state.error}\n </p>\n {this._renderAppliedPromoCode(this.props)}\n </div>\n );\n }\n\n private readonly _onInputChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\n const error = e.target.value === '' ? '' : this.state.error;\n this.setState({\n promoCodeInputValue: e.target.value.trim(),\n error,\n canApply: !!e.target.value\n });\n };\n\n private readonly _applyPromotion = (cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart) {\n return;\n }\n const appliedPromo = this.state.promoCodeInputValue;\n\n cartState\n .addPromoCode({ promoCode: appliedPromo })\n .then(result => {\n if (result.status === 'SUCCESS') {\n // Show success text\n this.setState({ promoCodeInputValue: '', error: '', canApply: false });\n } else if (result.substatus === 'ALREADYADDED') {\n this.setState({ error: this.props.duplicatePromoCodeErrorText });\n } else {\n this.setState({ error: this.props.invalidPromoCodeErrorText });\n }\n })\n .catch(error => {\n this.setState({ error: this.props.failedToAddPromoCodeErrorText });\n });\n };\n\n /**\n * On Submit function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _onSubmitHandler = (cartState: ICartState | undefined) => (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n this._applyPromotionHandler(cartState);\n };\n\n /**\n * On apply promotion function.\n * @param cartState -Cartstate.\n * @returns Apply promotion.\n */\n private readonly _applyPromotionHandler = (cartState: ICartState | undefined) => () => {\n this._applyPromotion(cartState);\n };\n\n private readonly _renderForm = (promoPlaceholderText: string, promoCodeApplyButtonText: string, cartState: ICartState | undefined) => {\n const attributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\n\n return (\n <form onSubmit={this._onSubmitHandler(cartState)} className='msc-promo-code__form-container'>\n <div className='msc-promo-code__group'>\n <input\n className='msc-promo-code__input-box'\n onChange={this._onInputChangeHandler}\n value={this.state.promoCodeInputValue}\n placeholder={promoPlaceholderText}\n />\n <Button\n title={promoCodeApplyButtonText}\n className='msc-promo-code__apply-btn btn'\n onClick={this._applyPromotionHandler(cartState)}\n disabled={!this.state.canApply}\n {...attributes}\n >\n {promoCodeApplyButtonText}\n </Button>\n </div>\n </form>\n );\n };\n\n private readonly _removePromotion = (cartState: ICartState | undefined, event: React.MouseEvent) => {\n if (!cartState) {\n return;\n }\n const code = event.currentTarget.getAttribute('data-value') || '';\n cartState\n .removePromoCodes({\n promoCodes: [code]\n })\n .then(result => {\n if (result.status === 'SUCCESS') {\n this.setState({ error: '' });\n }\n })\n .catch(() => {\n this.setState({ error: this.props.failedToRemovePromoCodeErrorText });\n });\n };\n\n private readonly _calculateDiscount = (code: string, cartState: ICartState | undefined) => {\n if (!cartState || !cartState.cart || !cartState.cart.CartLines || cartState.cart.CartLines.length === 0 || !code) {\n return;\n }\n let discountAmount = 0;\n for (const line of cartState.cart.CartLines) {\n if (line.DiscountLines) {\n for (const discountLine of line.DiscountLines) {\n if (discountLine.DiscountCode === code) {\n discountAmount += discountLine.DiscountCost!;\n }\n }\n }\n }\n return discountAmount * -1;\n };\n\n private readonly _renderAppliedPromoCode = (props: IPromoCodeProps) => {\n if (!props.cart || !props.cart.cart || !props.cart.cart.Coupons || props.cart.cart.Coupons.length === 0) {\n return;\n }\n\n const removePromotionHandler = (event: React.MouseEvent<HTMLElement>) => {\n this._removePromotion(props.cart, event);\n };\n\n const promoCodTotalDiscount = props.cart.cart.Coupons.reduce((count: number, coupon: Coupon) => {\n return count + (this._calculateDiscount(coupon.Code || '', props.cart) || 0);\n }, 0);\n\n return (\n <>\n <div className='msc-promo-code__discount'>\n <div className='msc-promo-code__discount-heading'>{this.props.appliedPromoCodeHeadingText}</div>\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: promoCodTotalDiscount\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__discount-value'\n />\n </div>\n {props.cart.cart.Coupons.map((coupon: Coupon) => {\n const ariaLabel = props.removePromoAriaLabelFormat\n ? format(props.removePromoAriaLabelFormat, props.removePromoText, coupon.Code)\n : '';\n\n return (\n <div key={coupon.Code} className='msc-promo-code__line-container'>\n <div className='msc-promo-code__line-value'>\n {coupon.Code}{' '}\n <PriceComponent\n data={{\n price: {\n CustomerContextualPrice: this._calculateDiscount(coupon.Code || '', props.cart)\n }\n }}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n className='msc-promo-code__line-discount-value'\n />\n </div>\n <Button\n title={props.removePromoText}\n className='msc-promo-code__line__btn-remove'\n onClick={removePromotionHandler}\n data-value={coupon.Code}\n aria-label={ariaLabel}\n >\n {props.removePromoText}\n </Button>\n </div>\n );\n })}\n </>\n );\n };\n}\n\nexport default PromoCode;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IImageData, IRequestContext, IVideoData } from '@msdyn365-commerce/core';\n\nexport enum MediaType {\n /**\n * The None.\n */\n None = 0,\n /**\n * The Image type.\n */\n Image = 1,\n /**\n * The video type.\n */\n Video = 2,\n /**\n * The file type.\n */\n File = 3\n}\n\nexport interface IMediaData extends IImageData {\n mediaTypeValue?: MediaType;\n displayOrder?: number;\n videoData?: IVideoData;\n}\n\n/**\n * Gets correct alt text for image based on configuration of site.\n * @param productName Product name.\n * @param context Current request context.\n * @param imageAltText Alt-text from CMS image.\n */\nexport function getAltText(\n context: IRequestContext,\n shouldUseCmsAltText: boolean,\n productName?: string,\n imageAltText?: string\n): string | undefined {\n if (!context?.app?.config?.OmniChannelMedia) {\n return productName;\n }\n if (shouldUseCmsAltText) {\n return imageAltText;\n }\n return productName;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as React from 'react';\n\nexport default (props: { className: string; msg?: string }) => (\n <>\n <div className={`${props.className}__loading__icon`} />\n {props?.msg && <div className={`${props.className}__loading__msg`}>{props?.msg}</div>}\n </>\n);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICoreContext } from '@msdyn365-commerce/core';\nimport { ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\nimport {\n AsyncResult,\n CartLine,\n CartLineValidationResults,\n CartLineValidationResultsByLineId,\n CartsDataActions,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\n\nimport { ITelemetry } from '@msdyn365-commerce/telemetry-internal';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Validate the cart.\n * @param isQuantityLimitsFeatureEnabled -- Is the quantity limits feature enabled.\n * @param cart -- The cart state to validate.\n * @param telemetry -- The telemetry.\n * @param propsContext -- The props context.\n * @param shouldRetry -- Should retry.\n * @returns A list of line data validation failures.\n */\nexport async function validateCartAsync(\n cart: AsyncResult<ICartState>,\n telemetry: ITelemetry,\n propsContext: ICoreContext,\n shouldRetry: boolean = true\n): Promise<CartLineValidationResultsByLineId | undefined> {\n let cartResult: ICartState;\n let cartVersion: number | undefined;\n try {\n cartResult = await cart;\n cartVersion = cartResult.cart.Version;\n } catch (error) {\n telemetry.warning(error);\n telemetry.debug('Unable to get cart or cart version.');\n return AsyncResult.resolve();\n }\n\n if (cartVersion) {\n try {\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\n { callerContext: propsContext.actionContext, bypassCache: 'none' },\n cartResult.cart.Id,\n cartVersion\n );\n\n return await AsyncResult.resolve(validationResult.ValidationResultsByLineId ?? undefined);\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- error type is not defined.\n if (shouldRetry && error.name === 'Microsoft_Dynamics_Commerce_Runtime_InvalidCartVersion') {\n try {\n await cartResult.refreshCart({});\n } catch (refreshError) {\n telemetry.warning(refreshError);\n telemetry.debug('Unable to refresh Cart');\n return AsyncResult.resolve();\n }\n try {\n await validateCartAsync(cart, telemetry, propsContext, false);\n return AsyncResult.resolve();\n } catch (validateError) {\n telemetry.warning(validateError);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n }\n\n telemetry.warning(error);\n telemetry.debug('Unable to validate Cart');\n return AsyncResult.resolve();\n }\n } else {\n telemetry.warning('Cart version not found for Cart validation request.');\n return AsyncResult.resolve();\n }\n}\n\n/**\n * Check if cart line quantity update is success.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function isCartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise<boolean> {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult.status === 'SUCCESS');\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve(false);\n}\n\n/**\n * Update cart line with cart action result.\n * @param isQuantityLimitsFeatureEnabled -- Is quantity limits feature enabled.\n * @param cartResult -- The cart result.\n * @param telemetry -- The telemetry.\n * @param products -- The products.\n * @param cartLineToUpdate -- The cart line to update.\n * @param quantity -- The quantity.\n * @returns Boolean to indicate if the cart line quantity is updated.\n */\nexport async function cartLineQuantityUpdatedAsync(\n isQuantityLimitsFeatureEnabled: boolean | undefined,\n cartResult: ICartState | undefined,\n telemetry: ITelemetry,\n products: SimpleProduct[] | undefined,\n cartLineToUpdate: CartLine,\n quantity: number\n): Promise<ICartActionResult | undefined> {\n if (cartResult) {\n let isUsingDefaultOrderSettingsMax: boolean = false;\n if (ArrayExtensions.hasElements(products) && isQuantityLimitsFeatureEnabled) {\n const modifiedProduct: SimpleProduct | undefined = products.find(\n (product: SimpleProduct) => product.RecordId === cartLineToUpdate.ProductId\n );\n isUsingDefaultOrderSettingsMax = !!modifiedProduct && !!modifiedProduct.Behavior?.MaximumQuantity;\n } else {\n isUsingDefaultOrderSettingsMax = false;\n }\n\n const input = {\n cartLineId: cartLineToUpdate.LineId!.toString(),\n newQuantity: quantity,\n additionalProperties: { isUsingDefaultOrderSettingsMax }\n };\n\n try {\n const updateLineResult: ICartActionResult = await cartResult.updateCartLineQuantity(input);\n return await AsyncResult.resolve(updateLineResult);\n } catch (error) {\n telemetry.warning((error as Error).message);\n telemetry.debug('Unable to update Cart Line quantity');\n }\n }\n\n return AsyncResult.resolve();\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy';\nimport { format } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IInvoiceSummaryProps {\n orderTotalLabel: string;\n invoiceLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n id: string;\n typeName: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n}\n\nexport interface IInvoiceSummaryLines {\n orderTotal: React.ReactNode;\n invoices: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n}\n\ninterface IInvoiceSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n}\n\nconst InvoiceSummaryLine: React.FC<IInvoiceSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel\n}) => {\n return (\n <p className={`msc-invoice-summary__line-${cssLabel}`}>\n <span className=\"msc-invoice-summary__label\">{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className=\"msc-invoice-summary__value\"\n />\n ) : (\n <span className=\"msc-invoice-summary__value\">{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildPaymentSummarySection = (\n props: IInvoiceSummaryProps,\n price: number | undefined,\n label: string,\n cssLabel: string\n): React.ReactNode => {\n return (\n <InvoiceSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nexport const InvoiceSummary = (props: IInvoiceSummaryProps) => {\n const { TotalAmount, CartLines } = props.cart;\n const invoiceLines = CartLines?.filter(cartLine => cartLine.IsInvoiceLine);\n const reactNodes: IInvoiceSummaryLines = {\n invoices: invoiceLines?.map((invoiceLine: CartLine) => {\n return _buildPaymentSummarySection(\n props,\n invoiceLine.InvoiceAmount,\n format(props.invoiceLabel, invoiceLine.InvoiceId),\n 'invoice'\n );\n }),\n orderTotal: _buildPaymentSummarySection(props, TotalAmount, props.orderTotalLabel, 'total')\n };\n\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildPaymentSummarySection(props, -loyaltyAmount, props.loyaltyLabel || 'Loyalty amount', 'loyalty');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildPaymentSummarySection(\n props,\n -giftCardAmount,\n props.giftcardLabel || 'Gift card amount',\n 'gift-card'\n );\n }\n\n reactNodes.orderTotal = _buildPaymentSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n props.orderTotalLabel,\n 'total'\n );\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { PriceComponent } from '@msdyn365-commerce/components';\nimport { ICoreContext, ITelemetry } from '@msdyn365-commerce/core';\nimport { ICheckoutState, IGiftCardExtend } from '@msdyn365-commerce/global-state';\nimport { Cart, ChannelConfiguration, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy';\nimport * as React from 'react';\n\nexport interface IOrderSummaryProps {\n subTotalLabel: string;\n shippingLabel: string;\n taxLabel: string;\n orderTotalLabel: string;\n loyaltyLabel?: string;\n giftcardLabel?: string;\n totalDiscountsLabel: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n id: string;\n typeName: string;\n otherChargeLabel?: string;\n freeText?: string;\n toBeCalculatedText?: string;\n checkoutState?: ICheckoutState;\n retailMultiplePickUpOptionEnabled?: boolean;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n isTaxIncludedInPrice?: boolean;\n isShowTaxBreakup?: boolean;\n customerAccountLabel?: string;\n}\n\nexport interface IOrderSummaryLines {\n subtotal: React.ReactNode;\n shipping?: React.ReactNode;\n otherCharge?: React.ReactNode;\n tax: React.ReactNode;\n orderTotal: React.ReactNode;\n totalDiscounts?: React.ReactNode;\n giftCard?: React.ReactNode;\n loyalty?: React.ReactNode;\n customerAccount?: React.ReactNode;\n}\n\ninterface IOrderSummaryLineProps {\n label: string;\n context: ICoreContext;\n telemetry: ITelemetry;\n price?: number;\n freeText?: string;\n toBeCalculatedText?: string;\n id: string;\n typeName: string;\n cssLabel: string;\n priceCurrency?: string;\n}\n\ninterface IShippingOrderLine {\n cart: Cart;\n channelConfiguration: ChannelConfiguration;\n canShip?: boolean;\n hasDeliveryMethod?: boolean;\n hasShippingMethod?: boolean;\n freightFee?: number;\n}\n\nconst OrderSummaryLine: React.FC<IOrderSummaryLineProps> = ({\n price,\n label,\n context,\n id,\n typeName,\n toBeCalculatedText,\n freeText,\n cssLabel,\n priceCurrency\n}) => {\n return (\n <p className={`msc-order-summary__line-${cssLabel}`}>\n <span className=\"msc-order-summary__label\">{label}</span>\n {price || price === 0 ? (\n <PriceComponent\n data={{\n price: { CustomerContextualPrice: price }\n }}\n freePriceText={freeText}\n context={context}\n id={id}\n typeName={typeName}\n className=\"msc-order-summary__value\"\n currencyCode={priceCurrency}\n />\n ) : (\n <span className=\"msc-order-summary__value\">{toBeCalculatedText}</span>\n )}\n </p>\n );\n};\n\nconst _buildOrderSummarySection = (\n props: IOrderSummaryProps,\n price: number | undefined,\n cssLabel: string,\n label: string = ''\n): React.ReactNode => {\n return (\n <OrderSummaryLine\n price={price}\n label={label}\n context={props.context}\n id={props.id}\n typeName={props.typeName}\n toBeCalculatedText={props.toBeCalculatedText}\n freeText={props.freeText}\n telemetry={props.telemetry}\n cssLabel={cssLabel}\n priceCurrency={props.channelConfiguration.Currency}\n />\n );\n};\n\nconst _computedLoyaltyAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.loyaltyAmount) || 0;\n};\n\nconst _computedCustomerAccountAmount = (checkoutState: ICheckoutState): number => {\n return (checkoutState && checkoutState.customerAccountAmount) || 0;\n};\n\nconst _computeGiftCardAmount = (checkoutState: ICheckoutState, cart: Cart): number => {\n const giftCardCounter = (count: number, giftCard: IGiftCardExtend) => {\n return count + (giftCard.Balance || 0);\n };\n const giftCardTotalValue = (checkoutState.giftCardExtends || []).reduce(giftCardCounter, 0);\n const amount = (cart.TotalAmount || 0) - _computedLoyaltyAmount(checkoutState);\n return Math.min(giftCardTotalValue, amount);\n};\n\nconst getDeliveryConfiguration = (\n cart: Cart,\n channelConfiguration: ChannelConfiguration,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n retailMultiplePickUpOptionEnabled?: boolean,\n isTaxIncludedInPrice?: boolean,\n isShowTaxBreakup?: boolean\n): IShippingOrderLine => {\n const pickupDeliveryModeCode = channelConfiguration && channelConfiguration.PickupDeliveryModeCode;\n const emailDeliveryModeCode = channelConfiguration && channelConfiguration.EmailDeliveryModeCode;\n const cartLines = cart.CartLines || [];\n const deliveryModes = cartLines.map(cartLine => cartLine.DeliveryMode);\n const taxOnShippingCharge = cart.TaxOnShippingCharge !== undefined ? cart.TaxOnShippingCharge : 0;\n const shippingChargeAmount = cart.ShippingChargeAmount !== undefined ? cart.ShippingChargeAmount : 0;\n\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True shippingChargeAmount\n // True True shippingChargeAmount\n // True false shippingChargeAmount + taxOnShippingCharge\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n let freightFee: number | undefined = 0;\n if (isTaxIncludedInPrice === undefined || isShowTaxBreakup === undefined) {\n freightFee = cart.ShippingChargeAmount;\n } else {\n freightFee = isTaxIncludedInPrice && !isShowTaxBreakup ? shippingChargeAmount + taxOnShippingCharge : cart.ShippingChargeAmount;\n }\n const canShip = deliveryModes.some(\n deliveryMode =>\n !(\n deliveryMode !== '' &&\n (deliveryMode ===\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) ||\n deliveryMode === emailDeliveryModeCode)\n )\n );\n const hasDeliveryMethod = deliveryModes.some(deliveryMode => !!deliveryMode && deliveryMode !== emailDeliveryModeCode);\n const hasShippingMethod = deliveryModes.some(\n deliveryMode =>\n !!deliveryMode &&\n deliveryMode !==\n getDeliveryMode(deliveryMode, retailMultiplePickUpOptionEnabled, channelDeliveryOptionConfig, pickupDeliveryModeCode) &&\n deliveryMode !== emailDeliveryModeCode\n );\n return {\n canShip,\n hasDeliveryMethod,\n hasShippingMethod,\n freightFee\n } as IShippingOrderLine;\n};\n\nconst getDeliveryMode = (\n deliveryMode?: string,\n featureSate: boolean = false,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration,\n pickupDeliveryMode?: string\n) => {\n if (!featureSate) {\n return pickupDeliveryMode;\n }\n return channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(dM => dM === deliveryMode);\n};\n\n// eslint-disable-next-line complexity\nexport const OrderSummary = (props: IOrderSummaryProps) => {\n const {\n SubtotalAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n SubtotalAmountWithoutTax,\n TaxAmount,\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Existing Property.\n TaxOnNonShippingCharges,\n DiscountAmount = 0,\n TotalAmount,\n OtherChargeAmount\n } = props.cart;\n\n const { canShip, hasDeliveryMethod, hasShippingMethod, freightFee } = getDeliveryConfiguration(\n props.cart,\n props.channelConfiguration,\n props.channelDeliveryOptionConfig,\n props.retailMultiplePickUpOptionEnabled,\n props.isTaxIncludedInPrice,\n props.isShowTaxBreakup\n );\n\n let reactNodes: IOrderSummaryLines;\n // if either of isTaxIncludedInPrice or isShowTaxBreakup is undefined then we will execute old logic\n if (props.isTaxIncludedInPrice === undefined || props.isShowTaxBreakup === undefined) {\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, SubtotalAmount, 'sub-total', props.subTotalLabel),\n tax: _buildOrderSummarySection(props, hasDeliveryMethod ? TaxAmount : undefined, 'tax-amount', props.taxLabel),\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, OtherChargeAmount, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n } else {\n const otherChargeAmount = OtherChargeAmount !== undefined ? OtherChargeAmount : 0;\n const taxOnNonShippingCharges = TaxOnNonShippingCharges !== undefined ? TaxOnNonShippingCharges : 0;\n const isTaxGreaterThanZero = TaxAmount !== undefined && TaxAmount > 0;\n // isTaxIncludedInPrice isShowTaxBreakup useProperties\n // False False/True otherChargeAmount\n // True True otherChargeAmount\n // True false otherChargeAmount+TaxOnNonShippingCharges\n\n const otherChargeAmountTotal =\n props.isTaxIncludedInPrice && !props.isShowTaxBreakup ? otherChargeAmount + taxOnNonShippingCharges : otherChargeAmount;\n\n const subtotalAmountActual = props.isTaxIncludedInPrice && props.isShowTaxBreakup ? SubtotalAmountWithoutTax : SubtotalAmount;\n\n reactNodes = {\n subtotal: _buildOrderSummarySection(props, subtotalAmountActual, 'sub-total', props.subTotalLabel),\n tax: props.isShowTaxBreakup\n ? _buildOrderSummarySection(\n props,\n hasDeliveryMethod || isTaxGreaterThanZero ? TaxAmount : undefined,\n 'tax-amount',\n props.taxLabel\n )\n : '',\n orderTotal: _buildOrderSummarySection(props, TotalAmount, 'total', props.orderTotalLabel),\n otherCharge:\n (OtherChargeAmount && _buildOrderSummarySection(props, otherChargeAmountTotal, 'other-charges', props.otherChargeLabel)) ||\n undefined\n };\n }\n if (canShip) {\n reactNodes.shipping = _buildOrderSummarySection(props, hasShippingMethod ? freightFee : undefined, 'shipping', props.shippingLabel);\n }\n if (props.checkoutState) {\n const giftCardAmount = _computeGiftCardAmount(props.checkoutState, props.cart);\n const loyaltyAmount = _computedLoyaltyAmount(props.checkoutState);\n const customerAccountAmount = _computedCustomerAccountAmount(props.checkoutState);\n const totalAmountAfterGiftCard = (TotalAmount || 0) - giftCardAmount - loyaltyAmount - customerAccountAmount;\n\n if (loyaltyAmount > 0) {\n reactNodes.loyalty = _buildOrderSummarySection(props, -loyaltyAmount, 'loyalty', props.loyaltyLabel || 'Loyalty amount');\n }\n\n if (giftCardAmount > 0) {\n reactNodes.giftCard = _buildOrderSummarySection(props, -giftCardAmount, 'gift-card', props.giftcardLabel || 'Gift card amount');\n }\n\n if (customerAccountAmount > 0) {\n reactNodes.customerAccount = _buildOrderSummarySection(\n props,\n -customerAccountAmount,\n 'customer-credit-amount',\n props.customerAccountLabel || 'Customer Credit amount'\n );\n }\n\n reactNodes.orderTotal = _buildOrderSummarySection(\n { ...props, freeText: undefined },\n totalAmountAfterGiftCard,\n 'total',\n props.orderTotalLabel\n );\n }\n\n if (DiscountAmount > 0) {\n reactNodes.totalDiscounts = _buildOrderSummarySection(props, -DiscountAmount, 'total-discounts', props.totalDiscountsLabel);\n }\n\n return reactNodes;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { ICartState } from '@msdyn365-commerce/global-state';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\n\n/**\n * Find the product in array of products considering product id.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @returns - The found product.\n */\nexport function getProductByProductId(productId: number | undefined, products?: SimpleProduct[]): SimpleProduct | undefined {\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId;\n });\n }\n\n return undefined;\n}\n\n/**\n * Find the product in array of products considering product id and product behavior's warehouse.\n * @param productId - The searched product id.\n * @param products - The array of products in which search is executed.\n * @param warehouseId - Warehouse id of cartLine.\n * @param cartState - The cart start in case cart line has no warehouse.\n * @returns - The found product.\n */\nexport function getProductByProductIdAndWarehouse(\n productId: number | undefined,\n products?: SimpleProduct[],\n warehouseId?: string,\n cartState?: ICartState\n): SimpleProduct | undefined {\n const targetWarehouseValue = warehouseId ?? cartState?.cart.WarehouseId;\n\n if (productId !== undefined && ArrayExtensions.hasElements(products)) {\n return products.find(product => {\n return productId === product.RecordId && product.Behavior?.InventoryLocationId === targetWarehouseValue;\n });\n }\n\n return undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n commerceApiRequest,\n commerceVideoMetadataRequest,\n getCatalogId,\n IActionContext,\n IImageData,\n IImageSettings,\n IVideoData\n} from '@msdyn365-commerce/core';\nimport { MediaLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport {\n ArrayExtensions,\n getMediaLocationsForSelectedVariant,\n MediaLocationsForSelectedVariantInput\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { getAltText } from './helper';\n\nasync function validateMediaLocationAsync(mediaLocation: MediaLocation): Promise<[IImageData, boolean]> {\n const imageData: IImageData = {\n src: mediaLocation.Uri || '',\n altText: mediaLocation.AltText || ''\n };\n if (mediaLocation.IsApplicableForChildEntities) {\n imageData.additionalProperties = { isApplicableForChildEntities: 'true' };\n }\n\n if (imageData.src === '') {\n return [imageData, false];\n }\n\n return new Promise<[IImageData, boolean]>(resolve => {\n try {\n const http = new XMLHttpRequest();\n http.open('HEAD', imageData.src!, true);\n\n http.addEventListener('load', () => {\n resolve([imageData, http.status === 200 || http.status === 201]);\n });\n\n http.addEventListener('error', () => {\n resolve([imageData, false]);\n });\n\n http.send();\n } catch {\n resolve([imageData, false]);\n }\n });\n}\n\nexport async function getValidProductImages(\n productId: number,\n channelId: number,\n actionContext: IActionContext,\n imageSettings: IImageSettings,\n selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n const catalogId = getCatalogId(actionContext.requestContext);\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation))).then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n });\n }\n\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\n/**\n * Gets product variant images on dimension change of buy-box module for Omni scenario.\n * @param productId Product record id.\n * @param shouldUseCmsAltText Alt-text source to use.\n * @param channelId Current channel id.\n * @param actionContext Current action context.\n * @param productName Product name.\n * @param selectedProduct Currently selected variant product.\n * @returns List of images.\n */\n\nexport async function getProductImages(\n productId: number,\n shouldUseCmsAltText: boolean,\n channelId: number,\n actionContext: IActionContext,\n productName?: string,\n selectedProduct?: SimpleProduct\n): Promise<IImageData[]> {\n const catalogId = getCatalogId(actionContext.requestContext);\n if (actionContext.requestContext?.params?.isPreview) {\n const response = await commerceApiRequest(actionContext.requestContext, 'msdyn365-ochannel-product-info', 'post', {\n productId: productId,\n channelId: channelId,\n catalogId: catalogId\n });\n if (response.status !== 200) {\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant for preview scenario');\n return [];\n }\n const previewImageData = response?.data as MediaLocation[];\n if (previewImageData) {\n return previewImageData.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n }\n const actionInput = new MediaLocationsForSelectedVariantInput(productId, channelId, selectedProduct, catalogId);\n return getMediaLocationsForSelectedVariant(actionInput, actionContext)\n .then(mediaLocations => {\n if (mediaLocations) {\n return mediaLocations.map(mediaLocation => {\n return {\n src: mediaLocation.Uri ?? '',\n altText: getAltText(actionContext.requestContext, shouldUseCmsAltText, productName, mediaLocation.AltText),\n displayOrder: mediaLocation.DisplayOrder,\n mediaTypeValue: mediaLocation.MediaTypeValue,\n additionalProperties: mediaLocation.IsApplicableForChildEntities\n ? {\n isApplicableForChildEntities: 'true'\n }\n : undefined\n };\n });\n }\n return [];\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to get Media Locations for Selected Variant');\n return [];\n });\n}\n\nexport async function validateProductImages(\n mediaLocations: MediaLocation[],\n actionContext: IActionContext,\n imageSettings: IImageSettings\n): Promise<IImageData[]> {\n return Promise.all(mediaLocations.map(mediaLocation => validateMediaLocationAsync(mediaLocation)))\n .then(pairs => {\n return pairs.filter(pair => pair[1]).map(pair => pair[0]);\n })\n .catch(error => {\n actionContext.telemetry.exception(error);\n actionContext.telemetry.debug('Unable to validate product images');\n return [];\n });\n}\n\n/**\n * GetVideoMetadataFromAPI - Makes API call to get video metadata.\n * @param videoId: Video Id\n * @param actionContext: Action context\n * @returns: Returns the meta data of the video.\n */\nexport async function getVideoMetadataFromApi(videoId: string, actionContext: IActionContext): Promise<IVideoData | undefined> {\n let videoPlayerData: IVideoData | undefined;\n if (videoId) {\n const response = await commerceVideoMetadataRequest(actionContext.requestContext, [videoId]);\n\n if (response.status !== 200) {\n actionContext.telemetry.debug(`Unable to get video metadata for videoId: ${videoId}`);\n return;\n }\n\n const videoData = response.data as [];\n if (videoData && ArrayExtensions.hasElements(videoData)) {\n videoPlayerData = videoData[0];\n }\n }\n return videoPlayerData;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AddOrderTemplateToCartComponent, ILinesAddedToCartDialogResources } from '@msdyn365-commerce/components';\nimport { getUrlSync, ICoreContext, IImageSettings, Image, ITelemetry } from '@msdyn365-commerce/core';\nimport { ProductList, SimpleProduct } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport {\n getFallbackImageUrl,\n getProductUrlSync,\n OrderTemplate,\n OrderTemplateLine,\n StringExtensions\n} from '@msdyn365-commerce-modules/retail-actions';\nimport { Alert, Button, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IOrderTemplateActionMessageState } from '../order-template-list';\n\nexport interface ISingleOrderTemplateProps extends ProductList {\n orderTemplateState: IOrderTemplateActionMessageState;\n name?: string;\n orderTemplate: OrderTemplate;\n context: ICoreContext;\n imageSettings?: IImageSettings;\n enableImageProductLink?: boolean;\n removeFromOrderTemplateListText: string;\n addToBagText: string;\n index: number;\n itemKey: string;\n telemetry: ITelemetry;\n moduleId: string;\n moduleTypeName: string;\n handlers: {\n onRemoveOrderTemplate(id: string): void | undefined;\n onDismiss(): void;\n };\n resources: {\n closeWindowButtonText: string;\n addToCartFailureMessage: string;\n addToCartSuccessMessage: string;\n addToCartProcessMessage: string;\n orderTemplateErrorMessage: string;\n linesAddedToCartDialogResources: ILinesAddedToCartDialogResources;\n };\n telemetryContent?: ITelemetryContent;\n isMultipleCatalogFeatureEnabledInHq?: boolean;\n}\n\nexport interface ISingleOrderTemplateViewProps {\n key: string;\n orderTemplateImage: React.ReactNode;\n addToCartButton?: React.ReactNode;\n removeButton?: React.ReactNode;\n orderTemplateStatusMessage?: React.ReactNode;\n orderTemplateName?: React.ReactNode;\n orderTemplateAriaLabel?: string;\n orderTemplateHeaderDivider?: React.ReactNode;\n}\n\nconst _removeItemFromOrderTemplateList = (props: ISingleOrderTemplateProps): void => {\n const { onRemoveOrderTemplate } = props.handlers;\n const { itemKey } = props;\n\n onRemoveOrderTemplate && itemKey && onRemoveOrderTemplate(itemKey);\n};\n\nconst OrderTemplateActions = {\n removeOrderTemplate: _removeItemFromOrderTemplateList\n};\n\n/**\n * Remove order template action.\n * @param input -Single order template props.\n * @returns Set remove order template.\n */\nconst removeOrderTemplateActionHandler = (input: ISingleOrderTemplateProps) => () => {\n OrderTemplateActions.removeOrderTemplate(input);\n};\n\nexport const OrderTemplateRender = (input: ISingleOrderTemplateProps): ISingleOrderTemplateViewProps | null => {\n const {\n Id,\n orderTemplate,\n removeFromOrderTemplateListText,\n orderTemplateState,\n handlers,\n name,\n imageSettings,\n context,\n telemetryContent,\n enableImageProductLink\n } = input;\n\n if (!Id) {\n return null;\n }\n\n const _getOrderTemplatePageUrl = (): string => {\n const url = getUrlSync('ordertemplate', context.actionContext) ?? '';\n const separator = url.includes('?') ? '&' : '?';\n if (Id) {\n return `${url}${separator}id=${Id}`;\n }\n return '';\n };\n\n const { onDismiss } = handlers;\n\n return {\n key: `${Id}-template`,\n orderTemplateImage: _renderOrderTemplateImages(context, orderTemplate.orderTemplateLines, imageSettings, enableImageProductLink),\n orderTemplateAriaLabel: _renderAriaLabel(input),\n orderTemplateName: (\n <div>\n <div className='ms-order-template__list-item-title'>\n <a href={_getOrderTemplatePageUrl()} aria-label={name}>\n {name}\n </a>\n </div>\n <div className='ms-order-template__line-count'>\n {orderTemplate.totalLines}\n {` `}\n line items\n </div>\n <hr color='#F9F9F9' />\n </div>\n ),\n addToCartButton: (\n <div className='ms-order-template__add-to-bag-button-div'>\n <AddOrderTemplateToCartComponent\n id={Id}\n context={context}\n typeName={input.moduleTypeName}\n data={{\n orderTemplate: input.orderTemplate\n }}\n className='ms-order-template__add-to-bag-button'\n addToCartText={input.addToBagText}\n dialogStrings={input.resources}\n telemetryContent={telemetryContent}\n isMultipleCatalogFeatureEnabledInHq={input.isMultipleCatalogFeatureEnabledInHq}\n />\n </div>\n ),\n removeButton: (\n <Button\n className='ms-order-template__remove-list'\n aria-label={removeFromOrderTemplateListText}\n onClick={removeOrderTemplateActionHandler(input)}\n />\n ),\n orderTemplateStatusMessage: orderTemplateState && orderTemplateState.isOpen && orderTemplateState.userMessage && (\n <div className='ms-orderTemplate__status'>\n <Alert color={orderTemplateState.statusCssString} isOpen={orderTemplateState.isOpen} toggle={onDismiss}>\n <span>{orderTemplateState.userMessage}</span>\n </Alert>\n </div>\n )\n };\n};\n\n/**\n * On image click handler.\n * @param productUrl -Product url value.\n * @returns Assign window location.\n */\nconst onClickHandler = (productUrl: string) => () => {\n window.location.assign(productUrl);\n};\n\nconst _renderOrderTemplateImages = (\n context: ICoreContext,\n orderTemplateLines?: OrderTemplateLine[],\n imageSettings?: IImageSettings,\n enableImageProductLink?: boolean\n): JSX.Element | null => {\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n lg: { q: 'w=140&h=140&m=6', w: 0, h: 0 },\n xl: { q: 'w=140&h=140&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n if (orderTemplateLines) {\n const count = orderTemplateLines.length < 4 ? orderTemplateLines.length : 4;\n\n return (\n <div className='ms-order-template__image-container'>\n {orderTemplateLines?.slice(0, count).map(line => {\n const productUrl = line.fullProduct\n ? _updateProductUrlCatalog(line.fullProduct.ProductDetails, context, line?.productListLine?.CatalogId)\n : '';\n\n return (\n <Image\n altText={line.fullProduct?.ProductDetails.Name ?? 'image'}\n requestContext={context.actionContext.requestContext}\n key={line.fullProduct?.ProductDetails.Name}\n src={line.fullProduct?.ProductDetails.PrimaryImageUrl ?? ''}\n fallBackSrc={\n getFallbackImageUrl(\n line.fullProduct?.ProductDetails.ItemId,\n context.actionContext.requestContext.apiSettings,\n context.request.app?.config?.OmniChannelMedia\n ) ?? ''\n }\n gridSettings={context.request.gridSettings!}\n imageSettings={imageSettings ?? defaultImageSettings}\n loadFailureBehavior='empty'\n onClick={enableImageProductLink && onClickHandler(productUrl)}\n className={enableImageProductLink ? 'product-link' : ''}\n />\n );\n })}\n </div>\n );\n }\n return <div className='ms-order-template__image-container' />;\n};\n\n// This method is used to update the product url with the catalogId\nconst _updateProductUrlCatalog = (productDetails: SimpleProduct, context: ICoreContext, catalogId: number | undefined): string => {\n const productUrl = getProductUrlSync(productDetails, context.actionContext, undefined);\n if (!StringExtensions.isNullOrWhitespace(productUrl) && catalogId !== undefined) {\n const fullUrl = new URL(productUrl, window.location.href);\n fullUrl.searchParams.set('catalogid', `${catalogId ?? 0}`);\n return fullUrl.href;\n }\n return productUrl;\n};\n\nconst _renderAriaLabel = (props: ISingleOrderTemplateProps): string => {\n const { name } = props;\n return `${name}`;\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 { orderTemplateListStatus } from '../order-template-list';\n\nexport interface IOrderTemplateListStatusMessageProps {\n className?: string;\n errorType: orderTemplateListStatus;\n text?: string;\n}\n\nexport const OrderTemplateListStatusMessage: React.FC<IOrderTemplateListStatusMessageProps> = ({ className, errorType, text }) => {\n switch (errorType) {\n case 'EMPTY':\n return <p className={classnames('ms-orderTemplateList__message-empty', className)}>{text}</p>;\n case 'FAILED':\n return <p className={classnames('ms-orderTemplateList__message-failed', className)}>{text}</p>;\n case 'LOADING':\n default:\n return <p className='ms-orderTemplateList__message-waiting'>{text}</p>;\n }\n};\n"],"names":["popupProps","_product$AttributeVal","_product$AttributeVal2","dialogStrings","className","imageSettings","gridSettings","data","product","productQuantity","modalOpen","setModalOpen","context","closeModal","fallbackImageUrl","getFallbackImageUrl","ItemId","actionContext","requestContext","apiSettings","quantity","undefined","itemsString","headerItemOneText","headerItemFormatText","replace","toString","tags","tagFriendlyNames","specificationsList","specificationsListFiendly","React","Modal","isOpen","onClosed","ModalHeader","toggle","headerMessageText","ModalBody","Image","src","PrimaryImageUrl","fallBackSrc","altText","Name","loadFailureBehavior","cultureFormatter","formatCurrency","Price","AttributeValues","slice","map","item","i","KeyName","includes","TextValue","tagFriendlyName","indexOf","tagId","specificationFriendlyName","specificationId","ProductComponent","msdyn365Commerce","createComponentOverride","_objectSpread","component","_ref","_data$product","_product$Name","savingsText","freePriceText","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","id","telemetryContent","isPriceMinMaxEnabled","priceResources","productCategoryUserPath","productListName","resources","price","request","navigationUrl","renderModalPopup","Popup","Object","assign","catPage","urlTokens","categories","available","setAvailable","loading","setLoading","availableLabel","setAvailableLabel","_isAvailable","async","_productAvailabilites","productAvailabilites","getEstimatedAvailabilityAsync","callerContext","ProductIds","RecordId","DefaultWarehouseOnly","QuantityUnitTypeValue","ProductWarehouseInventoryAvailabilities","length","outOfStockString","GIFTCARD_ITEMID","inventory","MaximumPurchasablePhysicalAvailableQuantity","PhysicalAvailableInventoryLevelLabel","err","console","error","percent_discount","discount_string","BasePrice","toFixed","custom_basePrice","custom_adjustedPrice","omnibus_price","filter","attribute","_attribute$Name","omnibus_price_currency","CurrencyValue","CurrencyCode","payLoad","getPayloadObject","getTelemetryAttributes","productUrl","getProductPageUrlSync","renderLabel","name","rating","ratingAriaLabelText","reviewCount","ratingCountAriaLabelText","availability","reviewCountArialableText","format","getReviewAriaLabel","roundedRating","getRatingAriaLabel","renderProductPlacementImage","productCardimageSettings","imageUrl","emptyPlaceHolderImage","app","config","placeholderImageName","fallbackImageSource","image","imageProps","cropFocalRegion","bypassHideOnFailure","productDetailsPageUrl","coreContext","queryString","sourceUrl","URL","baseUrl","search","href","pathname","updateProductUrl","_context$actionContex","searchContainerResaurces","requestCache","internalCache","__MR","pmProducts","initialQuntity","Qty","add","setAdd","setQuantity","removedFromCart","localPm","localStorage","getItem","localPmProds","JSON","stringify","parse","window","setItem","wrapper","document","getElementsByClassName","handleButtonClick","event","target","nodeName","timer","setTimeout","clearTimeout","addEventListener","removeEventListener","AddToCartButtons","_ref2","showadd","onClick","pRecordId","Description","pQuantity","pmProductsList","Id","Item","UOM","DataAreaId","addProductToPmCart","addText","_pmProductsList$pReco2","Number","removeOneProductFromPmCart","title","color","type","pattern","value","role","readOnly","_pmProductsList$pReco","plusOneProductToPmCart","AverageRating","viewDetailsText","moduleTypeName","moduleId","productSearchResult","savingsPriceResourceText","freePriceResourceText","originalPriceResourceText","currentPriceResourceText","ProductTypeValue","IsMasterProduct","ProductType","Master","Standalone","AdjustedPrice","CustomerContextualPrice","MaxVariantPrice","MinVariantPrice","PriceComponent","renderPrice","trackProductTileClick","onTelemetryClick","omnibusRecentLowestPrice","style","textDecoration","stopPropagation","preventDefault","addToCartBehavior","getUrlSync","catalogId","getCatalogId","trackAddToCartFromListing","cartState","getCartState","addProductToCart","count","availableQuantity","additionalProperties","enableStockCheck","isPriceKeyedIn","customPrice","isAddEmailDeliveryItemToCart","shouldSkipSiteSettings","status","AddToCartBehavior","showModal","showNotification","MsDyn365","isBrowser","goToCart","location","visibility","addToCartText","MediaGallery","constructor","props","_this","_props$config$zoomedI","super","this","_inlineZoomDivRef","Map","fullScreenOverlayButtonRef","player","defaultGalleryImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","defaultThumbnailImageSettings","onExiting","setState","animating","onExited","next","removeInlineZoomStyle","isLastItem","nextIndex","state","activeIndex","goToIndex","updateZoomedInImage","previous","images","mediaGalleryItems","isFirstItem","index","autoplay","currentIndex","mediaItems","_mediaItems","_this$player$current","mediaTypeValue","MediaType","Video","current","play","_this$player$current2","pause","getImagesData","_this$props$context$r","skipImageValidation","OmniChannelMedia","_this$props$config$im","_this$props$config$im2","source","imageSource","mediaLocations","mediaLocationsForSelectedVariant","result","mediaLocation","_mediaLocation$Uri","_this$props$data$prod","Uri","getAltText","shouldUseCmsAltText","AltText","IsApplicableForChildEntities","isApplicableForChildEntities","curatedImages","_filterMasterImageFromVariant","_renderCarouselItemVideo","mediaData","videoData","_videoData$_links","options","playerResources","videoMetaData","videoId","duration","playTime","thumbnail","posterframeUrl","_links","binaryReferences","videoBinaryReferences","videoPlayerData","metaData","attributes","editProps","key","Player","ref","playerData","isEditor","params","_renderEmptyImage","_getCarouselItem","_this$props$context$r2","isInPopup","arguments","fallbackImage","shouldSkipToMainImage","_getThumbnailItem","modifiedActiveIndex","ThumbnailItemContainerProps","tag","classnames","tabIndex","_generateOnThumbnailClick","onKeyDown","_generateOnThumbnailKeyDown","Picture","imageFallbackOptimize","shouldUseOptimizedImage","getVideoThumbNailItem","classes","_refHandler","divRef","set","which","KeyCodes","Enter","Space","_renderVideoThumbnail","fullScreenTitleText","openModalDialog","_toggleModal","imageModalSlider","ZoomView","_mapProductToImageData","carouselprops","Carousel","items","_renderCarouselItemImageView","_zoomedImageSettings","interval","directionTextPrev","previousScreenshotFlipperText","directionTextNext","nextScreenshotFlipperText","onIndicatorsClickHandler","showPaginationTooltip","hideIndicator","keyboard","handleOnExited","handleOnExiting","isDisabledFunctionality","isMobileImageZoomed","carousel","imageModalSliderProps","modalIsOpen","ontoggle","galleryCarousel","classNames","ImagefullView","altTextSource","bind","mediaGalleryImages","isImageZoomed","isInitialLoad","zoomedImageSettings","galleryImageSettings","_onImageMouseOut","_inlineZoomImageOnHover","_onInlineImageClick","_onContainerZoomImageClick","_onMouseOutLensContainer","isMobile","variant","VariantType","Viewport","_this$props$config$im3","_this$props$context$r3","shouldUpdateOnPartialDimensionSelection","_setRenderType","_this$props$config$th","validateProductImages","thumbnailImageSettings","_setImages","_this$props$config$th2","getValidProductImages","channelId","productVariant","reaction","_product$productVaria","_this$props$context$a","_this$props$config$th3","getProductImages","fireImmediately","_this$props$config$th4","shouldComponentUpdate","nextProps","nextState","render","_this$props$context$a2","isVertical","thumbnailsOrientation","isFullscreenAllowed","allowFullScreen","zoomViewMode","imageZoom","_this$props$context$r4","mediaGalleryCarouselItems","_getMediaGalleryItems","mediaGalleryThumbnailCarouselItems","_getMediaGalleryThumbnailItems","viewProps","moduleProps","callbackToggle","callbackThumbnailClick","callbackThumbnailKeyDown","CarouselProps","indicatorAriaText","ariaLabelForSlide","keys","Thumbnails","ThumbnailsContainerProps","SingleSlideCarouselComponentProps","SingleSlideCarousel","vertical","flipperPrevLabel","flipperNextLabel","parentId","useTabList","renderView","ArrayExtensions","hasElements","lastUpdate","defaultKey","_getEmptyThumbnailItem","zoomView","curatedImage","mediaToSet","Promise","all","searchParams","get","getVideoMetadataFromApi","telemetry","debug","then","element","Date","now","media","_renderImageInContainerOnZoom","_renderImageFullScreenOnZoom","_renderImageInlineOnZoom","_this$props$config$sh","_this$props$data$prod2","_this$props$data$prod3","_this$props$data$prod4","shouldHidePrimaryImages","shouldHideMasterProductImagesForVariant","variantImages","isVariantProduct","ObjectExtensions","isNullOrUndefined","MasterProductId","itemId","_item$additionalPrope","_this$props$config$da","dataScale","defaultDataScale","onMouseOver","onMouseMove","inlineZoomImageOnMouseMove","_this$props$config$da2","inlineZoomImageOnHover","String","_handleMobileViewZoomedImageClick","currentTarget","mobileZoomedInImageClassName","transform","classList","remove","parentElement","overflow","_this$props$config$da3","bounds","getBoundingClientRect","positionX","clientX","left","positionY","clientY","top","scaledPositionX","scaledPositionY","scrollTo","_this$props$config$da4","innerWidth","inlineZoomInitClick","inlineZoomImageOnMouseOut","onContainerZoomInit","onMouseOutLensContainer","_this$props$config$da5","onMouseOut","onMouseMoveLensContainer","onMouseOverImageContainer","_product$PrimaryImage","_this$fullScreenOverl","focus","parentDiv","children","querySelector","removeAttribute","removeContainerZoomStyle","_renderItem","quantityLabel","ProductsTableRow","selectLine","productLineCatalog","productImage","productPrice","productNumber","addToBagButton","removeButton","productInfo","productUnitOfMeasure","productQuantityView","popUp","extraActionsPopup","isMultipleCatalogFeatureEnabledInHq","disabled","disableElement","pointerEvents","opacity","Node","OrderTemplateLines","statusMessage","heading","ProductsTable","ProductsTableHeading","orderLines","productsStatusMessage","OrderTemplateActions","orderActions","pagination","itemAddedToCartDialog","bulkOrderLineActions","isDetailsDisplayed","detailedProductView","toggleDetailsDisplayed","cancelBtnLabel","productNumberText","productText","productUnitPriceText","productUOMText","productQuantityText","productLineCatalogName","toggleDetails","Module","addTemplateToBag","renameTemplate","removeTemplate","actionsSplitButton","wrapClassName","autoFocus","fade","applicationNode","ModalFooter","Button","modalCloseButtonReference","onCancelHandler","isCreateOrderTemplateDialogOpen","setOrderTemplateNameDialogOpen","useState","onCreateButtonClick","createOrderTemplateText","OrderTemplateNameDialog","isUpdateDialog","createOrderTemplateDialogResources","onCancel","onSuccess","onOrderTemplateCreated","parentElementRef","OrderTemplateList","_isChannelMultipleCatalogsFeatureEnabled","_this$props$data$feat","featureState","find","feature","IsEnabled","_onDismiss","_reloadPage","reload","_onRemoveFromOrderTemplateList","productListId","orderTemplates","user","isAuthenticated","token","orderTemplate","p","productList","deleteAsync","catch","warning","itemKey","headerStatusMessage","deleteOrderTemplateFailedText","statusCssString","messageGlyph","userMessage","_heading$text","_heading$tag3","emptyOrderTemplateText","createNewTemplateButtonText","orderTemplatesData","orderTemplateListHeading","text","orderTemplateListTitle","_heading$tag","errorProps","Spinner","msg","progressNotificationText","Heading","_heading$tag2","emptyViewProps","OrderTemplateListStatusMessage","errorType","createOrderTemplateButton","CreateNewTemplateButtonComponent","_generateOrderTemplateNameDialogResources","templateHeaderStatusMessage","Alert","OrderTemplates","OrderTemplate","_renderOrderTemplateList","orderTemplateHeaderLabel","createOrderTemplateHeader","orderTemplateTitleLabel","orderTemplateTitle","orderTemplateNameAriaLabel","orderTemplateDescription","createOrderTemplateDescription","defaultOrderTemplateName","orderTemplateButtonLabel","createOrderTemplateButtonText","orderTemplateCancelButtonLabel","cancelNewOrderTemplateCreationButtonText","enableImageProductLink","currentTemplateProps","orderTemplateState","removeFromOrderTemplateListText","addToBagText","addToBagButtonText","handlers","onRemoveOrderTemplate","onDismiss","closeWindowButtonText","addToCartFailureMessage","addToCartSuccessMessage","addToCartProcessMessage","orderTemplateErrorMessage","linesAddedToCartDialogResources","viewCartButtonText","orderTemplateCloseButtonText","linesAddedToCartHeaderItemsOneText","linesAddedToCartHeaderLinesOneText","linesAddedToCartHeaderLinesFormatText","linesAddedToCartHeaderMessageText","OrderTemplateRender","__decorate","observer","OrderTemplateListView","_renderOrderTemplate","addToCartButton","orderTemplateImage","orderTemplateStatusMessage","orderTemplateName","GiftWithPurchaseType","modalVisible","setModalVisible","gwpData","setGwpData","productAddedAttempt","useRef","___initialData___","telemetryPageName","toLowerCase","baseImageUrl","useEffect","disposeReaction","_props$data$cart$resu","cart","TotalItems","_props$context$reques","_defaultRoutes$orderC","currentURLPathName","url","requestUrl","isOrderConfirmPage_temp","routes","orderConfirmation","destinationUrl","totalItems","gwpType","AUTO","visibilityState","_props$data$cart$resu2","response","availableGiftsWithPurchase_DLXAsync","GWPItems","Items","_firstGWPItem$Items$l","_firstGWPItem$Items","_firstGWPItem$Items2","firstGWPItem","gwpTypeTemp","MANUALADD","_availabilityResult$A","availabilityResult","ProductId","AggregatedProductInventoryAvailabilities","cartLinesToAdd","Quantity","TrackingId","ExtensionProperties","Key","Value","BooleanValue","StringValue","addCartLinesAsync","Version","_firstGWPItem$Items3","refreshCart","trackAddToCartFromGWP","gwpProps","numberProductsOfGift","productSelection","ProductNumber","promotionProps","closePopupCallback","closePopup","_renderThumbnails","thumbnails","_renderThumbnailItem","renderRating","ratingId","avgRating","totalRatings","ariaLabel","_totalRatings$toStrin","numberRatings","RatingComponent","ratingCount","ActiveProductComponent","imgData","productId","basePrice","adjustedPrice","description","hideRating","TotalRatings","assembleNode","_item$links","additionalContentNode","renderHeading","additionalContentHeading","Msdyn365","onEdit","handleAdditionalTextChange","subtext","renderParagraph","additionalContentParagraphText","links","ctaLink","renderLinks","linkIndex","editableLink","linkText","linkUrl","openInNewTab","isOpenInNewTab","link","onTextChange","handleAdditionalLinkTextChange","additionalContentContainer","additionalContentItemLinks","activeImageAdditionalContent","additionalContent","CanvasCalculations","CanvasStyles","ImageMapper","_isDesktopViewPort","_context","getActiveImageWidth","activeImageReferenceValue","activeImageRefs","clientWidth","getActiveImageHeight","clientHeight","convertHexToRgb","hexColor","RegExp","exec","rValue","parseInt","gValue","bValue","applyFadingTransition","coords","rgbColor","alpha","_this$_canvas$current","_this$_canvas$current2","halfDivisor","_canvas","getContext","buttonPadding","paddingAdjustment","buttonWidth","measureText","width","fillStyle","body","getAttribute","fillText","drawButton","_this$_canvas$current3","_this$_canvas$current4","buttonTextClor","buttonHeight","buttonPositionX","buttonPositionY","arcsize","beginPath","moveTo","lineTo","arcTo","stroke","closePath","fill","expandAnimation","_this$props$imageMapp","buttonText","imageMapperResources","animationStartWidth","expandAnimationStartWidth","pointPositionX","pointPositionY","animationEndWidth","expandAnimationEndWidth","radius","expandRadius","rotation","startAngle","endAngle","textFadeInValue","textFadeInStartValue","buttonTextClorInRgb","toLocaleLowerCase","animate","_this$_canvas$current5","_this$_canvas$current6","ellipse","requestAnimationFrame","textFadeInterval","collapseAnimation","_this$props$imageMapp2","collapseAnimationStartWidth","collapseAnimationEndWidth","clearMargin","clearHeight","clearWidth","collapseRadius","textFadeOutValue","textFadeOutStartValue","_this$_canvas$current7","_this$_canvas$current8","clearRect","drawCircle","_this$_canvas$current9","_this$_canvas$current10","viewPort","doubleMultiplier","strokeStyle","arc","Math","PI","scaleCoords","imgWidth","defaultWidth","defaultScale","scale","coord","renderPrefilledAreas","areaMap","areas","area","computeCenter","scaledCoords","handleHoverOn","center","handleHoverOff","_this$_canvas$current11","canvasPositionX","defaultPositionX","canvasPositionY","defaultPositionY","height","click","hoverOn","onMouseEnter","hoverOff","onMouseLeave","renderAreas","_this$props$imageMapp3","_this$props$imageMapp4","_area$productSearchRe","xsRadius","extendedArea","areaKey","altTextWithProductName","shape","join","onFocus","onBlur","alt","initCanvas","_this$getActiveImageW","_this$getActiveImageH","_this$_canvas$current12","_backgroundImage","_container","onLoad","defaultHeight","canvasWidth","canvasHeight","componentDidMount","componentDidUpdate","shouldRender","_requestContext$gridS","imageData","useMap","ActiveImageConstants","ActiveImage","_defaultProductCardWidth","_defaultProdutCardHight","_activePoints","addActivePoints","push","areaId","primaryImageUrl","updateClientWidth","viewport","Browser","renderImageMapper","_this$props$config$ac","productResults","products","activePoints","configProduct","_configProduct$xPosit","_configProduct$yPosit","_configProduct$radius","xPosition","yPosition","activePoint","mappedArea","_activeImageClass","enterArea","leaveArea","activeImage","_activeImageRefs","altTextForSeeMoreButtonWithProductName","seeMoreButtonText","overlayClass","open","resetState","renderProductComponent","_this$state$area","_this$state$area$prim","_product$ItemId","productImageSettings","renderProductCard","_productCardDivRef","renderOverlay","getProductCardPositionX","_this$props$config$pr","_this$props$config$pr2","_defaultImageSettings","_area$center$","_area$center","defaultImageSettings","getDefaultImageSettings","productImageSettingsWidth","productCardWidth","leftAllignPosition","position","getProductCardPositionY","_this$props$config$pr3","_this$props$config$pr4","_defaultImageSettings2","productImageSettingsHeight","produtCardHight","_area$center$2","_area$center2","xl","keyDown","enterKey","escKey","handleTextChange","handleParagraphChange","paragraph","renderActiveImageDetailsLinks","_telemetryContent","linkData","contentAction","etext","linkId","willOpenInNewTab","handleLinkTextChange","renderActiveImageDetailsHeading","renderActiveImageDetailsParagraph","getActiveImageId","activeImageId","_activeImageIdPart$","activeImageSource","split","decrementOne","_handleOutsideClick","_this$_productCardDiv","contains","getTelemetryObject","friendlyName","timeoutInterval","Array","from","componentWillUnmount","activePointContainer","activePointDetailsContainer","imageMapper","overlay","productCard","productCardleftPosition","productCardtopPosition","detailsContainer","detailsContainerCta","handleAdditionalParagraphChange","handleAdditionalText","handleAdditionalParagraph","handleAdditionalLinkText","_this$props$config$ad","CarouselModule","_handleDismissCarousel","cookies","dismissCarousel","_next","slots","content","closeNow","_previous","_onExiting","_onExited","_goToIndex","newIndex","carouselContainer","closeAnimation","handleDismissCarousel","ProductPickUpOptionsForCartLineItems","getCacheKey","buildCacheKey","getCacheObjectType","dataCacheType","getPickUpOptionsForCartLineItems","input","Error","getActiveCartProductsAction","ActiveCartProductsInput","resolve","ProductsDataActions","queryResultSettings","QueryResultSettingsProxy","getPagingFromInputDataOrDefaultValue","createObservableDataAction","action","inputData","PickUpInStore","_toggleBOPIS","isBopisSelected","storeSelectorStateManager","cartline","storeSelectorModuleId","openDialog","alreadySelectedLocation","OrgUnitNumber","FulfillmentStoreId","deliveryOptions","onLocationSelected","orgUnitLocation","deliveryMode","updateCartLinePickupLocation","cartLineId","LineId","locationChangedHandler","_onLocationChangedCallback","DeliveryMode","ShippingAddress","clearCartLinePickupLocation","_getOrgUnitName","fulfillmentStoreId","orgUnitLocations","foundLocation","OrgUnitName","DeliveryOptions","_props$channelDeliver","retailMulitplePickupFeatureState","channelDeliveryOptionConfig","matchDeliveryOptions","productdeliveryOptions","storePickUpOptionList","deliveryOption","delivery","pickup","deliveryCode","Code","PickupDeliveryModeCodes","pickupDeliveryModeCode","option","callbacks","toggleBopis","defaultComponent","_renderShippingMethod","cartLine","shipItText","pickupInStoretext","changeStoreText","orgUnitName","bopisSelected","toggleBOPIS","onChange","checked","shipitText","pickUpInStoreText","_getDeliveryOption","pickupStore","_deliveryOptions$Deli","ContainerProps","_assembleNode","foundProductAvailability","productPickUpOptions","_product$Behavior","_foundProductAvailabi","_product$Dimensions","_props$cartState","_context$request$chan","removeButtonText","removeItemClickHandler","moveToWishlistSuccessHandler","addToOrderTemplateButtonText","addToOrderTemplateButtonTooltip","addToOrderTemplateDialogResources","itemAddedToOrderTemplateDialogResources","duplicateItemsWhenAddingToOrderTemplateDialogResources","addToWishlistButtonText","removeFromWishlistButtonText","customerInformation","wishlists","defaultWishlistName","nameOfWishlist","availableQuantityInStock","isStockCheckEnabled","productAvailability","ProductAvailableQuantity","IsProductAvailable","AvailableQuantity","_getCartItemAvailableQuantity","maxQuantity","_getCartItemMaxQuantity","maxQuantityByConfig","isQuantityLimitsFeatureEnabled","maxByQuantityLimitsFeature","maxByQuantityLimitsFeatureResult","maxCartlineQuantity","Behavior","MaximumQuantity","shouldSkipStockCheck","ItemTypeValue","ReleasedProductType","Service","IsInvoiceLine","errorMessage","_getErrorMessage","currentQuantity","lineId","_props$productAvailab","finalErrorMessages","outOfStockText","includeErrors","outOfRangeOneText","outOfRangeFormatText","checkForErrors","cartlinesErrors","ValidationResultsPairs","errorsFoundByLineId","ValidationFailures","forEach","validation","ErrorContext","onRemoveClickHandler","onRemoveClickFunction","payload","TelemetryEvent","RemoveFromCart","inventoryLbl","StockLevelLabel","inventoryCode","StockLevelCode","isCustomPriceSelected","Dimensions","dimension","DimensionTypeValue","DimensionValue","getProductUrlSync","isChannelTypeB2B","_cartline$CatalogId","fullUrl","CatalogId","getInvoiceDetailsPageUrlSync","cartlineId","hasError","StringExtensions","isNullOrEmpty","CartLineItemComponent","catalogs","isOutOfStock","lineIndex","isQuantityEditable","quantityOnChange","updateCartLinesQuantitySuccessHandler","inventoryInformationLabel","inventoryLabelClassName","isCartStateReady","showShippingChargesForLineItems","priceCurrency","channel","Currency","pickUpInStore","pickitUpText","addToWishlist","AddToWishlistComponent","showButtonText","showStatusMessage","showRemoveButton","showButtonTooltip","ariaRole","addToOrderTemplate","AddToOrderTemplateComponent","shouldShowButtonFailedTooltip","disableButton","disableTooltip","assembleCartlines","cartlines","reactNodes","getProductByProductIdAndWarehouse","WarehouseId","getProductByProductId","isPickUpItem","isCartLineItemPickUpType","_productAvailability$","_productAvailability$2","_cartline$WarehouseId","shouldIgnoreWarehouse","InventLocationId","toUpperCase","CartLineGroupItems","hasInvoiceLine","_assembleGroupInvoiceCartlines","cartLines","carLineViewProps","_assembleGroupCartlines","getGroupByStorePickup","groupBy","groupDelivery","cartLinesGroup","entries","deliveryType","groupByDeliveryType","getPromotionData","ctx","promotionData","getPromotionOptionsForCartLineItems","PromotionOptionsForCartLineItems","promotionOptions","exception","Cart","_isMounted","promotionPopupId","promotionLinkClick","showPromotionDialog","promotionCloseButtonclick","_hidePromotionDialog","getImageSettings","removeItemFromCartHandler","cartlineToRemove","cartLineIds","removeCartLines","validateCart","updateCartlineQuantity","cartlineToUpdate","cartLineQuantityUpdatedAsync","cartActionResult","message","_cartActionResult$err","lineUpdateFailure","validationResults","LocalizedMessage","errorDetails","fulfillmentStoreIdUpdated","isCartValid","_this$props$data$cart","getOrderQuantityLimitsFeatureFlag","_isChannelLimitsFeatureEnabled","showAvailablePromotions","CartLines","_this$props$data$cart2","_this$props$data$cart3","_cart$cart$CartLines","_featureState$result","signInUrl","guestCheckoutUrl","backToShoppingUrl","checkoutURL","getCheckoutURL","isCartEmpty","_getCartLines","emailDeliveryModeCode","EmailDeliveryModeCode","validInventoryAcrossCartLines","validateCartLinesInventory","isValid","some","RetailMultiplePickupFeatureState","multiplePickUpEnabled","isMultipleCatalogsFeatureEnabled","currentCatalogId","validateCatalogId","getCartLinesGroup","TelemetryConstant","Checkout","checkoutBySignInAttributes","GuestCheckout","checkoutByGuestAttributes","BackToShopping","backtoShoppingAttributes","cartLineGroup","_updateCartLineErrorForInvalidInventory","cartTitle","CartlinesWrapper","OrderSummaryWrapper","OrderSummaryItems","promoCode","_getPromoCode","_getPromotions","removePromoAriaLabelFormat","orderSummaryHeading","invoiceSummaryTitle","orderSummaryTitle","orderSummaryLineitems","_getOrderSummaryLineItems","invoiceSummaryLineitems","_getInvoiceSummaryLineItems","checkoutAsSignInUserButton","checkoutButtonTitle","checkoutAsGuestButton","showGuestCheckoutButton","guestCheckoutButtonTitle","expressCheckoutButton","paymentExpress","ExpressCheckoutSectionWrapper","backToShoppingButton","backToShoppingButtonTitle","createTemplateFromCartButton","_displayAddCartToTemplate","SaveCartToOrderTemplateComponent","_generateAddToOrderTemplateDialogResources","linesAddedToOrderTemplateDialogResources","_generateLinesAddedToOrderTemplateDialogResources","_generateDuplicateItemsWhenAddingToOrderTemplateDialogResources","createOrderTemplateFromCartButton","createOrderTemplateFromCartButtonTooltip","checkoutBlockedDueToUnavailableFunds","storeSelector","waitingComponent","Waiting","cartLoadingStatus","cartLoadingErrorMessage","cartDataResult","isEmpty","OrderSummaryErrors","_getOrderSummaryErrors","_this$props$data$cart4","_cart$cart","showPromotionPopup","promotions","promotionLinkText","promotionPopupHeading","onCloseButtonClick","onSeeAllClick","titleId","promotionMessageWrapper","promotionMessage","promotionStringHeading","promotionSeeAllLink","promotionDialog","_promotion","_promotion$Promotion","Promotion","OfferName","cartPromotions","promotionCloseButtonAriaLabel","cartLineInventoryValidationResult","productIdWithErrors","productIdWithError","_element$data","outOfStockErrorMessage","allErrors","_cartline$data","_cartline$data$produc","fullError","line","Wrapper","assertive","outOfStockErrorMessageHeader","header","errors","InvoiceSummary","orderTotalLabel","totalAmountLabel","invoiceLabel","_this$props","_featureState$result2","channelConfiguration","retailMultiplePickUpOptionEnabled","isShowOrHideTaxEnabled","isEnableShowOrHideSalesTaxECommerceEnabled","OrderSummary","subTotalLabel","itemsWithCountLabel","shippingLabel","estimatedShippingLabel","otherChargeLabel","otherCharges","taxLabel","estimatedTaxLabel","orderTotal","totalDiscountsLabel","toBeCalculatedText","yetToBeCalculatedText","freeText","priceFree","isTaxIncludedInPrice","IsTaxIncludedInPrice","isShowTaxBreakup","PromoCodeComponent","promoCodeHeadingText","promoPlaceholderText","promoCodeApplyButtonText","appliedPromoCodeHeadingText","collapseTimeOut","removePromoText","invalidPromoCodeErrorText","failedToAddPromoCodeErrorText","failedToRemovePromoCodeErrorText","duplicatePromoCodeErrorText","duplicatePromotionErrorText","addToOrderTemplateHeader","noOrderTemplatesMessage","noOrderTemplatesDescription","createAnOrderTemplateButtonText","createNewOrderTemplateButtonText","cancelOrderTemplateCreationButtonText","selectTemplatesText","addToTemplateButtonText","lineItemsText","_generateItemAddedToOrderTemplateDialogResources","viewOrderTemplateButtonText","continueShoppingButtonText","itemAddedToOrderTemplateHeaderItemOneText","itemAddedToOrderTemplateHeaderItemFormatText","itemAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateHeaderItemsOneText","linesAddedToOrderTemplateHeaderItemsFormatText","linesAddedToOrderTemplateHeaderLinesOneText","linesAddedToOrderTemplateHeaderLinesFormatText","linesAddedToOrderTemplateHeaderMessageText","linesAddedToOrderTemplateCustomPriceAlertMessageText","duplicatedProductsHeader","duplicatedProductsDescription","updateQuantityButtonText","cancelDuplicateItemsButtonText","_this$props$data$feat2","_this$props$data$feat3","_this$props$data$cata","PickupDeliveryModeCode","modules","storeSelectorId","CartLineItems","productDeliveryOptions","updateMaxQuantityForCartLineItem","maxQuantityForCartLineItem","warehouseAggregation","sizeString","productDimensionTypeSize","colorString","productDimensionTypeColor","configString","productDimensionTypeConfiguration","styleString","productDimensionTypeStyle","amountString","productDimensionTypeAmount","quantityDisplayString","quantityDisplayText","inputQuantityAriaLabel","decrementButtonAriaLabel","incrementButtonAriaLabel","discountStringText","shippingChargesText","shippingCharges","salesAgreementPricePrompt","priceEditorResources","removeCartButtonText","shipInsteadDisplayText","pickItUpDisplayText","changeStoreDisplayText","errorMessageOutOfRangeOneLeft","errorMessageOutOfRangeFormat","showOutOfStockErrors","addToOrderTemplateMessage","addItemToOrderTemplateError","isAbsoluteUrl","urlCheck","returnURL","origin","AsyncResult","validateCartAsync","_featureStatuses$find2","featureStatuses","_featureStatuses$find","_cartConfiguration$Ig","cartConfiguration","IgnoreOrderSettings","_this$props$context","defaultOrderQuantityLimitsFeatureConfig","platform","enableDefaultOrderQuantityLimits","customerInfo","IsB2b","_featureStatuses$find3","isChannelLimitsFeatureEnabledInHq","_this$props$data$feat4","_featureState$result3","_this$props$data$chan","_this$props$data$cata2","_this$props$data$chan2","_this$props$data$cart5","cartLinesPickUpOptions","CONTENT","AddLineToTemplate","query","productCatalogs","Search","selectedProduct","selectedCatalogId","searchTextInput","addLineButtonRef","_renderSearchForm","searchButtonAriaLabel","searchModalPlaceholderText","selectCatalogTitleText","autoComplete","onSubmit","_onSearchSubmit","htmlFor","_onCatalogSelectionChange","_getCatalogNodes","placeholder","_onInputChange","maxLength","_get","Loading","_getSearchResults","NotFound","ProductList","_onQuantityChangeHandler","selectedQuantity","_onSelectItem","varianteInput","SelectedVariantInput","getSelectedVariant","dimensions","_getProductDimensions","selectedProductDimensions","ProductConfiguration","_onBackButtonClickHandler","_highlightSearchTerm","parsedName","unescape","dangerouslySetInnerHTML","__html","_resultCountText","searchResultsCountVerbage","searchResultsCountSubject","_addItemToTemplateHandler","orderTemplateId","AddItemToOrderTemplateInput","DefaultUnitOfMeasure","addItemToOrderTemplate","reloadPage","_toggleModalHandler","_getCatalogs","onComponentDidMount","_this$searchTextInput","onComponentDidUpdate","_this$searchTextInput2","addLineModalLinkText","backToResultsText","modalProps","showBackArrow","_renderContent","addToTemplateHandler","onQuantityChangeHandler","highlightSearchTerm","searchForm","productProps","clickHandler","renderResultCountText","notFoundSearchErrorNotice","notFoundSearchErrorRedediation","NotFoundComponent","searchErrorMessage","productCatalog","isSelected","selected","searchText","searchCriteriaInput","Context","ChannelId","IncludeAttributes","SearchCondition","searchByCriteriaAsync","getDimensionsForSelectedVariant","GetDimensionsForSelectedVariantInput","computed","Dropdown","selectMenu","_onChanged","selectedIndex","dropdownId","selectId","selectedValue","innerText","dropdownList","dropdownName","OrderTemplateQuantity","inputRef","_validateMin","minValue","min","isNaN","currentInput","currentCount","_handleChange","glyphMinusClassName","decrementGlyphClass","glyphPlusClassName","incrementGlyphClass","incDisabled","max","currentValue","extraClass","getChangeHandler","amount","_onIncrementalChange","updatedQuantity","e","inputElement","HTMLInputElement","_debounce","setAttribute","defaultProps","selectedDimensions","_getDimensionsError","dimensionName","dimensionMissingError","_addToTemplateHandler","isBusy","showAddConfirmation","missingDimensions","ProductListId","addToTemplateDuplicateError","addToTemplateGenericError","_onQuantityChange","newValue","totalPrice","_updateDimensionValue","productDimensionFull","newValueId","DimensionValues","_onDimensionChanged","_this$state$errors","remainingDimensionsErrors","selection","buttonDisabled","mappedDimensions","variantProduct","dimensionInput","variantDimensions","availabilityInput","ProductAvailabilitiesForSelectedVariantInput","newAvailableQuantity","getProductAvailabilitiesForSelectedVariant","priceInput","PriceForSelectedVariantInput","getPriceForSelectedVariant","productAvailableQuantity","unitPrice","sort","a","b","_getDropdownName","dimensionType","_getFallbackImageUrl","_product$Name2","addItemToTemplateText","addLineProductUnitPricePrefix","quantitySelectLabel","addLineProductUnitOfMeasurePrefix","totalPriceLabel","isMultipleCatalogSelect","_formatPrice","_getDimensionsNodes","_getConfirmationMessage","selectedDimensionNames","_dimension$DimensionV","addToTemplateConfirmation","values","_this$state$errors2","unshift","currencyCode","selectProductButtonText","_generateImageUrl","primaryImageSource","generateImageUrl","fallBackImg","ProductSelectButton","setBusy","getClickHandler","OrderTemplateBulkActions","isAddDisabled","isRemoveDisabled","addHandler","onAddSelectionToBag","removeHandler","onRemoveSelection","selectedLines","searchInputAriaLabel","backButtonText","addSelectedToBagButtonText","removeSelectedToBagButtonText","addLineProps","isMinifiedView","removeOrderActionHandler","_removeOrderTemplate","onRemoveTemplate","_getOrderTemplateAddToCartDialog","addTemplateToBagButtonText","AddOrderTemplateToCartComponent","_getOrderTemplateRenameControl","renameOrderTemplateDialogStrings","RenameOrderTemplateComponent","onRenameTemplate","renameOrderTemplateButtonText","renameTemplateButtonText","buttonEventReference","ActionsSplitButton","isStatementRequestAdminDropdownOpen","setIsStatementRequestAdminDropdownOpen","renameOrderTemplateDialogOpen","onToggleDropdown1","popoverReference","existingOrderTemplate","onOrderTemplateNameCancel","_buttonEventReference","requestStatementDropdownString","Random","Guid","generateGuid","innerRef","Popover","placement","OrderTemplateLineActions","orderTemplateLine","productListLine","onAddToBag","onRemoveItem","getAddToBag","fullProduct","ProductDetails","getRemoveItem","PopUp","removeFromOrderTemplateLinesText","moreButtonText","viewProductDetailsText","showMobile","setShowMobile","getActionButton","removeButtonClassName","addButtonClassName","getDesktopActionButton","onSelectLineHandler","isChecked","onSelect","ExtraActionsPopup","showActions","setShowActions","actionsContainerClassName","OrderTemplateMobileLineView","_context$request$app2","UnitOfMeasure","renderProductCatalog","_renderProductImage","renderProductInfo","_renderPrice","_generateQuantity","onChangeHandler","onChangeQuantity","isQuantityDisabledForUpdate","_context$request","isB2b","catalog","_renderProductError","OOS","outOfStockProductErrorMessage","UNASSORTED","unavailableProductErrorMessage","NONE","_orderTemplateLine$fu","_renderProductDimensions","productName","dimensionsLine","OrderTemplateLinesStatusMessage","OrderTemplateTableHeading","componentClassName","getOnChange","checkedLines","lines","scope","selectAllRowsText","productUnitPrice","productUOM","productActions","_onRemoveSelection","removeSelectedFailureMessage","removeSelectedSuccessMessage","productListLines","maxWaitTimeInMilliSeconds","removeProductListLinesAsync","_getOrderTemplatePageUrl","_this$props$data$orde","substr","_onAddSelectionToBag","productLine","_productLine$fullProd","_productLine$fullProd2","_productLine$fullProd3","_productLine$fullProd4","_productLine$productL","_addItemToBag","_getCurrentUrl","reqContext","onCloseHandler","isItemAddedToOrderTemplateOpen","_renderItemAddedToCartDialog","itemAddedToCartDialogData","ItemAddedToCartDialog","_generateItemAddedToCartDialogResources","onClose","_renderPagination","itemsPerPage","skipCount","_getCurrentPageNumber","totalLines","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_toggleDetailsDisplayed","_updateProductUrlCatalog","productDetails","isNullOrWhitespace","absoluteUrl","_changeQuantity","orderTemplateLinesData","orderTemplateLines","orderLineIndex","findIndex","newProductListLine","prevQuantity","_objectWithoutProperties","_excluded","updateProductListLinesAsync","list","newLine","updatedLines","updatedOrderTemplate","ProductListLines","update","ActiveOrderTemplateLinesInput","editOrderTemplateLineQuantityError","maxQuantityLimitText","addedToCartFailureMessage","addProductToCartInput","priceResult","reject","isMiniCart","substatus","_cart$result","_cart$result2","cartLineQuantity","defaultMessage","_result$errorDetails","_removeItemFromOrderTemplateLines","userToken","featureStates","getFeatureState","createGetFeatureStateInput","_featureStates$find","_renameTemplate","_removeTemplate","_orderTemplate$result","newLink","_getViewport","device","Type","paginationPreviousText","paginationNextText","_viewport","_updateViewport","isConfirmAddSelectionToBagModalOpen","emptyOrderTemplateLinesText","errorGettingOrderTemplateLines","orderTemplateResult","_isFirstPage","_renderOrderTemplateActions","_getOrderTemplateLineActions","_renderProductListHeader","_renderProductList","updateQuantity","debounce","updated","_product$fullProduct","_line$fullProduct","onSelectAll","productActionsText","headers","_generateLinesAddedToCartDialogResources","itemAddedToCartHeaderItemOneText","itemAddedToCartHeaderItemFormatText","itemAddedToCartHeaderMessageText","deleteTemplateButtonText","OrderTemplateActionsView","renameOrderTemplateTitleText","skip","selectOneRowText","addOrderTemplateItemToBagButtonText","removeItemFromOrderTemplateButtonText","deleteButtonText","_line$fullProduct2","_context$request$app","shouldDisable","OrderTemplateLineView","ProductPrice","observable","ProductCollection","handleHeadingChange","_getProductsDimensionsAvailabilities","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","validProducts","validValues","DimensionTypes","none","productsDimensionAvailabilities","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","DimensionSwatchDisplayTypes","initProductState","productPrices","productCollectionProducts","productCollection","equals","listType","getProductPriceForSelectedProducts","ProductPriceForSelectedProductsInput","_getProduct","_this$state$productsD","trace","allowBackNavigation","breaCrumbType","breadcrumbType","quickviewSlot","quickview","productComparisonButtonSlot","productComparisonButton","reviewCountAriaLabelValue","ratingCountAriaLabel","ratingCountAriaLabelSingleUser","priceRangeSeparator","ProductContainer","productComponent","quickViewButton","dimensionAvailabilities","dimensionAvailability","_product$MasterProduc","masterProductId","_getActivePrice","productsList","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSeeAllButton","headingLabel","recommendation","discountIds","searchPageLink","seeAllButtonText","enableAffiliationBasedPricing","shouldDisplaySeeAllButton","recommendationListId","isCarousel","layout","headingComponent","updatedProducts","getProductData","productCollectionViewProps","ProductCollectionContainer","GridComponentProps","seeAllButton","SearchState","SuggestionType","ProductListInventoryFilteringOptions","AutoSuggestInput","suggestionType","hitPrefix","hitSuffix","searchQuery","topResultsCount","_getAutoSuggest","autosuggest","_ctx$requestContext$a","productSearchCriteria","productListInventoryDisplay","HideOOS","inventoryRefinerValue","getInventorySortableRefinerValue","channelInventoryConfiguration","isInStock","ProductAvailabilitySortableAttributeRecordId","RefinerRecordId","DataTypeValue","AttributeDataType","TrueFalse","LeftValueBoundString","RightValueBoundString","UnitText","RowNumber","Count","RefinerSourceValue","ProductRefinerSource","Attribute","getInventoryConfigurationAsync","Refinement","searchCriteria","ProductSearchCriteria","HitPrefix","HitSuffix","searchSuggestions","getSearchSuggestionsAsync","Paging","Top","ImageUrl","AllSearchResults","autoSuggestPromises","CategorySuggestionsComponent","suggestions","autoSuggestProps","categorySuggestionHeading","_renderTitle","categoryAutoSuggestionHeading","shouldShowFullPath","splitValue","pop","_generateLink","_getHighlightedText","suggestion","_getCategoryLink","_categoryRefiners$Val","searchPageURL","searchQsp","searchRefiners","queryUrl","categoryRefiners","refiners","SourceValue","Category","refiner","Values","encodedRefiner","compressRefiners","formattedText","getRichTextHtml","compressedRefinerKeys","compressedRefiners","compressedRefiner","refinerKey","FormComponent","searchPlaceholder","hideSearchLabel","handleInputChange","maxChars","disableSubmitSearch","handleCancelSearchChange","ariaLabelCancel","ariaLabelSearch","ariaLabelSubmit","onInputChange","onInputChangeFunction","inputNode","submitBtnNode","cancelBtn","submitBtn","KeywordSuggestionsComponent","formattedLink","LabelComponent","searchLabelClass","searchLabelArialLabel","isSearchFormExpanded","searchtext","searchCollapsedLabel","ProductSuggestionsComponent","productSuggestionHeading","moduleType","productAutoSuggestionHeading","_item$Value","Value3","DecimalValue","_renderThumbnail","LiProduct","_getLiWrapper","AProduct","_getAWrapper","recid","_props$resources","waitTime","_isLoadingNode","loadingText","autoSuggestResultLoadingMessage","label","size","SpinnerSize","medium","labelPosition","_focusOutTarget","closest","_clearAutoSuggestState","_keyup","keyCode","Escape","formReference","autoSuggestResultDiv","searchState","defaultBasicSearchUrl","searchQueryStringParameter","createSearchStateInput","_handleInputChange","cancellabelDebounce","cancel","inputSuggestionType","_loadSuggestions","_handleSubmit","searchURL","_appendQueryParams","_handleCancelSearchChange","isInitialState","_handleCancelSearchFocused","route","_setAutoSuggestResultCount","autoSuggestResultScreenReaderDiv","ariaLiveRegion","suggestResultString","autoSuggestFoundMessage","emptyResultString","noAutoSuggestionMessage","searchKeywordSuggestClass","searchProductSuggestClass","searchCategorySuggestClass","autoSuggestAriaLabel","isLoadingAutoSuggest","searchInputMaxLength","searchFormClass","_initSuggestionTypes","_suggestions$AllSearc","_suggestions$AllSearc2","_suggestions$AllSearc3","cancelBtnAriaLabel","searchBtnAriaLabel","submitBtnAriaLabel","searchplaceholderText","shouldShowFullCategoryPath","keywordSuggestions","Keyword","None","productSuggestions","Product","categorySuggestions","_item$RefinerRecordId","AutoSuggestAriaLabel","AutoSuggestAriaLabelText","AutoSuggest","KeywordSuggest","ProductSuggest","CategorySuggest","SearchForm","FormWrapper","UlKeyword","UlProduct","UlCategory","form","autosuggestKeyword","autosuggestProduct","autosuggestCategory","handleCancelSearchFocused","isLoadingNode","suggestionTypes","suggestionTypeCriterion","unique","validSuggestions","loadSuggestionsRequestId","getSearchSuggestionsAction","_getSuggestionType","_getSearchRefiners","_getSearchSuggestions","_updateSearchRefiners","suggestionTypeItem","charAt","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","isRangeType","dataTypeValue","Decimal","isRangeTypeForInteger","Integer","isCustomRangeTypeIntegerSelected","selectedRefinementCriterion","parentProductRefinerHierarchy","DisplayTemplateValue","DisplayTemplate","Range","isSingleSelectRangeTypeIntegerSelected","productRefinerValue","findMatchingRefinementCriterion","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","parent","getIntegerRangeName","rangeValue","RightValueBoundLocalizedString","LeftValueBoundLocalizedString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","r","selectedCriterion","isSelecting","rangeStart","rangeEnd","Text","RefinerTypeValue","RefinerType","SingleSelect","child","matchingIndex","criterion","splice","ChoiceSummary","closeButtonGlyph","_onClick","clearAll","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","selectedChoices","channelInventoryConfigurationId","refinerHierarchy","choice","hierarchy","_rangeParentDisplay$","rangeParentDisplay","_getKeyForRefinerValue","rangeDisplayType","clearAllText","choiceAriaLabel","closeAriaLabel","selectedRefinersMap","clearAllAttributes","newIntRange","urlBuilder","_parent","choiceFormat","choiceRangeValueFormat","refinerValues","overallFormat","rangeFormat","refinerValueName","refinerName","filterValue","currency","ErrorMessage","FeatureSearchResultItem","productRecordId","featureSimilarDescriptionTitle","featureSimilarLooksTitle","img","Link","ModalToggle","modalNode","returnFocusRef","returnRef","onModalToggle","zIndex","modalHeaderNode","modalTitle","modalFooterNode","modalCloseButtonText","getInventoryLabel","inventoryAttribute","ProductSearchResultItems","inventoryLabel","swatchItemAriaLabel","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","initialMin","initialMax","maxValue","labels","sliderKeyString","sliderThumbs","validationErrorMin","validationErrorMax","touchedMin","touchedMax","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","maxLabel","placeholderTextMax","ariaAttributes","Slider","inForm","step","orientation","showLabels","showTooltip","onChangeEnd","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","touched","validationError","validationErrorRange","inputAsNum","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","_this$props$parentPro","_this$props$parentPro2","productCountAriaLabel","singleProductCountAriaLabel","refineItemAriaLabel","refineItemsAriaLabel","attrs","isSingleSelect","itemTypeClassName","Rating","_renderRating","productCount","refineMenuItemAriaLabel","shouldDisplayAsSwatch","_getShouldDisplayAsSwatch","hasColor","SwatchColorHexCode","hasImage","SwatchImageUrl","hasContentSwatch","_getRefinerUrl","_renderSwatch","checkIfShouldDisplayAsSwatch","_productRefinerValue$2","swatchItems","colorHexCode","SwatchComponent","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","hideCount","RangeRefineItemInput","_changeMinInputRange","_changeMaxInputRange","_applyCustom","invalidData","updateInputRangerProps","_isUndefined","trim","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","Collapse","timeout","_renderChildItems","_renderSingleMultiSelect","_renderRange","refinerValuesList","listItems","_getRangeType","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","SearchResultContainer","SearchResultContainer_1","sortByDropdownOptions","sortOptions","sortByOptionRelevanceDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionRatingDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","_pageType","pageType","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_updateVariantAvailability","includeAttributes","_updateListPageState","listPageState","_this$props$config$it","_this$props$config$it2","querySorting","sorting","decodeURIComponent","currentPageNumber","sortingCritera","Columns","pageSize","activeProducts","totalProductCount","activeFilters","hydrateRefinersFromUrl","featureProduct","_this$props$data$list","_this$props$data$list2","_this$props$data$list3","_this$props$data$list4","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","SearchResultModal","_modalToggleRef","_getCollectionTitle","collectionTitle","category","getFriendlyName","locale","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","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","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","getCurrentUrl","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandRefinersCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","isInventorySortableAttribute","inventoryAwareSortableAttributeId","isInventoryProductAttribute","InventoryProductAttributeRecordId","_getChoiceSummary","_this$props$data$refi","selectedRefiners","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$slots","_this$props$data$prod5","shouldAllowBackNavigation","breadCrumbType","shouldAllowBack","isPriceMinMaxFeatureState","notification","history","pushState","buildListPageUrl","_getSortColumnFromSelectedOption","transaction","searchConfiguration","mappedConfiguration","sortColumn","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","parseQueryParam","mappedSearchConfiguration","mappedSearchConfig","activeSortColumn","activeMappedConfig","ColumnName","IsDescending","_this$props$data$list6","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","pending","validationErrorNotNumber","validationErrorNotRange","nameTranslations","_nameTranslation","nameTranslation","Language","StoreOperationsDataActions","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r5","_this$props$context$r6","_this$props$context$r7","newListPageState","GetFullProductsByCollectionInput","Skip","Sorting","recordId","Recommendation","getCollectionProducts","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r8","_this$props$context$r9","refinerInput","RefinersByCollectionInput","getCollectionRefinersAction","_listPageState$result","_listPageState$result2","_this$props$context$r10","_this$props$data$list7","_this$props$data$list8","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","sortByOptions","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","FeatureSearchContainer","similarLookProduct","getAdditionalContentItems","additionalContentItemContainer","videoPlayerAdditionalContent","additionalContentItems","VideoPlayer","isMobileDevice","video","playAriaLabel","playLabel","pauseAriaLabel","pauseLabel","playingAriaLabel","playingLabel","pausedAriaLabel","pausedLabel","muteAriaLabel","muteLabel","unMuteAriaLabel","unMuteLabel","fullScreenAriaLabel","fullScreenLabel","exitFullScreenAriaLabel","exitFullScreenLabel","seekBarLabel","videoTimeDurationLabel","closedCaptionLabel","_video$_links","_getVideoDetailsHeading","_getVideoDetailsParagraph","_getVideoDetailsLinks","detailsContainerCTA","handleText","handleParagraph","handleLink","handleAdditionalLink","WishlistItemDimension","dimensionValue","WishListItemActions","onAddToCart","_renderAriaLabel","formattedPrice","productDimension","renderProductLink","productAttributes","productPageUrlWithSwatch","renderInventoryInformationLabel","inventoryCssName","WishlistItemAddToCartButtonComponent","isServiceItem","addItemAction","WishlistItemRemoveFromWishlistButtonComponent","removeFromWishlistText","removeItemAction","renderUnitOfMeasure","unitOfMeasure","unitOfMeasureDisplayType","WishlistItem","wishlistState","_props$product$Dimens","convertProductDimensionTypeToDimensionTypes","_getFullProductLink","productLink","productDimensions","entireProductLink","productAriaLabel","inventoryInformation","productStatusMessage","WishlistItemsStatusMessage","WishlistItems","_renderHeading","_addItemToCart","addedToCartSuccessMessage","invoiceInCartErrorMessage","productInventoryInformation","_getProductInventory","_product$Behavior$Min","getDeliveryOptionsAsync","validateQuantity","isQuantityValidationRequired","respectQuantityLimits","MinimumQuantity","_await$cart$cart","curQuantity","maxQtyLimitReachedMessage","_getInventoryValueMessage","_result$errorDetails2","isChannelQuantityLimitsFeatureEnabledInHq","isOrderQuantityLimitsFeatureEnabled","validateLimitsPerLine","ValidateDefaultOrderSettingsPerLine","_removeItemFromWishlist","noLongerLineExist","wishlistLineId","_getWishlistLineIdFromProductId","removeLinesAsync","commerceList","castCommerceList","_getProductsNoLongerExists","_removeNoLongerExistsLines","createGetByCustomerInput","getItemsInWishlists","ActiveWishlistInput","castSimpleProducts","isError","_inventoryLabel","_inventoryClassName","_isProductInStock","productResult","CommerceListLines","foundWishlistItem","commerceListLine","_castCommerceList$Com","noLongerExist","emptyWishlistText","wishlistErrorGettingWishlist","noLongerExitsWishlistItemText","Products","ProductDimensions","statusNotExistsMessage","_getProductNotExists","emptytext","noLongerExisttext","addToCartButtonText","currentProductProps","IsGiftCard","maxQuantityForLineItem","minInventory","productInventoryCollection","tempProducts","_config$modalFreeLabe","modalFreeLabel","verticalPosition","modalClassName","modalMainText","_renderCarousel","_renderProduct","_renderGrid","gridContainer","_getProductTiles","_props$config3","_props$data$featureSt","isViewItemTracked","setIsViewItemTracked","_props$config","_props$config2","trackViewItemList","createSearchResultModal","choiceSummary_element","isRecoSearchPage","createModalBody","renderSort","renderRefiner","submenu","renderCategoryHierarchy","dataObj","titleOvverride","currentCategory","_currentCategory$inde","renderTitle","displayTitle","renderPrefix","_props$context$action","_props$data$listPageS","_props$data$listPageS2","_data$categoryHierarc","_data$categoryHierarc2","_data$categoryHierarc3","_data$categoryHierarc4","_props$data$listPageS3","_props$data$listPageS4","_props$data$listPageS11","categoryH1Title","isSearchPage","refinerStatusCount","categoryUserPathString","concat","listName","getSearchPageString","getCategoryPageString","currentFilterCount","isFilterSeen","setIsFilterSeen","prevFilterCount","setPrevFilterCount","prevFilters","setPrevFilters","_props$data$listPageS5","_props$data$listPageS6","_props$data$listPageS10","_props$data$listPageS7","set1","Set","set2","difference","x","has","_props$data$listPageS8","uniqueString","currentFilter","trackClickFilter","_props$data$listPageS9","_document$getElements","_document$getElements2","introCtn","intro","appendChild","setPmProducts","initialTotalItems","reduce","t","totalProducts","tp","initialTotalPrice","qp","setTotalPrice","setTotalItems","pmCartMessage","setPmCartMessage","productSelectionSpaceText","openPmCart","setOpenPmCart","cookiePMset","updatePmCart","removeProductFromPmCart","totalNewProducts","_addToCart","_props$context","_props$context2","currentCartState","pickAndMixItems","productsInfo","_data$Id","dataPrice","parseFloat","trackAddVenchiMix","v","addPickAndMixListAsInfocodes_CAPAsync","_currentCartState$car","cartLinesToPatch","c","_c$ExtensionPropertie","_c$ExtensionPropertie2","cartLinesUpdated","commerceProperties","updateCartLines","updatedCartLinesObject","pmSuccessAddedToCartMessage","total","removeAllButtonText","pickAndMixCartTitle","keyName","_pmProducts$keyName","_pmProducts$keyName2","_pmProducts$keyName3","_pmProducts$keyName4","_pmProducts$keyName5","search_qParam","_window$dataLayer","_window$dataLayer$pus","dataLayer","call","eventCategory","eventAction","eventLabel","Row","fluid","Container","_props$slots","_props$data$products$","activeImageView","retrieveItems","renderModuleAttributes","pauseOnHover","ride","transitionType","hideFlipper","dismissEnabled","dismissCarouselAriaText","ariaLabelForDismissButton","_renderCartlines","cartEmptyText","_cartLine$cartlineId","renderCartLinesGroupHeader","pickUpText","shippingText","emailShippingText","titleSeparate","_cartLine$pickUpInSto4","groupTitle","renderCartLinesGroupTitle","_cartLine$pickUpInSto","_cartLine$pickUpInSto2","_cartLine$pickUpInSto3","_props$cart","_props$cart2","errorData","emailshippingText","emptyCartText","renderCartLinesGroup","_renderInvoiceSummarylines","invoiceSummaryLines","invoices","giftCard","loyalty","_renderOrderSummarylines","orderSummaryLines","subtotal","shipping","otherCharge","tax","totalDiscounts","_renderNoProduct","noProductToRenderText","renderTitleCount","_renderForm","_renderKeywordSuggestions","_renderProductSuggestions","_renderCategorySuggestions","renderThumbnailItem","GetThumbnailItemComponent","imageId","_props$context$app$co","_props$config$thumbna","_props$context$reques2","_props$callbackToggle","_props$callbackThumbn","handleKeyDown","playVideoTitleText","GetEmptyThumbnailItemComponent","_props$context$app$co2","_props$config$thumbna2","_props$context$reques3","renderThumbnails","displayOrder","getMediaGalleryItems","_item$videoData","videoThumbnail","RenderVideo","NewSingleSlideCarouselComponentProps","NewThumbnails","CartLineItemFunctions","renderProductDimensions","DimensionStrings","DiscountLines","discountLine","_discountLine$Effecti","EffectiveAmount","offerName","offerDescriptions","OfferDescription","currentLanguage","OfferId","isSalesLine","PeriodicDiscount","Percentage","hasShippingMethod","_channelDeliveryOptio","shippingChargeLines","ChargeLines","chargeLine","IsShipping","freightFee","chargeTotal","CalculatedAmount","priceComponent","_cartline$ChargeLines","chargeline","_props$data","destructDimensionStrings","renderDisountLines","renderInventoryLabel","renderShippingLabel","renderOtherCharges","prodAttribute","_generateErrorMessage","pmProductsVal","fieldVal","pmProductsInfo","pmProduct","info","PMname","PMqty","PMprice","qty","_generateQuantityandPrice","_cartLine$ExtensionPr","nodes","isItemGWPAddedAutomatically","prop","_prop$Value","isItemFree","TotalAmount","_props$data$product","isGiftCard","NetAmount","NetAmountWithoutTax","NetPrice","DiscountAmount","DiscountAmountWithoutTax","CatalogLabelComponent","EffectivePercentage","SalesAgreementLineRecordId","_props$primaryImageUr","renderSalesAgreementPrompt","productAttribute","imgeClassName","NetAmountWithAllInclusiveTax","GrossAmount","ExtendedPrice","salesAgreementLineId","IncrementalQuantity","CartLinePriceEditor","PromoCode","_onInputChangeHandler","promoCodeInputValue","canApply","_applyPromotion","appliedPromo","addPromoCode","_onSubmitHandler","_applyPromotionHandler","_removePromotion","code","removePromoCodes","promoCodes","_calculateDiscount","discountAmount","DiscountCode","DiscountCost","_renderAppliedPromoCode","Coupons","removePromotionHandler","promoCodTotalDiscount","coupon","ApplyPromoCode","isCollapseOpen","imageAltText","_context$app","propsContext","cartResult","cartVersion","shouldRetry","_validationResult$Val","validationResult","CartsDataActions","bypassCache","ValidationResultsByLineId","refreshError","validateError","cartLineToUpdate","isUsingDefaultOrderSettingsMax","_modifiedProduct$Beha2","modifiedProduct","newQuantity","updateLineResult","updateCartLineQuantity","InvoiceSummaryLine","cssLabel","_buildPaymentSummarySection","_computedLoyaltyAmount","checkoutState","loyaltyAmount","invoiceLines","invoiceLine","InvoiceAmount","InvoiceId","giftCardAmount","_computeGiftCardAmount","giftCardTotalValue","giftCardExtends","giftCardCounter","Balance","totalAmountAfterGiftCard","loyaltyLabel","giftcardLabel","OrderSummaryLine","_buildOrderSummarySection","getDeliveryMode","featureSate","pickupDeliveryMode","dM","SubtotalAmount","SubtotalAmountWithoutTax","TaxAmount","TaxOnNonShippingCharges","OtherChargeAmount","canShip","hasDeliveryMethod","getDeliveryConfiguration","deliveryModes","taxOnShippingCharge","TaxOnShippingCharge","shippingChargeAmount","ShippingChargeAmount","otherChargeAmount","taxOnNonShippingCharges","isTaxGreaterThanZero","otherChargeAmountTotal","subtotalAmountActual","customerAccountAmount","customerAccount","customerAccountLabel","warehouseId","targetWarehouseValue","InventoryLocationId","validateMediaLocationAsync","http","XMLHttpRequest","send","_unused","actionInput","MediaLocationsForSelectedVariantInput","getMediaLocationsForSelectedVariant","pairs","pair","_actionContext$reques","isPreview","commerceApiRequest","previewImageData","DisplayOrder","MediaTypeValue","_mediaLocation$Uri2","commerceVideoMetadataRequest","removeOrderTemplateActionHandler","_renderOrderTemplateImages","orderTemplateAriaLabel","_getUrlSync","onClickHandler","_line$productListLine","_line$fullProduct$Pro","_line$fullProduct$Pro2","_line$fullProduct3","_line$fullProduct4"],"sourceRoot":""}